BSD界隈四方山話

第25回OpenBSD 5.8登場 - sudo(8)を廃止してdoas(1)を導入

OpenBSD 5.8登場

2015年10月18日、OpenBSDの最新版となるOpenBSD 5.8が公開されました。今回のリリースは20年目のリリースとされており、記念すべきリリースとされています。OpenBSDのプロジェクトサイトのトップページには「Only two remote holes in the default install, in a heck of a long time!」のコメント。デフォルトインストールでのリモートホールはたったの2つしかなかったとセキュリティに対する関心の高さがうかがえます。

OpenBSD 5.8は全体に渡って新機能の追加やサードパーティ製ソフトウェアのアップデートなどが実施されたバージョンです。そうした新機能の中でも小さな変更になりますが、次の変更が目を惹きます。

ユーザランドからsudo(8)を削除し、かわりにdoas(1)と呼ばれるコマンドを導入したというものです。OpenBSD 5.7とOpenBSD 5.8を比較すると、次のようにOpenBSD 5.8からsudo(8)が削除されていること、新しくdoas(1)が導入されていることを確認できます。

図1 OpenBSD 5.7のユーザランドにはsudo(8)
# uname -a
OpenBSD trybsd.ongs.co.jp 5.7 GENERIC#825 amd64
# which sudo
/usr/bin/sudo
# which doas
which: doas: Command not found.
#
図2 OpenBSD 5.8のユーザランドにはdoas(1)
# uname -a
OpenBSD openbsd.ongs.co.jp 5.8 GENERIC#1170 amd64
# which sudo
which: sudo: Command not found.
# which doas
/usr/bin/doas
#

どういった経緯でsudo(8)が廃止され、doas(1)が導入されたのか追ってみましょう。

sudo(8)廃止とdoas(1)導入の経緯

doas(1)の開発はOpenBSDコミッタのTed Unangst氏が行っています。Ted Unangst氏が投函したとみられる記事doas - dedicated openbsd application subexecutorにいきさつが書いてありますので、ほぼこの内容がそのまま経緯ということなのでしょう。

Ted Unangst氏はsudo(8)のデフォルト設定に関してある問題を感じていたとしています。まず、sudo(8)を利用したいと考えるシステム管理者には次の2種類がいるだろうと説明します。

  1. パーミッションやチェックなどを細かく実施し、入念に考慮されたシステム管理インフラを構築したい
  2. 追加でパスワードを覚えることなくrootのシェルが得られればよい

Ted Unangst氏は後者であるものの、OpenBSDに同梱しているデフォルトの設定ファイルを2)のほうに振れば1)にとっては好ましくないものになりますし、1)に振れば2)にとっては面倒なデフォルト設定ということになります。

当初はこれは個人的な考えだからということでコミットすることはなかったといいますが、他にも賛同者がいたことや、次のような理由もあって、最終的にベースシステムからsudo(8)を排除しdoas(1)を導入することにしたとされています。

  • root権限で動作するにはsudo(1)はプログラムが大きすぎる。OpenBSDのベースシステムに導入されているsetuidされたプログラムと比較して5倍以上に大きい
  • ベースシステムに導入するソフトウェアは多機能すぎるのはよくない

doas(1)は指定したコマンドを指定したユーザで実行するというシンプルな機能だけを提供しています。設定ファイルは/etc/doas.confです。もちろん、sudo(8)はパッケージやport経由でインストールできますので、sudo(8)が必要な場合でもインストールすれば従来のように利用できます。

OpenBSD 5.8をセットアップ

OpenBSD 5.8の環境をセットアップしてdoas(1)を使ってみましょう。第23回でFreeBSD bhyveでOpenBSDを利用する方法を取り上げましたので、そのあたりを参考にしながらインストールしてもらえればと思います。

図3 OpenBSD 5.8実行例
図3 OpenBSD 5.8実行例
図4 OpenBSD 5.8実行例
図4 OpenBSD 5.8実行例

OpenBSD 5.8をインストールしたあとは一般ユーザのアカウントを作成しておきます。次のようにadduser(8)コマンドを実行して追加すればよいでしょう。

図5 adduser(8)コマンドで一般ユーザを追加
# adduser
Couldn't find /etc/adduser.conf: creating a new adduser configuration file
Reading /etc/shells
Enter your default shell: csh ksh nologin sh [ksh]:
Your default shell is: ksh -> /bin/ksh
Default login class: authpf bgpd daemon default pbuild staff unbound
[default]:
Enter your default HOME partition: [/home]:
Copy dotfiles from: /etc/skel no [/etc/skel]:
Send welcome message?: /path/file default no [no]:
Do not send message(s)
Prompt for passwords by default (y/n) [y]:
Default encryption method for passwords: auto blowfish [auto]:
Use option ``-silent'' if you don't want to see all warnings and questions.

