sudo(8)

名前
sudo - 別のユーザとしてコマンドを実行する

書式
sudo -V | -h | -l | -L | -v | -k | -K | -s | [ -H ] [-S ] [ -b ] | [ -p prompt ] [ -c class|- ] [ -u username/#uid ] command

説明
sudo は、許可されたユーザに対して、 スーパーユーザや別のユーザの権限でコマンドを実行することを許す。 この指定は sudoers ファイルでなされる。 実ユーザ ID・グループ ID と実効ユーザ ID・グループ ID は、 成り代わるユーザのものと置き換えられる。 passwd ファイルでの指定が用いられる。 (成り代わるユーザが root でない場合、 ユーザの入っているグループも初期化される)。 デフォルトでは、sudo はパスワードを使った 自分自身に対する認証が必要とする (注意：このときのパスワードは そのユーザのパスワードであり、root パスワードではない)。 一度ユーザが認証されると、タイムスタンプが更新され、 短い期間 (デフォルトでは 5 分間) パスワードなしで sudo を使うことができる。

sudo は、権限のあるユーザが誰かを /etc/sudoers ファイルによって決定する。 sudo に -v フラグをつけて実行すると、 コマンド を実行することなく、タイムスタンプを更新できる。 パスワードプロンプト自身も、ユーザのパスワードが N 分間入力されないと タイムアウトする (もう一度言うが、この時間は (コンパイルの) 設定時に定義され、 デフォルトでは 5 分である)。

sudoers ファイルに記載されていないユーザが sudo を使ってコマンドを実行すると、 誰か偉い人にメールが送られる。 偉い人を誰にするかは (コンパイルの) 設定時に定義される (デフォルトでは root) 。 権限のないユーザが -l または -v フラグをつけて sudo を実行した場合は、メールが送られないことに注意すること。 これにより、ユーザは自分が sudo が使用可能であるかを 自分自身で調べることができる。

sudo は成功した命令・失敗した命令の両方を (あるいはエラーも)、 syslog(3) やログファイル (あるいはその両方) に記録できる。 デフォルトでは sudo は syslog(3) を使ってログをとるが、 コンパイルの設定時に変更できる。

オプション
sudo は、以下のコマンドラインオプションを受け付ける。 -V (version) オプションが指定されると、 sudo はバージョン番号を表示して終了する。 -l (list) オプションが指定されると、 そのユーザ対して現在のホスト上で許可された (禁止された) コマンドがリストされる。 -L (list defaults) オプションが指定されると、 Defaults 行に設定できるパラメータが短い説明をつけてリストされる。 このオプションは、grep(1) と一緒に使うと便利である。 -h (help) オプションが指定されると、 sudo は使用法のメッセージを表示して終了する。 -v (validate) オプションが指定されると、 sudo はユーザのタイムスタンプを更新する。 必要ならば、ユーザのパスワードを問い合わせるプロンプトを出す。 このオプションは、コマンドを実行することなく、 sudo のタイムアウトを更に N 分間延長する (N はインストール時に定義され、デフォルトは 5 分である)。 -k (kill) オプションが指定されると、 sudo は有効期間を紀元年 (epoch) に設定することで、 ユーザのタイムスタンプを無効にする。 次回 sudo を実行するときは、パスワードが必要とされる。 このオプションにはパスワードが必要ない。 ユーザが .logout ファイルで sudo 権限を 取り消すことができるように追加された。 -K (sure kill) オプションが指定されると、 sudo は ユーザのタイムスタンプを完全に削除する。 このオプションにはパスワードが必要ない。 -b (background) オプションが指定されると、 sudo は指定されたコマンドをバックグラウンドで実行する。 -b を使った場合、コマンドの操作に シェルのジョブ制御を使うことができない点に注意すること。 -p (prompt) オプションが指定されると、 デフォルトのパスワードプロンプトを上書きして、 カスタム化したものを使うことが可能になる。 プロンプトに %u エスケープがある場合、 %u はユーザのログイン名に置き換えられる。 同様に、%h はローカルホスト名に置き換えられる。 -c (class) オプションが指定されると、 sudo は指定されたコマンドを ログインクラスで指定されたリソースの制限内で実行する。 引き数 class には、/etc/login.conf で定義されているクラス名を指定するか、 あるいは 1 個の '-' 文字を指定することができる。 class を '-' に指定すると、 コマンドは、そのコマンドを実行されたユーザの デフォルトのログイン権限によって制限を受ける。 引き数 class が存在しているユーザクラスを指定している場合、 コマンドは root として実行されなければならない (もしくは sudo コマンドを既に root になっているシェルから 実行しなければならない)。 このオプションは、BSD ログインクラスのあるシステムでのみ有効で、 かつ sudo に --with-logincap オプションが設定されていることが必要である。 -u (user) オプションが指定されると、 sudo は root 以外のユーザとして指定したコマンドを実行する。 username でなく uid を指定する場合は、"#uid" を使うこと。 -s (shell) オプションが指定されると、 環境変数 SHELL が設定されている場合は、そのシェルを実行する。 さもなければ、passwd(5) で指定されているシェルを実行する。 -H (HOME) オプションが指定されると、 環境変数 HOME が passwd(5) で指定された 対象ユーザ (デフォルトでは root) のホームディレクトリに設定される。 デフォルトでは、sudo は HOME を変更しない。 -S (stdin) オプションが指定されると、 sudo は端末デバイスではなく標準入力からパスワードを読む。 -- オプションは、sudo がコマンドライン引き数の 処理を終了することを示している。 +-s オプションと一緒に使うと、とても便利である。

返り値
設定やアクセス権の問題があった場合、 もしくは、sudo が指定されたコマンドを実行できなかった場合、 sudo は終了値 1 で終了する。 後者の場合は、エラー文字列が標準エラーに表示される。 sudo がユーザの PATH のエントリのどれかを stat(2) できない場合、エラーが標準エラーに表示される (ディレクトリが存在しない場合、またはエントリが実際のディレクトリでない場合は、 エントリは無視され、エラーは表示されない)。 これは通常の環境では起こらない。 stat(2) が "permission denied" を返す最も一般的な理由は、 automounter を稼働させているときに、 PATH にあるディレクトリのどれかが 現在アクセスできない計算機上にあるというケースである。

セキュリティ上の注意
sudo は外部コマンドを実行する場合、安全であるように努める。 動的ロードや動的バインドを制御する環境変数を使って、 sudo が実行するプログラムの安全性を下げようとすることができる。 これに対抗するため、環境変数 LD_*, _RLD_*, SHLIB_PATH (HP-UX のみ), LIBPATH (AIX のみ) は、 実行されるコマンドに渡される環境変数からは、いかなる場合も削除される。 sudo は、環境変数 IFS, ENV, BASH_ENV, KRB_CONF, KRB5_CONFIG, LOCALDOMAIN, RES_OPTIONS, HOSTALIASES も同様な脅威を引き起こすので削除する。

コマンドスプーフィング (だましコマンド) を阻止するため、 ユーザの PATH でコマンドを検索するときに、 sudo は (カレントディレクトリを意味する) "." と "" (のいずれかもしくは両方が PATH にあるかどうか) を最後にチェックする。 しかし、実際の環境変数 PATH は修正されず、 そのまま sudo が実行するプログラムに渡されることに注意すること。

使用している OS が共有ライブラリをサポートしているのに、 setuid プログラムに対して ユーザ定義のライブラリ検索パスを許している場合 (ほとんどはそうである)、セキュリティのため、 これを許さないようにするリンカオプションを使うか、 sudo を静的にリンクすべきである。

sudo はタイムスタンプディレクトリ (デフォルトでは /var/run/sudo) の所有者をチェックし、 所有者が root で、かつ root のみの書き込み属性でない場合、 ディレクトリの中身を無視する。 root 以外のユーザでも chown(2) を使って 自分のファイルを他人に渡せるようなシステムでは、 タイムスタンプディレクトリが全てのユーザに書き込み可能なディレクトリ (例えば、/tmp) である場合、 ユーザが sudo の実行前にタイムスタンプディレクトリを作成できてしまう。 しかし sudo はディレクトリと中身の所有者とアクセス権をチェックするので、 受けるダメージとしては "隠し" ファイルを タイムスタンプディレクトリに入れられるだけである。 タイムスタンプディレクトリを root の所有にして、 他のユーザからはアクセス不可能としてしまえば、 そこにファイルを置いたユーザはファイルを取り出せなくなるので、 こういったことは起こりづらい。 この問題を避けるには、全てのユーザからは書き込めないディレクトリ (例えば、/var/adm/sudo) をタイムスタンプディレクトリとして使うか、 システムのスタートアップファイルで /var/run/sudo を 適切な所有者 (root)とアクセス権 (0700) で作成すればよい。

sudo は、遠い未来の時刻になっているタイムスタンプのセットを受け付けない。 current_time + 2 * TIMEOUT より先の時刻になっている タイムスタンプは無視され、sudo はログに記録を残して警告を出す。 これにより、ユーザによるファイル譲渡が可能なシステム上で、 ユーザが偽の日付でタイムスタンプを作成するのを防ぐ。

例
注意：以下の例は、適切な sudoers(5) エントリがあることを仮定している。

読み込み不可のディレクトリのファイルリストを取得する。

 % sudo ls /usr/local/protected
~yazza の存在するファイルシステムが root でエクスポートされていないマシン上で、 ユーザ yazza のホームディレクトリの中身をリストする。

 % sudo -u yazza ls ~yazza
ファイル index.html をユーザ www として編集する。

 % sudo -u www vi ~www/htdocs/index.html
マシンをシャットダウンする。

 % sudo shutdown -r +15 "quick reboot"
/home パーティションにあるディレクトリのディスク使用量リストを作成する。 cd とファイルリダイレクションが動作するように、 サブシェルでコマンドを実行している点に注意すること。

 % sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"

環境変数
sudo は、以下の環境変数を使用する。

 PATH                   SECURE_PATH が設定されていると
                        安全な値に設定される。
 SHELL                  -s オプションで実行するシェルを決定するために
                        使われる。
 USER                   対象となるユーザを設定する
                        (-u オプションで指定されない限り root)。
 HOME                   -s または -H オプション (または、sudo に
                        --enable-shell-sets-home オプションが
                        設定されていた) 場合に、対象ユーザの
                        ホームディレクトリを設定する。
 SUDO_PROMPT            デフォルトのパスワードプロンプトとして使われる。
 SUDO_COMMAND           sudo の実行するコマンドに設定される。
 SUDO_USER              sudo を起動したユーザのログイン名に設定される。
 SUDO_UID               sudo を起動したユーザのユーザ ID に設定される。
 SUDO_GID               sudo を起動したユーザのグループ ID に設定される。
 SUDO_PS1               この変数が設定されている場合、
                        PS1 がこの変数の値に設定される。

ファイル

 /etc/sudoers           誰が何を可能であるかのリスト。
 /var/run/sudo          タイムスタンプの含まれるディレクトリ。

著者
多くの人々が長年に渡り sudo の製作に携わってきた。 このバージョンには、最初に

        Todd Miller
        Chris Jepeway
によって書かれたコードが含まれている。 sudo の簡単な履歴については、 sudo ディストリビューションの HISTORY ファイルを参照すること。

バグ
sudo のバグを発見したと思った場合は、 http://www.courtesan.com/sudo/bugs/ にバグの報告を送って下さい。

放棄宣言
Sudo is provided ``AS IS'' and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. See the LICENSE file distributed with sudo for complete details.

警告
ユーザがシェルエスケープの可能なコマンドにアクセスできる場合、 ユーザに root のシェルを入手させないための簡単な方法はない。

ユーザに sudo ALL の権限がある場合、 そのユーザの設定に '!' 指定をしても、 自分でプログラムを書けば root シェルを入手できてしまう。 これを防ぐ簡単な方法はない。

シェルスクリプトを sudo で実行すると、 カーネルのバグを突いてしまい、 OS によっては setuid シェルスクリプトを危険なものにしてしまうかもしれない (使用している OS が /dev/fd/ ディレクトリをサポートしている場合、 setuid シェルスクリプトは一般的に安全である)。

関連項目
login_cap(3), sudoers(5), visudo(8), su(1).