kazmax - Linux で自宅サーバー

sudo - システム管理コマンドの説明 - Linux コマンド集 一覧表

  1. 名前
  2. 書式
  3. 説明
  4. オプション
  5. 返り値
  6. セキュリティ上の注意
  7. 環境変数
  8. ファイル
  9. 著者
  10. バグ
  11. 放棄宣言
  12. 警告
  13. 関連項目

名前

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

書式

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

説明

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

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

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

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

オプション

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

返り値

プログラムが正常に実行されると、 sudo の返り値は単純に実行されたプログラムの返り値になる。

設定やアクセス権の問題があった場合、もしくは、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, KRB- CONFDIR, KRBTKFILE, KRB5_CONFIG, LOCALDOMAIN, RES_OPTIONS, HOSTALIASES, NLSPATH, PATH_LOCALE, TERMINFO, TERMINFO_DIRS, TERMPATH も同様 な脅威を引き起こすので削除する。 TERMCAP にパス名が設定されている場合も無視される。さらに LC_*, LANGUAGE 変数に /, % 文字が含まれてい る場合も無視される。 sudo が SecurID をサポートするようにコンパイルされている場合、 VAR_ACE, USR_ACE, DLC_ACE 変数も削除される。 sudo が削除する環境変数のリストは、 root で sudo -V を実行したときに表示される。

コマンドスプーフィング (だましコマンド) を阻止するため、ユーザの 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 はログに記録を残して警告を出す。これにより、ユーザによるファイル譲渡が可能なシステム上で、ユーザが偽の日付でタ イムスタンプを作成するのを防ぐ。

sudo は明示的に実行されたコマンドしかログに記録しない点に注意すること。ユーザが sudo su や sudo sh といったコマンドを実行した場合、シ ェルでそれ以降に実行されたコマンドはログに記録されず、 sudo のアクセス制御も効かない。これはシェルエスケープを提供するコマンド (多くの エディタも含まれる) でも同じである。そのため、sudo を介してユーザがコマンドへアクセスするのを許可する場合は、有効な root のシェルをそ のコマンドでうっかり与えてしまわないように注意しなければならない。

注意: 以下の例は、適切な 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 パーティションにあるディレクトリのディスク使用量リストを作成する。 (C`cd(C' とファイルリダイレクションが動作するように、 サブシェルでコマンドを実行している点に注意すること。

% 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 ディストリビューションの -1HISTORY0 ファイルを参照するか、 http://www.sudo.ws/sudo/history.html を参照すること。

バグ

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

放棄宣言

Sudo is provided ``-1AS0 -1IS0'' 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 -1LICENSE0 file distributed with sudo for complete details.

警告

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

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

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

関連項目

stat (2), login_cap (3), sudoers (5), passwd (5), visudo (8), grep (1), su (1).