名前
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 ファイルで変更できる。
オプション
sudo は、以下のコマンドラインオプションを受け付ける:
-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 のみ) は、 実行されるコマンドに渡される環境変数からは、いかなる場合も削除される。 \fBsudo\fR は、環境変数
IFS,
ENV,
BASH_ENV,
KRB_CONF,
KRBCONFDIR,
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 パーティションにあるディレクトリのディスク使用量リストを作成する。
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 ファイルを参照するか、 http://www.sudo.ws/sudo/history.html を参照すること。
バグ
sudo のバグを発見したと思った場合は、 http://www.sudo.ws/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 シェルスクリプトは一般的に安全である)。
関連項目
stat(2), login_cap(3), sudoers(5), passwd(5), visudo(8), grep(1), su(1).