Reading /etc/shells
Check /etc/master.passwd
Check /etc/group

Ok, let's go.
Don't worry about mistakes. There will be a chance later to correct any input.
Enter username []: daichi
Enter full name []: Daichi GOTO
Enter shell csh ksh nologin sh [ksh]:
Uid [1000]:
Login group daichi [daichi]:
Login group is ``daichi''. Invite daichi into other groups: guest no
[no]: wheel
Login class authpf bgpd daemon default pbuild staff unbound
[default]:
Enter password []:
Enter password again []:

Name:        daichi
Password:    ****
Fullname:    Daichi GOTO
Uid:         1000
Gid:         1000 (daichi)
Groups:      daichi wheel
Login Class: default
HOME:        /home/daichi
Shell:       /bin/ksh
OK? (y/n) [y]: y
Added user ``daichi''
Copy files from /etc/skel to /home/daichi
Add another user? (y/n) [y]: n
Goodbye!
#

ユーザを追加するときのシェルがkshになっていますが、これはOpenBSDのデフォルトシェルがkshだからです。

図6 i-node番号が同じ - OpenBSDでは/bin/shの実体は/bin/ksh
# ls -il /bin/sh
51988 -r-xr-xr-x  3 root  bin  479920 Aug 16 17:19 /bin/sh
# ls -il /bin/ksh
51988 -r-xr-xr-x  3 root  bin  479920 Aug 16 17:19 /bin/ksh
#

OpenBSDにマージされているkshはパブリックドメインで提供されているkshです。kshはシェルスクリプト向けの/bin/shとインタラクティブシェルの双方の機能を取り込んだようなシェルで、さらにbashやzshと比べて軽量で高速という特徴があります。高機能なインタラクティブシェルほどは機能を持っていませんが、双方の良いとこ取りをしたようなバランスを持っています。

使ってみようdoas(1)

su(1)コマンドをパスワードの入力なく利用できるようにする設定は次のようになります。設定のサンプルやルールに関してはdoas.conf(5)に設定がまとまっていますので、詳しくはそちらをご覧ください。

リスト1 su(1)コマンドをパスワード入力不要で許可する設定
permit nopass daichi as root cmd su
図7 doas(1)を使うとパスワード入力が不要になっている
OpenBSD/amd64 (openbsd.ongs.co.jp) (tty00)

login: daichi
Password:
Last login: Mon Oct 19 23:54:48 on tty00
OpenBSD 5.8 (GENERIC) #1170: Sun Aug 16 02:26:00 MDT 2015

Welcome to OpenBSD: The proactively secure Unix-like operating system.

Please use the sendbug(1) utility to report bugs in the system.
Before reporting a bug, please try to reproduce it with the latest
version of the code.  With bug reports, please try to ensure that
enough information to reproduce the problem is enclosed, and if a
known fix for it exists, include that as well.

$ su -l
Password:		← rootのパスワード入力求められる
Sorry
$ su -l
Password:
# exit
$ doas su -l		← パスワード不要で実行可能
# exit
$

ちょっと設定を変えて、先ほどの設定を次のように変更します。これでsu(1)コマンドを実行するためにユーザ自身のパスワードの入力が必要になります。

リスト2 su(1)コマンドをユーザのパスワード入力で許可する設定
permit daichi as root cmd su
図8 su(1)実行時に自分のパスワードが求められる
$ doas su -l
Password: ← 自分のパスワード求められる
#

doas(1)はパーサとヘッダを合わせてもソースコードが780行ほどしかありません。sudo(8)はCのコードとヘッダだけでも10,000行を超えていますので、sudo(8)と比較するとOpenBSD向けに必要な機能がだけが実装されたものであることがわかります。

よりシンプルで安全なものをデフォルトに

doas(1)に限らず、OpenBSDプロジェクトはこれまで似たような理由でユーザランドにマージしてきたサードパーティ製のソフトウェアを廃止し、自分たちで開発したソフトウェアへの切り替えを行っています。理由は冒頭に取り上げたとおりですが、簡単にまとめておくと次のようなことが理由になっていることが多いようです。

  • セキュアとはいえないため、自分達で開発した方がセキュアだと判断した
  • ソースコードが複雑になってきて見通しが悪くなったので、よりシンプルなものを開発することにした
  • 利用しない不要な機能のソースコードなども含まれておりデフォルトでベースに入れることが適切とは言えなくなった
  • BSDライセンスのもとで提供されていないので、BSDライセンス版を開発することにした

OpenBSDプロジェクトで開発されるソフトウェアはFreeBSDやNetBSDにも移植されることも多いです。doas(1)は興味深いコマンドですし、ソースコードの短さからいっても導入しやすいソフトウェアではないかと思います。

おすすめ記事

記事・ニュース一覧