Provided by: manpages-ja_0.5.0.0.20131015+dfsg-2_all 

名前
sudoers - デフォルトの sudo 用セキュリティ・ポリシー・モジュール
説明
sudoers ポリシー・モジュールは、デフォルトの sudo 用ポリシー・プラグインであり、このモジュールによって
ユーザがどんな sudo 権限を持っているかの判定が行われる。ポリシーの運用は /etc/sudoers ファイルによって行
われるが、 LDAP を使用することも可能である。ポリシーを設定するときの書式は、 「SUDOERS ファイルの書式」セ
クションで詳しく説明している。 sudoers ポリシーの情報を LDAP に格納することについては、 sudoers.ldap(5)
をご覧になるとよい。
認証とロギング
sudoers セキュリティ・ポリシーでは、ユーザはたいていの場合、 sudo を使用できるようになる前に、本人である
ことを証明する必要がある。ただし、 sudo を実行するユーザが root だったり、変身対象ユーザが sudo を実行す
るユーザと同一であったり、 ポリシーによってそのユーザやコマンドに対する認証が免除されている場合は、 パス
ワードは要求されない。su(1) とは違って、 sudoers ポリシーによる認証でチェックされるのは、 sudo を実行す
るユーザの認証情報 (訳注: 通常はパスワード) であって、変身対象ユーザの (あるいは、root の) 認証情報ではな
い。 この動作は、後述する rootpw, targetpw, runaspw フラグによって変更することができる。
ポリシーに登録されていないユーザが sudo を使ってコマンドを実行しようとすると、しかるべき権威者にメールが
送付される。 そうしたメールの宛先は、 後述する「デフォルト設定」の mailto によって設定できるが、 デフォル
トでは root になっている。
sudo を使用する権限のないユーザが、-l や -v オプションを付けて sudo の実行を試みても、 メールは送付されな
いことに注意してほしい。これによって、 自分が sudo を使用できるかどうか、 ユーザが自分で判断できるように
なっているのである。
sudo が root によって実行されたとき、環境変数 SUDO_USER が設定されていると、 sudoers ポリシーは実際のユー
ザが誰かを判定するのに、 その値を使用する。ユーザとしては、この動作を利用することで、 すでに root シェル
が起動されている場合でも、 自分が sudo を介して実行したコマンドのログを取ることができる。 また、この動作
のおかげで、 sudo で実行したスクリプトやプログラムから呼び出される場合でさえ、 -e オプションが役に立つも
のになっている。とは言え、そうした場合でも、 sudoers の参照はやはり root に対してなされるのであって、
SUDO_USER が指定しているユーザに対してではないことに気をつけてほしい。
sudoers は認証情報の一時保存 (credential caching) のために タイムスタンプ・ファイルを使用する。ユーザの認
証が済むと、 タイムスタンプが更新され、ユーザはしばらくの間 (timeout オプションによって変更されていなけれ
ば、5 分間) パスワードなしで sudo を使うことができる。デフォルトでは、 sudoers は tty ごとのタイムスタン
プを使用する。すなわち、 ユーザの各ログイン・セッションごとに別のタイムスタンプが存在するわけだ。
tty_tickets オプションを無効にすれば、 あるユーザのすべてのセッションに対して、 単一のタイムスタンプの使
用を強制することができる。
sudoers は sudo の実行が成功したときも失敗したときも、 その事実を (エラー内容とともに) syslog(3) や 独自
のログファイル、 あるいはその両方に記録することができる。sudoers はデフォルトでは、 syslog(3) 経由でログ
を記録することになっているが、 この動作はデフォルト設定の syslog と logfile を使って変更することが可能
だ。
sudoers はコマンドの入出力ストリームのロギングもサポートしている。 入出力ロギングは、デフォルトでは ON に
なっていないが、デフォルト設定の log_input や log_output フラグを使って有効にすることができる。 コマン
ド・タグの LOG_INPUT や LOG_OUTPUT を使って有効にすることも可能だ。
コマンド環境
環境変数はプログラムの動作に影響を与えることがあるので、sudoers は、 実行されるコマンドがユーザの環境から
どんな変数を引き継ぐかについて、 制御する手段を用意している。すなわち、sudoers は二つの異なった方法で、
環境変数を処理することができる。
デフォルトでは env_reset オプションが有効になっている。 この場合、コマンドは最小限の環境で実行されること
になるが、その環境には、 TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME、 及び SUDO_* という変
数、 それに、呼び出し側のプロセスから来た変数で、env_check や env_keep オプションによって許可されたものが
含まれている。 これは、言わば、環境変数のホワイトリストである。
これに対して、env_reset オプションが無効になっている場合は、 env_check や env_delete オプションによって明
示的に拒否されていないかぎり、 いかなる環境変数も呼び出し側のプロセスから継承される。この場合、 env_check
や env_delete はブラックリストのように振舞うわけだ。 危険性のある環境変数のすべてをブラックリストに載せる
ことは不可能なので、 env_reset を有効にしておくデフォルトの動作を採用することをお勧めする。
どんな場合でも、値が () で始まる変数は除去されるが、 それは bash の関数として解釈される恐れがあるからであ
る。 sudo が許可、または拒否する環境変数のリストは、 sudo -V を root の資格で実行したときの出力中に表示さ
れる。
たいていのオペレーティングシステムのダイナミック・リンカは、 ダイナミック・リンキングを制御する働きがある
環境変数を、sudo もその一つである setuid プログラムの環境から除去するようになっていることに注意してほし
い。 オペレーティングシステムによって名前は様々だが、 _RLD*, DYLD_*, LD_*, LDR_*, LIBPATH, SHLIB_PATH な
どが、この範疇に含まれるだろう。 こうした変数は、sudo の実行が始まるよりも前に、環境から除去されるので、
sudo がそうした変数を保持することは不可能である。
特例として、sudo に -i オプション (initial login) が指定されている場合は、sudoers は env_reset の有効・無
効にかかわらず、環境を初期化する。 環境変数 DISPLAY, PATH, TERM は変更されないが、HOME, MAIL, SHELL,
USER, LOGNAME は、 変身対象ユーザのそれにセットされるのである。Linux や AIX システムでは、
/etc/environment の内容も取り込まれる。 それ以外の環境変数はすべて捨てられる。
最後に。env_file が設定されている場合は、 そのファイルに記載されたいかなる変数も、そこで指定されている値
にセットされることになる。
SUDOERS ファイルの書式
sudoers ファイルは二種類のエントリから構成されている。 (要するに変数である) エイリアスと (誰が何を実行で
きるかを指定している) ユーザ設定だ。
[訳注]: 訳者としては、「エイリアス、デフォルト設定、ユーザ設定の三種類の エントリから構成されている」と
言った方が実態に合っているのではないかと思う。
一人のユーザに複数のエントリがマッチするときは、順番に適用される。 複数の指定がマッチしている箇所について
は、最後にマッチしたものが使用される (それが一番明示的なマッチだとはかぎらないが)。
以下では sudoers の文法を拡張 Backus-Naur 記法 (EBNF) を用いて記述する。EBNF がどんなものか御存じないから
といって、 あきらめないでいただきたい。わりと簡単なものだし、 以下に出てくる定義には詳しい説明を付けてお
きますから。
EBNF の基礎の基礎
EBNF は言語の文法を記述する簡潔で厳密な方法である。 EBNF の個々の定義は生成規則からできている。たとえば、
シンボル ::= 定義 | 別の定義 1 | 別の定義 2 ...
個々の生成規則は、ほかの生成規則を参照し、そのようにして言語の文法を作り上げている。 また EBNF には以下の
演算子が含まれるが、 正規表現で御存じの読者も多いだろう。 だが、いわゆる「ワイルドカード」文字と混同しな
いでいただきたい。 あれは別の意味を持っている。
? 直前のシンボル (または、シンボルのグループ) が、あってもなくてもよいことを意味する。 すなわちそのシン
ボルは、1 回現れてもよいし、1 回も現れないでもよい。
* 直前のシンボル (または、シンボルのグループ) が 0 回以上現れる。
+ 直前のシンボル (または、シンボルのグループ) が 1 回以上現れる。
丸カッコを使うと、複数のシンボルをグループにまとめることができる。 なお混乱を避けるため、以下の定義で (シ
ンボル名ではなく) 文字どおりの文字列や記号を示す場合は、それをシングルクォート ('') で囲むことにする。
エイリアス
エイリアスには四種類ある。User_Alias, Runas_Alias, Host_Alias, Cmnd_Alias である。
Alias ::= 'User_Alias' User_Alias (':' User_Alias)* |
'Runas_Alias' Runas_Alias (':' Runas_Alias)* |
'Host_Alias' Host_Alias (':' Host_Alias)* |
'Cmnd_Alias' Cmnd_Alias (':' Cmnd_Alias)*
User_Alias ::= NAME '=' User_List
Runas_Alias ::= NAME '=' Runas_List
Host_Alias ::= NAME '=' Host_List
Cmnd_Alias ::= NAME '=' Cmnd_List
NAME ::= [A-Z]([A-Z][0-9]_)*
個々のエイリアスの定義は、次の形をとる。
Alias_Type NAME = item1, item2, ...
上記において、Alias_Type は User_Alias, Runas_Alias, Host_Alias, Cmnd_Alias のうちの一つである。 NAME は
アルファベットの大文字、数字、 アンダースコア ('_') からなる文字列であるが、 先頭の文字は大文字でなければ
ならない。同じタイプのエイリアス定義を、 コロンで (':') つないで、 一行に複数書くこともできる。たとえば、
Alias_Type NAME = item1, item2, item3 : NAME = item4, item5
以下では、エイリアスの有効な要素となるものを定義する。
User_List ::= User |
User ',' User_List
User ::= '!'* user name |
'!'* #uid |
'!'* %group |
'!'* %#gid |
'!'* +netgroup |
'!'* %:nonunix_group |
'!'* %:#nonunix_gid |
'!'* User_Alias
User_List を構成するのは、一個以上の次のものである。 ユーザ名、ユーザ ID (接頭辞 '#' が付く)、システムグ
ループ名やその ID (それぞれ、接頭辞 '%' と '%#' が付く)、ネットグループ名 (接頭辞 '+' が付く)、 非 Unix
グループ名やその ID (それぞれ、接頭辞 '%:' と '%:#' が付く)、 それに User_Alias。 リストの各項目の前には
一個以上の '!' 演算子を付けてもよい。 奇数個の '!' はその項目の値を否定する。偶数個の場合は互い相殺される
だけだ。
ユーザ名、uid、グループ名、gid、 ネットグループ名、非 Unix グループ名、非 Unix グループ の gid は、ダブル
クォートで囲めば、 特殊文字をエスケープしないですむ。 ダブルクォートで囲まずに特殊文字を使いたいなら、 エ
スケープした 16 進数を指定してやればよい。たとえば、 スペースなら \x20 という具合だ。ダブルクォートを使用
する場合は、 接頭辞があれば、それをダブルクォートの内側に入れなければならない。
非 Unix グループやその gid の書式が、 実際にどんなものになるかは、利用するグループ・プロバイダ・プラグイ
ン (group provider plugin) 次第である (後述する group_plugin オプションの説明も見てほしい)。たとえば、
QAS (Quest Authentication Services) の AD プラグインは、 以下の書式をサポートしている。
• 同じドメインのグループ: "Group Name"
• 任意のドメインのグループ: "Group Name@FULLY.QUALIFIED.DOMAIN"
• グループ SID: "S-1-2-34-5678901234-5678901234-5678901234-567"
グループ名を囲む引用符は任意であることに注意してほしい。 文字列を引用符で囲まない場合は、スペースや特殊文
字をエスケープするために、 バックスラッシュ (\) を使わなければならない。 エスケープする必要がある文字のリ
ストについては、 「ほかの特殊文字と予約語」のセクションをご覧になってほしい。
Runas_List ::= Runas_Member |
Runas_Member ',' Runas_List
Runas_Member ::= '!'* user name |
'!'* #uid |
'!'* %group |
'!'* %#gid |
'!'* %:nonunix_group |
'!'* %:#nonunix_gid |
'!'* +netgroup |
'!'* Runas_Alias
Runas_List は User_List に似ている。 違うのは、User_Alias ではなく、 Runas_Alias が使えることだ。 ユーザ
名やグループ名のマッチは文字列として行われることに気を付けてほしい。 言い換えると、二つのユーザ名 (あるい
はグループ名) は、かりに同じ uid (gid) を持っていても、別個のものと見なされるのである。 だから、もし同じ
uid を持ったすべてのユーザ名にマッチさせたかったら (たとえば、root と toor がそうだとしよう)、ユーザ名の
代わりに uid を使えばよい (この例なら、#0 である)。
Host_List ::= Host |
Host ',' Host_List
Host ::= '!'* host name |
'!'* ip_addr |
'!'* network(/netmask)? |
'!'* +netgroup |
'!'* Host_Alias
Host_List は一個以上の、ホスト名、IP アドレス、 ネットワークアドレス、ネットグループ名 (接頭辞 '+' が付
く)、 および他のエイリアスからなる。ここでもまた、'!' 演算子を付けて、 項目の値を否定することができる。
ネットワークアドレスにネットマスクを指定しなかった場合は、 sudo がローカルホストのネットワークインター
フェースを一つ一つ参照し、 指定されたネットワークアドレスと同じアドレスを持つインターフェースがあれば、
そのネットマスクを使用することになる。ネットマスクの指定は、 標準の IP アドレス表記 (たとえば
255.255.255.0 とか ffff:ffff:ffff:ffff:: とか) でもよく、CIDR 表記 (ビット数、 たとえば 24 とか 64 とか)
でもよい。 ホスト名の一部にシェル風のワイルドカードを使用することができるが (下記の「ワイルドカード」セク
ションを参照)、使用マシンの hostname コマンドが完全修飾ドメイン名 (FQDN) を返さない場合、 ワイルドカード
を利用するには fqdn オプションを使う必要がある。 なお、sudo がチェックするのは、 実在のネットワークイン
ターフェースだけだということに留意してほしい。 すなわち、IP アドレス 127.0.0.1 (localhost) がマッチするこ
とは、絶対にないのである。 また、"localhost" というホスト名がマッチするのは、 それが実際のホスト名である
ときだけであり、 それは通常、ネットワークにつながっていないシステムの場合にしか当てはまらない。
Cmnd_List ::= Cmnd |
Cmnd ',' Cmnd_List
commandname ::= file name |
file name args |
file name '""'
Cmnd ::= '!'* commandname |
'!'* directory |
'!'* "sudoedit" |
'!'* Cmnd_Alias
Cmnd_List は一個以上の、コマンド名、ディレクトリ、 他のエイリアスからなるリストである。コマンド名は絶対パ
スのファイル名であり、 シェル風のワイルドカードを含んでいても構わない (下記の「ワイルドカード」セクション
を参照)。単にファイル名だけ指定した場合、 ユーザはお望みのどんな引き数でも付けてそのコマンドを実行するこ
とができる。 とは言え、コマンドライン引き数を (ワイルドカードを含めて) 指定しても構わないし、また、引き数
に "" を指定して、そのコマンドは コマンドライン引き数なしの実行のみが可能だと指示することもできる。 ディ
レクトリは '/' で終わる絶対パス名である。 Cmnd_List にディレクトリを指定すると、 ユーザーはそのディレクト
リ内の任意のファイルを実行できるようになる (だが、そのサブディレクトリにあるファイルは実行できない)。
Cmnd がコマンドライン引き数を伴っている場合は、 Cmnd 中の引き数は、 ユーザがコマンドラインに打ち込む引き
数と正確に一致しなければならない (Cmnd 中の引き数にワイルドカードがあるならば、 それがコマンドラインの引
き数とマッチしなければならない)。 以下に挙げる文字をコマンド引き数の中で用いるときは、 '\' によってエス
ケープしなければならないことに注意してほしい。 ',', ':', '=', '\' がそれである。 "sudoedit" という特別な
コマンド名は、ユーザが sudo を -e オプション付きで (あるいは、sudoedit というコマンド名で) 実行することを
許可するために使用される。この場合、 コマンドライン引き数を取ることができるのは、普通のコマンドとまったく
同様である。
デフォルト設定 (Defaults)
かなりの設定オプションが、一行以上の Default_Entry 行を使うことで実行時にデフォルトの値から変更可能だ。そ
の効果の及ぶ範囲は、 任意のホストのすべてのユーザにすることもできるし、 ある特定のホストのすべてのユー
ザ、ある特定のユーザ、ある特定のコマンド、 ある特定のユーザとして実行するコマンドなどに限定することもでき
る。 気を付けてほしいのは、コマンドに限定した Defaults 行にコマンドライン引き数まで書くことができないこと
だ。 引き数を指定する必要がある場合は、Cmnd_Alias を定義して、 代わりにそれを参照すればよい。
Default_Type ::= 'Defaults' |
'Defaults' '@' Host_List |
'Defaults' ':' User_List |
'Defaults' '!' Cmnd_List |
'Defaults' '>' Runas_List
Default_Entry ::= Default_Type Parameter_List
Parameter_List ::= Parameter |
Parameter ',' Parameter_List
Parameter ::= Parameter '=' Value |
Parameter '+=' Value |
Parameter '-=' Value |
'!'* Parameter
パラメータはフラグ、整数値、文字列、 リストのどれでもよい。フラグは要するにブーリアン (真偽値) であり、
'!' 演算子で off にできる。整数値、文字列、リストのパラメータにも、 真偽値として使用して、それを無効にで
きるものがいくつか存在する。 パラメータの値が複数の単語を含むときは、値をダブルクオート (") で囲むとよ
い。特殊文字はバックスラッシュ (\) でエスケープすることができる。
リストには代入演算子が = のほかにもう二つある。 += と -= である。こうした演算子は、 それぞれ、リストに付
け加えたり、リストから削除したりするのに使用する。 -= 演算子を使って、 リストに存在しない要素を消去しよう
としても、エラーにはならない。
Defaults 行の解析は、次の順序で行われる。最初に汎用、Host、 User の Defaults が解析され、それから Runas
の Defaults、最後にコマンドの Defaults の順番になる。
Defaults 行で使用できるパラメータのリストについては、 「SUDOERS のオプション」を御覧いただきたい。
ユーザ設定 (User Specification)
User_Spec ::= User_List Host_List '=' Cmnd_Spec_List \
(':' Host_List '=' Cmnd_Spec_List)*
Cmnd_Spec_List ::= Cmnd_Spec |
Cmnd_Spec ',' Cmnd_Spec_List
Cmnd_Spec ::= Runas_Spec? Tag_Spec* Cmnd
Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')'
Tag_Spec ::= ('NOPASSWD:' | 'PASSWD:' | 'NOEXEC:' | 'EXEC:' |
'SETENV:' | 'NOSETENV:' | 'LOG_INPUT:' | 'NOLOG_INPUT:' |
'LOG_OUTPUT:' | 'NOLOG_OUTPUT:')
ユーザ設定は、あるユーザが、指定されたホストで (どのユーザに変身して) どのコマンドを実行できるかを決定す
る。デフォルトでは、コマンドは root に変身して実行されるが、これはコマンドごとに変更することができる。
ユーザ設定の基本構造は、
who where = (as_whom) what
[誰が どのホストで = (誰に変身して) 何を]
である。構成部分に分けて説明しよう。
Runas_Spec (どのユーザやグループに変身できるか)
Runas_Spec は変身の対象となるユーザやグループを規定している。 完全な形の Runas_Spec は、(上で定義している
ように) コロン (':') で区切られ、 カッコで囲まれた、二つの Runas_List からなっている。 一つ目の
Runas_List は、sudo で -u オプションを使ったときに変身できるユーザを指している。 二番目の方が規定している
のは、sudo の -g オプションによって指定できるグループのリストだ。 両方の Runas_List が指定されている場合
は、 それぞれの Runas_List にリストされているユーザとグループの任意の組み合わせで、 コマンドを実行するこ
とができる。 一つ目の Runas_List だけが指定されているときは、 リスト中のいかなるユーザにでも変身してコマ
ンドを実行できるが、 -g オプションを指定することはできない。 一つ目の Runas_List が空で、二番目だけ指定さ
れている場合は、 sudo を実行するユーザの資格で、グループを Runas_List にリストされている任意のグループに
設定して、 コマンドを実行することができる。 Runas_Spec がまったく指定されていないときは、 root としてコマ
ンドを実行できるが、グループを指定することはできない。
Runas_Spec は、 それに続くコマンドに対してデフォルトを定める。それはどういうことかと言うと、 次のようなエ
ントリがあったとしよう。
dgb boulder = (operator) /bin/ls, /bin/kill, /usr/bin/lprm
ユーザ dgb は /bin/ls, /bin/kill, /usr/bin/lprm を実行することができる。ただし、operator として実行できる
だけだ。たとえば、次のようにである。
$ sudo -u operator /bin/ls
エントリの後ろの方の Runas_Spec を変更することも可能だ。 上のエントリをこんなふうに書き変えたとしよう。
dgb boulder = (operator) /bin/ls, (root) /bin/kill, /usr/bin/lprm
すると、ユーザ dgb は、/bin/ls こそ operator としてだが、 /bin/kill や /usr/bin/lprm は root の資格で実行
できるようになる。
dgb が /bin/ls を実行するとき、 変身対象ユーザとグループのどちらでも operator にできるように、 この記述を
拡張することもできる。
dgb boulder = (operator : operator) /bin/ls, (root) /bin/kill, \
/usr/bin/lprm
注意してほしいが、Runas_Spec のグループの部分は、 コマンドをそのグループとして実行することをユーザに許可
しているのであって、 そうすることをユーザに強制しているのではない。コマンドラインで グループを指定しない
場合は、コマンドは、パスワード・データベースにある 変身対象ユーザのエントリに登録されているグループとして
実行されることになるのだ。以下のコマンドはすべて、上記の sudoers エントリによって許可されることになるだろ
う。
$ sudo -u operator /bin/ls
$ sudo -u operator -g operator /bin/ls
$ sudo -g operator /bin/ls
次の例では、ユーザ tcm が モデムのデバイスファイルにアクセスするコマンドを dialer グループとして実行でき
るようにしている。
tcm boulder = (:dialer) /usr/bin/tip, /usr/bin/cu, \
/usr/local/bin/minicom
この例では、グループしか指定できないことに注意してほしい。コマンドは ユーザ tcm の資格のまま実行されるの
である。たとえば、次のように。
$ sudo -g dialer /usr/bin/cu
Runas_Spec には複数のユーザやグループが存在してもよい。 その場合、ユーザは -u や -g オプションを使って、
ユーザとグループのどんな組み合わせでも選択することができる。
alan ALL = (root, bin : operator, system) ALL
この例では、ユーザ alan は root と bin ユーザのどちらに変身して、 任意のコマンドを実行することもでき
る。また、グループを operator や system に設定することも自由である。
Tag_Spec
コマンドは 0 個以上のタグを伴うことができる。使用できるタグの値は 10 個あり、 NOPASSWD, PASSWD, NOEXEC,
EXEC, SETENV, NOSETENV, LOG_INPUT, NOLOG_INPUT, LOG_OUTPUT, NOLOG_OUTPUT が、それである。ある Cmnd にタグ
をセットすると、 Cmnd_Spec_List 中のそれ以後の Cmnd は、反対の意味を持つタグによって変更されないかぎり、
そのタグを継承することになる (すなわち、PASSWD は NOPASSWD を上書きし、NOEXEC は EXEC を上書きする)。
NOPASSWD と PASSWD
デフォルトでは、sudo はコマンドを実行する前に、 ユーザが本人であることを証明するように求める。この振舞い
は NOPASSWD タグによって変更することができる。 Runas_Spec と同様、NOPASSWD タグも Cmnd_Spec_List 中のそれ
に続くコマンドに対して デフォルトを定める。 PASSWD の働きは反対であり、 振舞いを元に戻したいときに使え
る。たとえば、
ray rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm
とすれば、ユーザ ray はマシン rushmore 上で認証をしないでも root として /bin/kill, /bin/ls, /usr/bin/lprm
を実行できるようになる。もし ray がパスワードなしで実行できるコマンドを /bin/kill だけに絞りたいのなら、
エントリはこうなるだろう。
ray rushmore = NOPASSWD: /bin/kill, PASSWD: /bin/ls, /usr/bin/lprm
ただし、ユーザが exempt_group オプションで指定されているグループに属する場合は、 PASSWD タグが効果を持た
ないことに注意してほしい。
デフォルトでは、現在使用中のホストに関するユーザのエントリのうちに NOPASSWD タグが指定されているものが一
つでもあれば、 そのユーザはパスワードなしで sudo -l を実行できる。 なお、ユーザがパスワードなしで sudo -v
を実行できるのは、 現在使用中のホストに関するそのユーザのエントリのすべてで NOPASSWD タグが生きているとき
のみである。この動作は、 verifypw や listpw オプションによって変更できる。
NOEXEC と EXEC
sudo が noexec サポートつきでコンパイルされ、 使用しているオペレーティングシステムがそれに対応している場
合、 NOEXEC タグを利用すれば、動的にリンクされた実行ファイルが そこからさらにコマンドを実行するのを防ぐこ
とができる。
次の例では、ユーザ aaron は /usr/bin/more と /usr/bin/vi を実行できるが、シェル・エスケープは利用できな
い。
aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
NOEXEC がどんなふうに働くのか、お使いのシステムで利用できるかどうか、 などについてさらに詳しく知りたかっ
たら、 「シェル・エスケープを防止する」のセクションを御覧になるとよい。
SETENV と NOSETENV
上記のタグは setenv オプションの値をコマンドごとに変更する。 あるコマンドに対して SETENV を設定すると、
ユーザがコマンドラインから -E オプションを使用して、 env_reset オプションを無効にできるようになることに注
意してほしい。 それだけではない。コマンドラインから設定する環境変数が env_check, env_delete, env_keep に
よる規制を受けないようにもなる。 それ故、こうした形で環境変数を設定することを許可するのは、 信用できる
ユーザだけに限るべきである。なお、マッチするコマンドが ALL だった場合は、暗黙のうちに SETENV タグがそのコ
マンドに付けられるが、このデフォルトの動作は UNSETENV タグを使えば打ち消すことができる。
LOG_INPUT と NOLOG_INPUT
この二つのタグは log_input オプションの値をコマンドごとに変更する。 詳しい情報については、後述する
「SUDOERS のオプション」セクションの log_input の説明をご覧になっていただきたい。
LOG_OUTPUT と NOLOG_OUTPUT
この二つのタグは log_output オプションの値をコマンドごとに変更する。 詳しい情報については、後述する
「SUDOERS のオプション」セクションの log_output の説明をご覧になっていただきたい。
ワイルドカード
sudoers ファイルでは、ホスト名、コマンドラインのパス名、 コマンドラインの引き数にシェル形式のワイルドカー
ド (メタ文字とか glob キャラクタとも言う) が使用できる。ワイルドカードのマッチングは POSIX の glob(3) と
fnmatch(3) ルーティンを用いて行われる。 以下のものは正規表現ではないことに注意してほしい。
* ゼロ個以上の任意の文字にマッチする。
? 任意の一文字にマッチする。
[...] 指定された範囲の任意の一文字にマッチする。
[!...] 指定された範囲以外の任意の一文字にマッチする。
\x "x" がどんな文字であっても、"x" そのものとして評価する。 この表記法は "*", "?", "[", "}" といった
特殊文字をエスケープするために使用される。
使用システムの glob(3) や fnmatch(3) 関数が POSIX の文字クラスに対応しているなら、文字クラスも使用でき
る。 ただし、':' 文字は、 sudoers で特別な意味を持っているので、エスケープしなければならない。 一例を上げ
ると、
/bin/ls [[\:alpha\:]]*
上記は、文字で始まるどんなファイル名にもマッチするだろう。
コマンドのパス名に使われたワイルドカードはフォワードスラッシュ ('/') にマッチしないことに注意してほしい。
だが、コマンドライン引き数とのマッチングでは、 ワイルドカードはスラッシュとしっかりマッチする。そこで、
/usr/bin/*
というコマンドパスは、/usr/bin/who とマッチするが、 /usr/bin/X11/xterm とはマッチしないことになる。
ワイルドカード・ルールの例外
上記ルールには次の例外がある。
"" sudoers ファイルのエントリにおいて、空文字列 "" が唯一のコマンドライン引き数だった場合は、 そのコ
マンドは引数を付けずに実行しなければならないことを意味する。
sudoers に他のファイルをインクルードする
#include 命令や #includedir 命令を使えば、現在解析中の sudoers ファイルに、外部にあるほかの sudoers ファ
イルをインクルードすることができる。
この方法を使えば、たとえば、 サイト全体で使用する sudoers ファイルのほかに、 マシンごとのローカルな
sudoers ファイルを持つことができる。 ここでは、サイト全体の sudoers を /etc/sudoers とし、 マシンごとの方
は /etc/sudoers.local とすることにしよう。 /etc/sudoers に /etc/sudoers.local をインクルードするには、
/etc/sudoers 中に次の行を書き込む。
#include /etc/sudoers.local
sudo は解析中この行に出会うと、カレントファイル (/etc/sudoers だ) の処理を一時中止し、処理の対象を
/etc/sudoers.local に切り替える。そして、 /etc/sudoers.local の末尾まで達したら、/etc/sudoers の残りを処
理するのだ。 インクルードされたファイルがさらに他のファイルをインクルードしてもよい。 インクルートのネス
トには 128 ファイルまでというハード・リミットがあって、 インクルードファイルのループが起きないようになっ
ている。
インクルードファイルのパスが絶対パスでない場合は (すなわち、パスが / で始まっていない場合は)、インクルー
ドする側の sudoers ファイルと同じディレクトリに、インクルードされるファイルも存在しなければならない。 た
とえば、 /etc/sudoers に次のような行があったら、
#include sudoers.local
インクルードされるファイルは、/etc/sudoers.local である。 (訳注: インクルードファイルのディレクトリ部分を
省略できるのは、 sudo-1.8.4 以上である。sudo-1.8.3 以前では、絶対パスで指定しなければならない。)
なお、ファイル名には %h エスケープが使える。 これはホスト名の短縮形を示している。 たとえば、マシンのホス
ト名が "xerxes" のとき、
#include /etc/sudoers.%h
と書けば、sudo はファイル /etc/sudoers.xerxes をインクルードすることになる。
#includedir 命令を使えば、 sudo.d ディレクトリを作っておいて、 システムのパッケージ管理者がパッケージをイ
ンストールする際に sudoers のルールを記したファイルをそこに入れてやる、 といったことが可能になる。たとえ
ば、 次のように書くと、
#includedir /etc/sudoers.d
sudo は /etc/sudoers.d にあるファイルを一つづつ読み込む。 ただし、末尾が ~ だったり、 . 文字を含んでいた
りするファイル名はスキップするが、 これは、パッケージマネージャやエディタが作った、 テンポラリファイルや
バックアップファイルを読み込むような問題を起こさないためである。 ファイルは辞書順にソートされて、解析され
る。 すなわち、/etc/sudoers.d/01_first は /etc/sudoers.d/10_second より前に解析されるということだ。ソート
は辞書順であって、数値の順ではないので、 /etc/sudoers.d/1_whoops というファイルがあっても、
/etc/sudoers.d/10_second より後でロードされることに注意してほしい。 ファイル名の先頭を 0 で埋めて数字の桁
を揃えれば、 こうした問題を回避することができる。
気を付けてほしいが、 #include でインクルードされたファイルとは違って (訳注: visudo は /etc/sudoers を編集
するとき、 #include で指定したファイルがあれば、続けてそれも編集する)、 visudo が #includedir で指定した
ディレクトリのファイルまで編集するのは、 シンタクスエラーを含むものがあるときだけである。 とは言
え、visudo を -f オプション付きで実行して、 ディレクトリ中のファイルを直接編集することは可能だ。
ほかの特殊文字と予約語
パウンド記号 ('#') はコメントを示すのに使用される (例外は、#include 命令の一部であるときや、ユーザ名に関
連して現れ、 その後に一個以上の数字が続くときであり、後者の場合は uid と見なされる)。 コメント記号とそれ
に続くテキストは、行末にいたるまで無視される。
予約語 ALL は組込みのエイリアスであり、何に対してでもマッチする。 ALL は、Cmnd_Alias, User_Alias,
Runas_Alias, Host_Alias を代わりに使えるところなら、 どこでも使用できる。ALL という名前のエイリアスを自分
で定義しようとしてはいけない。 組込みのエイリアスの方が、自分で作ったエイリアスより優先して使われるから
だ。 ALL の使用には危険が伴うことがあるのを忘れないでいただきたい。 なぜなら、ALL をコマンドに関して使う
と、 ユーザにシステム上のどんなコマンドでも実行することを許してしまうからである。
エクスクラメーションマーク ('!') は、エイリアスでも Cmnd の前でも論理 not 演算子として使用できる。 これに
よってある値を除外することが可能だ。しかしながら、 組込みエイリアス ALL と ! を組み合わせて、「二三のコ
マンド以外のすべての」コマンドの実行を あるユーザに許可しようとしても、 思いどおりの動きになることはめっ
たにないことに気を付けてほしい (下記の「セキュリティに関する注意点」を参照)。
長い行は、行末にバックスラッシュ ('\') を置けば、継続することができる。
リストにおける要素間やユーザ設定における構文用特殊文字 ('=', ':', '(', ')') の前後に空白文字
(whitespace)を入れることは、 任意である。
次の文字を単語 (ユーザ名とかホスト名とか) の一部として使うときは、 バックスラッシュ ('\') でエスケープし
なければならない。 '!', '=', ':', ',', '(', ')', '\' がそれである。
SUDOERS のオプション
すでに説明したように、sudo の動作は Default_Entry 行によって変更することができる。 Defaults に与えること
のできるパラメータについて、 サポートされているもののすべてを、タイプ別にまとめて以下に列挙する。
フラグ (真偽値):
always_set_home これを有効にすると、sudo は環境変数 HOME を変身対象ユーザの (-u オプションが使用されない
かぎり、root である) ホームディレクトリに設定する。事実上、暗黙のうちに sudo に -H オプ
ションが常に指定されることになるわけだ。 気をつけてほしいのは、env_reset オプションが有効
になっている場合、 HOME の値は (訳注: 変身対象ユーザのホームディレクトリに) すでに設定済
みだということだ。だから、 always_set_home の指定に効果があるのは、 env_reset を無効に設
定している場合か、 env_keep のリストに HOME が存在する場合のみである。 このフラグはデフォ
ルトでは off である。
authenticate これをセットすると、ユーザはコマンドの実行を許可される前に、パスワードで (あるいは、ほか
の認証方法で) 自分が本人であることを証明しなければならなくなる。 このデフォルト値は
PASSWD や NOPASSWD タグで変更できる。 このフラグはデフォルトでは on である。
closefrom_override
これをセットすると、ユーザが sudo の -C オプションを使用できるようになる。-C オプションと
いうのは、 sudo が開いているファイルを閉じていくとき、 どのファイル・ディスクリプタから閉
じていくかという、 デフォルトの始点を変更するものだ。このフラグはデフォルトでは off であ
る。
compress_io これをセットすると、 sudo がコマンドの入出力のログを取るように設定されている場合に、 入出
力のログを zlib を使って、圧縮することになる。 sudo が zlib をサポートするようにコンパイ
ルされている場合、 このフラグはデフォルトで on である。
env_editor これをセットすると、 visudo はデフォルトのエディタ・リストを利用する前に、 環境変数
EDITOR や VISUAL の値を使用するようになる。 これがセキュリティホールになりかねないことに
注意してほしい。 ユーザが root として任意のコマンドを、 ログに記録されることなく実行でき
るようになるからだ。 こうした環境変数を利用するときの、 env_editor を有効にするよりも安全
な方法は、 sudoers ファイルの editor オプションに コロンで区切ったエディタのリストを書い
ておくことだ。そうすれば、 visudo が EDITOR や VISUAL を使うのは、それが editor オプショ
ンに指定した値とマッチしたときだけになる。 このフラグはデフォルトでは off である。
env_reset これをセットすると、sudo は最小限の環境でコマンドを実行することになる。 その環境には、以
下の変数が含まれる。すなわち、 TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME、
及び SUDO_* という変数。 これに、sudo を起動するユーザの環境にある変数のうち、 env_keep
や env_check のリストにマッチするものが加わり、さらに、 env_file オプションによって指定さ
れたファイルがあれば、 そのファイルに記載されたすべての変数が追加される。 env_keep や
env_check のリストにデフォルトでどんな変数が存在するかは、root ユーザが sudo に -V オプ
ションを付けて実行すれば、見ることができる。 なお、secure_path オプションが設定されている
ときは、 その値が環境変数 PATH として使用される。 このフラグはデフォルトで on である。
fast_glob 通常 sudo はパス名のマッチングをするとき、glob(3) 関数を使用して、シェル・スタイルのワイ
ルドカード展開 (glob) を行う。 しかし、glob(3) はファイルシステムにアクセスするので、 指
定パターンによっては、作業を完了するまでに時間がかかることがある。 必要な時にマウントする
ようになっている (つまりオートマウントの) ネットワーク・ファイル・システムを参照するとき
は、とりわけ時間がかかる。 fast_glob オプションを指定すると、 sudo が fnmatch(3) 関数を使
うようになるが、 こちらの関数はマッチングの際にファイルシステムにアクセスしない。
fast_glob の欠点は、./ls や ../bin/ls のような相対パスに対するマッチができないことであ
る。 そのため、ワイルドカードを含むパス名が、否定演算子 '!' と一緒に使われている場合
に、セキュリティ上の問題が生じるおそれがある。 そうしたルールは簡単に迂回できるからだ。そ
れ故、sudoers にワイルドカードを含むパス名を否定するルールが存在する場合は、 このオプショ
ンを使ってはいけない。このフラグはデフォルトでは off である。
fqdn sudoers ファイルで完全修飾ホスト名を使用したかったら、 このフラグをセットするとよい。すな
わち、myhost ではなく、 myhost.mydomain.edu を使いたい場合だ。そのときでも、そうしたけれ
ば、 短縮形も使える (両方を混ぜて使うこともできる)。気を付けてほしいのは、 fqdn を 有効に
すると、 sudo は DNS へ問い合わせをしなければならないので、 DNS サービスが稼働していない
場合、 sudo が使えなくなるかもしれないということだ (たとえば、マシンがネットワークに接続
していない場合)。 もう一つ気を付けるべきことがある。 DNS が知っているホストの正式名を使わ
なければならないということだ。 言い換えれば、ホストのエイリアス (CNAME のエントリ) を使っ
てはいけない。パフォーマンスの問題もあるし、 DNS からエイリアスをすべて取得する方法はない
からでもある。 マシンのホスト名が (hostname コマンドで返ってくるものが) すでに完全修飾名
になっているならば、fqdn をセットする必要はないだろう。 このフラグはデフォルトでは off で
ある。
ignore_dot これをセットすると、環境変数 PATH 中に '.' や '' (カレントディレクトリを意味する) があっ
ても、sudo はそれを無視する。 PATH そのものは変更されない。このフラグは デフォルトでは
off である。
ignore_local_sudoers
LDAP の方でこのフラグをセットすると、 /etc/sudoers の解析がスキップされる。 このフラグ
は、ローカルにある sudoers ファイルの使用を禁じて、 LDAP のみを使うようにしたい企業のため
にある。 たちの悪いオペレータが /etc/sudoers に手を加えて、 自分の権限を増やそうとして
も、そうした悪だくみは阻止されるわけだ。 このオプションが設定されているときは、
/etc/sudoers ファイルは存在する必要すらない。このオプションは、 LDAP 中に、マッチする特定
のエントリが存在しなかったときに、 いかに振舞うべきかを sudo に指示するものだから、 これ
を指定する sudoOption は、 cn=defaults のセクションになければ意味がない。 このフラグはデ
フォルトでは off である。
insults これをセットすると、不正なパスワードが入力されたとき、 sudo がユーザに悪態をつく。このフ
ラグはデフォルトでは off である。
log_host これをセットすると、ホスト名が (syslog 経由ではない) sudo の ログファイルに記録されること
になる。このフラグはデフォルトでは off である。
log_input これをセットすると、sudo は 擬似 tty でコマンドを実行し、 ユーザの入力をすべてログに取る
ことになる。入出力がリダイレクトされているとか、 コマンドがパイプラインの一部だとかいう理
由で、標準入力がユーザの tty に結びつけられていない場合も、その入力がキャプチャーされて、
独立したログファイルに書き込まれることに変わりはない。
入力は、iolog_dir オプションで指定したディレクトリに (デフォルトでは /var/log/sudo-
io)、一意なセッション ID を使って記録される。このセッション ID は sudo の通常のログのエン
トリに、TSID= に続く値として書き込まれているものだ。 iolog_file オプションを使えば、 セッ
ション ID の形式を変更することができる。
ユーザの入力には、パスワードのような (たとえ、 画面にエコーされることはないにしても) 秘密
情報が含まれていることがある。 そういった情報も、暗号化されずに、 ログファイルに記録され
ることに注意してほしい。 たいていの場合、log_output を使って、 コマンドの出力をログに記録
するだけで十分用が足りる。
log_output これをセットすると、sudo は 擬似 tty でコマンドを実行し、 スクリーンに送られたすべての出
力をログに取ることになる。 script(1) コマンドと似たことをやるわけだ。 入出力がリダイレク
トされているとか、 コマンドがパイプラインの一部だとかいう理由で、標準出力や標準エラーが
ユーザの tty に結びつけられていない場合も、その出力がキャプチャーされて、 それぞれ独立し
たログファイルに書き込まれることに変わりはない。
出力は、iolog_dir オプションで指定したディレクトリに (デフォルトでは /var/log/sudo-
io)、一意なセッション ID を使って記録される。このセッション ID は sudo の通常のログのエン
トリに 、TSID= に続く値として書き込まれているものだ。 iolog_file オプションを使えば、
セッション ID の形式を変更することができる。
出力のログは sudoreplay(8) コマンドを使って、見ることができる。 また、このコマンドは、利
用できるログをリストしたり、 検索したりするのにも使用できる。
log_year これをセットすると、四桁の年が (syslog 経由ではない) sudo のログファイルに記入されること
になる。このフラグはデフォルトでは off である。
long_otp_prompt S/Key や OPIE のような One Time Password (OTP) スキームを採用しているときにこれを有効にす
ると、 チャレンジをローカルウィンドウにカット・アンド・ペーストしやすいように、 二行のプ
ロンプトが使用される。デフォルトのプロンプトほど見栄えはよくないが、 こちらの方が便利だと
思う人もいる。デフォルトではこのフラグは off である。
mail_always ユーザが sudo を実行するたびに、mailto ユーザにメールを送る。 このフラグはデフォルトでは
off である。
mail_badpass sudo を実行するユーザが正しいパスワードを入力しないと、 mailto ユーザにメールを送る。この
フラグはデフォルトでは off である。
mail_no_host これをセットすると、sudo を起動したユーザが sudoers ファイルに記載されているものの、 使用
中のホストでコマンドの実行を許可されていない場合、 mailto ユーザにメールを送付する。この
フラグはデフォルトでは off である。
mail_no_perms これをセットすると、sudo を起動したユーザが sudo の使用を許可されているが、 実行しようと
しているコマンドが sudoers ファイルの そのユーザのエントリに登録されていないか、明示的に
禁止されている場合、 mailto ユーザにメールを送付する。このフラグはデフォルトでは off であ
る。
mail_no_user これをセットすると、sudo を起動したユーザが sudoers ファイルに記載されていない場
合、mailto ユーザにメールを送付する。 このフラグはデフォルトでは on である。
noexec これをセットすると、sudo を通して実行されるすべてのコマンドが、 EXEC タグで無効にされない
かぎり、あたかも NOEXEC タグが設定されているかのごとく振舞うようになる。 前述の「NOEXEC
と EXEC」の説明、 および、このマニュアルの終わりの方にある「シェル・エスケープを防止す
る」 というセクションを参照してほしい。 このフラグはデフォルトでは off である。
path_info 通常 sudo は、環境変数 PATH 中にコマンドが見付からないと、ユーザにそのことを知らせる。こ
れを利用すれば、 一般ユーザにアクセス権のない実行ファイルのありかについて 情報を収集でき
るという理由から、 この動作を無効にしたいサイトもあるかもしれない。 その場合の欠点は、実
行ファイルが単にユーザの PATH 中になかっただけの場合でも、実行の許可がないと sudo がユー
ザに告げることになって、実情がわかりにくいかもしれないことである。 このフラグはデフォルト
では on である。
passprompt_override
通常、passprompt オプションによって指定されたパスワードプロンプトが使用されるのは、 PAM
のようなシステムが用意しているパスワードプロンプトが、 "Password:" という文字列にマッチし
ているときだけである。 passprompt_override をセットすると、 passprompt が無条件で使われる
ことになる。 このフラグはデフォルトでは off である。
preserve_groups デフォルトでは、sudo は所属グループの初期値として、 変身対象ユーザが所属しているグループ
のリストを設定する。 preserve_groups をセットすると、 sudo を実行するユーザの所属グループ
のリストが、 変更されずにそのまま維持される。とは言え、実グループ ID や実効グループ ID が
変身対象ユーザのそれに設定されることに変わりはない。 このフラグはデフォルトでは off であ
る。
pwfeedback ほかのたいていの Unix プログラムと同様、 sudo はパスワードを読み込むとき、デフォルトで
は、ユーザが Return (または Enter) キーを押すまで、エコーを off にする。 この動作にとまど
うユーザが存在する。 彼らには sudo が急に反応しなくなったように見えるのだ。 pwfeedback を
セットすると、ユーザがキーを押すたびに、 sudo が目に見える反応を返すようになる。 これに
は、セキュリティ上の問題があることに注意してほしい。側で見ている人が、 打ち込まれたパス
ワードの文字数を特定できてしまうかもしれないのだ。 このフラグはデフォルトでは off であ
る。
requiretty これをセットすると、sudo が実行されるのは、ユーザが実際の tty にログインしたときだけにな
る。すなわち、sudo を実行できるのは、 ログイン・セッションからだけであって、 cron(8) や
cgi-bin スクリプトといった、 ほかの方法を介して実行することはできないということだ。このフ
ラグは、 デフォルトでは off である。
root_sudo これをセットすると、root も sudo を実行できるようになる。 このフラグを無効にすると、ユー
ザがたとえば "sudo sudo /bin/sh" といったように sudo コマンドを連鎖的に使って、 ルート
シェルを獲得することができなくなる。ところで、 root_sudo が off だと、root が sudoedit ま
で実行できなくなることに注意してほしい。 root_sudo を無効にしても、セキュリティが実際に向
上するわけではない。 このフラグが存在しているのは、もっぱら歴史的な理由からなのだ。 この
フラグはデフォルトでは on である。
rootpw これをセットすると、sudo はプロンプトで、起動したユーザのパスワードではなく、 root のパス
ワードを要求するようになる。 このフラグはデフォルトでは off である。
runaspw これをセットすると、sudo はプロンプトで、起動したユーザのパスワードではなく、 sudoers
ファイルの runas_default オプションで指定しているユーザーの (デフォルトでは root である)
パスワードを要求する。 このフラグはデフォルトでは off である。
set_home これが有効なときに sudo を -s オプション付きで起動すると、 環境変数 HOME が変身対象ユーザ
の (-u オプションが使用されないかぎり、それは root である) ホームディレクトリに設定され
る。すなわち、 -s オプションが -H オプションを事実上兼ねることになるわけだ。 気をつけてほ
しいのは、env_reset が有効な場合、HOME はすでに (訳注: 変身対象ユーザのホームディレクトリ
に) 設定済みだということだ。 だから、set_home の効果があるのは、 env_reset が無効に設定さ
れているか、 env_keep のリストに HOME が存在する場合のみである。 このフラグはデフォルトで
は off である。
set_logname 通常 sudo は環境変数 LOGNAME, USER, USERNAME を変身対象ユーザの名前 (-u オプションが指定
されていない場合、 普通は root) にセットする。しかし、プログラムによっては (たとえば、
RCS リビジョンコントロールシステムがその一つだが) ユーザが実際には誰であるかを判定するの
に LOGNAME を使用していることがあり、そのために、この振舞いを変更したい場合もある。
set_logname オプションに '!' を付けて否定することで、それができる。 なお env_reset オプ
ションを無効にしていない場合、 env_keep リストの項目が set_logname による値を上書きするこ
とになるので、注意してほしい。 このフラグはデフォルトでは on である。
set_utmp これが有効になっていると、sudo は擬似 tty を割り当てるときに、 utmp (または utmpx) ファイ
ルにエントリを作成する。 sudo によって擬似 tty の割り当てが行われるのは、 log_input,
log_output, use_pty といったフラグが有効になっているときである。 デフォルトでは、新しいエ
ントリは、そのユーザの utmp エントリが存在すれば、 そのコピーであり、tty, time, type, pid
フィールドが更新される。 このフラグはデフォルトでは on である。
setenv これをセットすると、ユーザがコマンドラインで -E オプションを指定して、 env_reset オプショ
ンを無効にできるようになる。 さらに、コマンドラインから設定する環境変数が env_check,
env_delete, env_keep による制限を受けなくなる。 それ故、そのようなやり方で変数を設定する
ことを許可するのは、 信用できるユーザのみに限るべきだ。このフラグはデフォルトでは off で
ある。
shell_noargs これがセットされているとき、sudo を引き数なしで起動すると、 sudo は -s オプションが指定さ
れたかのように振舞う。 すなわち、root ユーザとしてシェルを実行するわけだ (シェルは、環境
変数 SHELL がセットされていれば、それによって決まるし、 セットされていなければ、sudo を起
動したユーザの /etc/passwd エントリに登録されたものになる)。このフラグはデフォルトでは
off である。
stay_setuid 通常 sudo がコマンドを実行するとき、実 UID と実効 UID は変身対象ユーザ (デフォルトでは
root) のものにセットされる。 このオプションは、その振舞いを変更して、sudo を起動したユー
ザの UID が、そのまま実 UID として残るようにする。言い換えると、 sudo が setuid ラッパー
として動作するようになるわけだ。 プログラムを setuid で動かすと、危険をもたらしかねないと
いう理由から、 ある種の機能を使えないようにしているシステムでは、 このオプションが役に立
つかもしれない。このオプションは、setreuid() 関数や setresuid() 関数を持っているシステム
でのみ有効である。 このフラグはデフォルトでは off である。
targetpw これをセットすると、sudo はプロンプトで、 起動したユーザのパスワードではなく、 -u オプ
ションで指定されたユーザ (デフォルトでは root) のパスワードを要求することになる。それに加
えて、 タイムスタンプ・ファイルの名前に変身対象ユーザの名前が含まれるようになる。 このフ
ラグを設定をすると、-u オプションの引き数として、 passwd データベースに登録されていない
uid が使えなくなることに注意してほしい。 このフラグはデフォルトでは off である。
tty_tickets これをセットすると、ユーザは tty ごとに認証をしなければならなくなる。 このフラグが有効な
場合、 sudo はユーザのタイムスタンプ・ディレクトリにある、 ユーザがログインしている tty
に対応する名前のファイルをタイムスタンプに使用する。 それに対して、このフラグが無効な場合
は、 ユーザのタイムスタンプ・ディレクトリそのもののタイムスタンプが使用されるのである。
このフラグはデフォルトでは on である。
umask_override これをセットすると、sudo は umask を sudoers の umask オプションで指定されたとおりの値
に、変更を加えることなく設定する。 このことによって、ユーザ自身の umask 値よりもっと緩や
かな umask 値を sudoers で指定することが可能になる。 sudo の昔の動作と同じになるわけだ。
umask_override をセットしない場合、 現在の sudo は umask を、ユーザの umask 値と sudoers
で指定した umask 値とのビット和に設定することになっている。 このフラグはデフォルトでは
off である。
use_pty これをセットすると、sudo は入出力のロギングが行われていないときでも、 擬似 tty でコマンド
を実行することになる。 sudo によって実行された悪意のあるプログラムが、 バックグラウンド・
プロセスをフォークし、 そのプロセスが、メインプログラムの実行が終了した後でも、 ユーザの
ターミナルデバイスを握って離さないといったことが考えられる。 このオプションを使えば、そう
いったことが不可能になる。 このフラグはデフォルトでは off である。
utmp_runas これをセットすると、sudo は utmp (または utmpx) ファイルを更新するとき、 変身対象ユーザの
名前を記録するようになる。sudo はデフォルトでは、 sudo を実行したユーザの名前を記録するの
だ。 このフラグはデフォルトでは off である。
visiblepw デフォルトでは、ユーザがパスワードを入力しなければならないときに、 使用しているターミナル
でエコーの抑制ができなかったら、 sudo は実行を拒否するようになっている。 これに対
し、visiblepw フラグが設定されていると、 パスワードがスクリーンに表示されてしまう場合で
も、 sudo はプロンプトを出して、パスワードを求める。この動作によって、 rsh(1) は tty を割
り当てないにもかかわらず、 "rsh somehost sudo ls" といった操作の実行が可能になるわけだ。
このフラグはデフォルトでは off である。
整数:
closefrom sudo はコマンドを実行する前に、標準入力、標準出力、標準エラー (すなわち、ファイルディスク
リプタ 0-2 である) を除いて、 開いているすべてのファイル・ディスクリプタをクローズする。
closefrom オプションを使用すると、 0-2 以外のどのファイル・ディスクリプタから閉じて行くか
を指定することができる。 デフォルトは 3 である。
passwd_tries sudo が「失敗」をログに記録して終了する前に、 ユーザがパスワードを入力できる回数。デフォ
ルトは 3。
真偽値としても使用できる整数:
loglinelen sudo 用ログファイルの一行あたりの文字数。 この値は、ログファイルを見やすくするために改行
する位置を決めるのに使用される。 この値は、syslog 経由のログファイルには影響せず、 直接
ファイルにログを書き出すときのみ効果がある。デフォルトは 80 である (改行をしないようにす
るには、値を 0 にするか、 頭に '!' を付けて、このオプションを否定する)。
passwd_timeout sudo のパスワードプロンプトが時間切れになるまでの分単位の時間。 0 を指定すると、時間切れ
なしになる。 分よりももっと細かい時間を指定したいときは、(2.5 のように) 小数点以下を付け
ることもできる。デフォルトは 5 である。
timestamp_timeout
sudo がパスワードを再び要求するようになるまでの時間を 分単位で指定する。分よりももっと細
かい時間を指定したいときは、 (2.5 のように) 小数点以下を付けることもできる。 デフォルトで
は 5 である。 これを 0 にセットすると、毎回パスワードを要求するようになる。 0 より小さい
値にセットした場合は、 ユーザのタイムスタンプが期限切れになることがない。 ユーザが sudo
-v と sudo -k を実行することによって、タイムスタンプを自分で作ったり、 消したりできるよう
にしたかったら、この手を使えばよい。
umask コマンドを実行するときに使用する umask 値。 ユーザの umask 値をそのまま使いたかった
ら、'!' を頭に付けて、 このオプションを否定するか、0777 にセットすればよい。 このオプショ
ンの値が 0777 以外の場合、実際に使用される umask 値は、 ユーザの umask 値と umask オプ
ションの値とのビット和であり、 後者のデフォルトは 0022 である。 このことによって、sudo が
コマンドを実行するときの umask 値が、 ユーザの umask 値より低くならないようになっているわ
けだ。 PAM を使用しているシステムでは、 PAM のデフォルト設定で umask 値を指定することがで
きるが、その場合は、それが sudoers で指定した値を上書きすることに注意してほしい。
文字列:
badpass_message ユーザが不正なパスワードを入力したときに表示するメッセージ。 insults フラグが有効になって
いないかぎり、 デフォルトは「Sorry, try again.」である。
editor visudo で使用できるエディタをコロン (':') で区切ったリスト。 visudo は、可能ならば、 ユー
ザの EDITOR 環境変数と一致したエディタを選択する。 それができないときは、このリストにある
エディタで、 実際に存在し、かつ実行可能な最初のエディタを使用する。デフォルトは
"/usr/bin/vi" である。
iolog_dir このオプションの値をトップレベル・ディレクトリにして、 入出力ログを格納するディレクトリの
パス名が構成される。 この値が使用されるのは、log_input や log_output オプションが有効に
なっているときや、 LOG_INPUT や LOG_OUTPUT タグがコマンドに付いているときだけである。この
ディレクトリ以下に、 (セッション ID が連番ならば) セッションの連番が格納されることになる
わけだ。 デフォルトは "/var/log/sudo-io" である。
以下のパーセント (`%') エスケープシーケンスが使用できる。
%{seq}
単純に増加する 36 進数の連続番号に展開される。たとえば、0100A5 といった番号であり、
二桁づつ使って新しいディレクトリを作っていく。この場合なら、 01/00/A5 といった具合
だ。
%{user}
sudo を実行するユーザーのログイン名に展開される。
%{group}
sudo を実行するユーザーの実グループ ID の名前に展開される。
%{runas_user}
変身対象ユーザのログイン名に展開される (たとえば root)。
%{runas_group}
変身対象ユーザのグループ名に展開される (たとえば wheel)。
%{hostname}
ドメイン名なしのローカル・ホスト名に展開される。
%{command}
実行されるコマンドのベースネームに展開される。
このほか、システムの strftime() 関数がサポートしているエスケープシーケンスは、 いかなるも
のでも展開の対象になる。
`%' 文字そのものを使いたかったら、文字列 `%%' を使用すればよい。
iolog_file iolog_dir を基点とする相対パス名であり、log_input や log_output オプションが有効になって
いたり、 LOG_INPUT や LOG_OUTPUT タグがコマンドに付いている場合に、入出力ログがこの中に格
納される。 iolog_file の値がディレクトリ構成をなしていることがあるのに注意すること。 デ
フォルトは "%{seq}" である。
使用できるパーセント (`%') エスケープシーケンスのリストについては、 上記の iolog_dir オプ
ションを参照してほしい。
エスケープシーケンスの展開とは別に、パス名が六個以上の X で終わっている場合、X の部分が、
他と重複しない英数字の組み合わせに置き換えられる。 mktemp() 関数の場合と同様である。
mailsub mailto ユーザに送付するメールの件名。エスケープ文字 %h はマシンのホスト名に展開される。デ
フォルトは「*** SECURITY information for %h ***」である。
noexec_file このオプションはもうサポートされていない。現在では、 noexec ファイルのパスは
/etc/sudo.conf ファイルで設定するべきである。 (訳注: sudo-1.8.3 では、まだこのオプション
が有効かもしれない。 しかし、そこでも /etc/sudo.conf を使用することが推奨されている。)
passprompt パスワードを要求するときに使用するデフォルトのプロンプト。 -p オプションや環境変数
SUDO_PROMPT によって変更することができる。以下のパーセント (`%') エスケープシーケンスが使
用できる。
%H ドメイン名付きのローカルホスト名に展開 (マシンのホスト名が完全修飾名か、 fqdn オプ
ションがセットされている場合のみ)
%h ドメイン名なしのローカルホスト名に展開
%p パスワードを要求されているユーザ名に展開 (sudoers ファイルの rootpw, targetpw,
runaspw フラグを尊重する)
%U 変身対象ユーザの (デフォルトでは root) ログイン名に展開
%u sudo を起動するユーザのログイン名に展開
%% 連続した二個の % は、一個の % 文字そのものを意味する
デフォルトの値は「Password:」である。
runas_default コマンドラインで -u オプションが指定されていないときの、 デフォルトの変身対象ユーザ。デ
フォルトでは root になっている。
syslog_badpri ユーザが認証に失敗したときに使用する syslog の重大度 (priority)。 デフォルトでは alert に
なっている。
syslog の重大度には、次のものが指定できる。alert, crit, debug, emerg, err, info, notice,
warning。
syslog_goodpri ユーザが認証に成功したときに使用する syslog の重大度 (priority)。 デフォルトでは notice
になっている。
どんな syslog の重大度が指定できるかについては、 syslog_badpri を参照。
sudoers_locale sudoers ファイルを解析したり、コマンドのログを記録したり、 email を送付したりするときに使
用するロケール。ロケールの変更は、 sudoers の解釈に影響があるかもしれないので、気をつけて
ほしい。 デフォルトでは "C" になっている。
timestampdir sudo がタイムスタンプ・ファイルを置くディレクトリ。 デフォルトは /var/lib/sudo である。
timestampowner タイムスタンプ・ディレクトリとそこに置かれるタイムスタンプの所有者。 デフォルトは root で
ある。
真偽値としても使用できる文字列:
env_file env_file オプションでファイルの絶対パスを指定すると、 実行するプログラムの環境として設定する
変数を、そのファイルに格納しておくことができる。 このファイルのエントリは VARIABLE=value か
export VARIABLE=value の形でなければならない。 変数の値をシングルクォートやダブルクォートで囲
んでもよい。 このファイルに含まれる変数は、env_keep や env_check のような sudo のほかの環境設
定の影響を受ける。
exempt_group
このグループのユーザはパスワードの入力や secure_path による PATH の限定を免除されている。 指
定するグループ名に接頭辞の % を付けてはいけない。 このオプションはデフォルトではセットされて
いない。
group_plugin
このオプションの値となる文字列には、sudoers が使用するグループ・プラグインと、必要ならその引
き数を指定する。 このオプションを使えば、前述した (訳注: 「エイリアス」セクション参照) 非
Unix グループの書式を使えるようにすることも可能だ。 値となる文字列は、プラグインのパスに続け
て、その設定に必要な引き数があれば、 それを付け加えたものだが、パスは絶対パスか、
/usr/local/libexec を基点とする相対パスにするべきである。 指定した引き数は (もし存在するなら)
プラグインの初期化関数に渡される。 引き数が存在する場合は、 文字列をダブルクォート (") で囲ま
なければならない。
たとえば、/etc/sudo-group という Unix グループの書式で書いたグループファイルがあるとしよう。
次のようにすれば、sample group plugin を使用することができる。
Defaults group_plugin="sample_group.so /etc/sudo-group"
詳細に付いては、sudo_plugin(5) をご覧いただきたい。
lecture sudo はパスワードプロンプトに添えて簡単な訓戒を表示することができる。 このオプションはその訓
戒をいつ表示するかを決定する。 以下の値が可能である。
always いつでも必ず訓戒を表示する。
never 訓戒をまったく表示しない。
once ユーザがはじめて sudo を実行したときだけ表示する。
値を指定しないと、once を指定したことになる。頭に '!' を付けて、 このオプションを否定する
と、値に never が使用される。 デフォルトの値は once である。
lecture_file
標準の訓戒の代わりに使用する sudo の訓戒を書き込んだファイルがあるなら、 lecture_file でその
パスを指定する。sudo はデフォルトでは、 プログラムに埋め込まれた訓戒を使用する。
listpw このオプションは、sudo を -l オプション付きで実行したとき、 ユーザがパスワードを要求されるの
は、どんな場合かを決定する。 以下の値が可能である。
all パスワードを入力しないですむためには、 sudoers ファイルの使用中のホストに対する当該
ユーザのエントリのすべてに NOPASSWD タグが設定されていなければならない。
always ユーザは -l オプションを使用する際に 必ずパスワードを入力しなければならない。
any パスワードを入力しないですむためには、sudoers ファイルの 使用中のホストに対する当該
ユーザのエントリの少なくとも一つに NOPASSWD タグが設定されていなければならない。
never ユーザは -l オプションを使用する際に パスワードを入力する必要がまったくない。
値を指定しないと、値は any だと見なされる。'!' を頭に付けて、 このオプションを否定すると、値
に never が使われることになる。 デフォルトは any である。
logfile sudo 独自のログファイルのパス (syslog 経由のログファイルではない)。 パスを指定すると、独自
ファイルへのロギングが on になり、 '!' を頭に付けて、 このオプションを否定すると、off にな
る。デフォルトでは、sudo は syslog 経由でログを取る。
mailerflags メーラを起動するときに使用するフラグ。デフォルトは -t になっている。
mailerpath 警告メールの送信に使うメール・プログラムのパス。デフォルトは configure したときに見つかった
sendmail のパス。
mailfrom 警告メールやエラー・メールを送るとき、差出人として使用するアドレス。 sudo が @ 記号を解釈しな
いように、 アドレスはダブルクォート (") で囲むべきである。デフォルトは、 sudo を実行するユー
ザの名前。
mailto 警告メールやエラー・メールを送付する宛先のアドレス。sudo が @ 記号を解釈しないように、 アドレ
スはダブルクォート (") で囲むべきである。 デフォルトは root になっている。
secure_path sudo から実行されるあらゆるコマンドが使用するパス。 sudo を実行するユーザが、無難な環境変数
PATH を使っているかどうか確信が持てないなら、このオプションを使用するとよいだろう。 もう一つ
の使用法は、「root のパス」と「一般ユーザのパス」を別のものにしておきたい場合だ。 ユーザが
exempt_group オプションで指定したグループに属していると、 そのユーザは secure_path の影響を受
けない。 このオプションは、デフォルトではセットされていない。
syslog syslog を使ってログを取っている場合の syslog のファシリティ (syslog 経由でログを取らないな
ら、'!' を頭に付けて、このオプションを否定する)。 デフォルトでは authpriv になっている。
syslog のファシリティには、次のものが指定できる。 authpriv (OS が対応している場合), auth,
daemon, user, local0, local1, local2, local3, local4, local5, local6, local7。
verifypw このオプションは、sudo を -v オプション付きで実行したとき、 ユーザがパスワードを要求されるの
は、どんな場合かを決定する。 次のような値が可能である。
all パスワードを入力しないですむためには、 sudoers ファイルの使用中のホストに対する当該
ユーザのエントリのすべてに NOPASSWD タグが設定されていなければならない。
always ユーザは -v オプションを使用する際に 必ずパスワードを入力しなければならない。
any パスワードを入力しないですむためには、sudoers ファイルの 使用中のホストに対する当該
ユーザのエントリの少なくとも一つに NOPASSWD タグが設定されていなければならない。
never ユーザは -v オプションを使用する際に パスワードを入力する必要がまったくない。
値を指定しないと、値は all だと見なされる。'!' を頭に付けて、 このオプションを否定すると、値
に never が使われることになる。 デフォルトは all である。
真偽値としても使用できるリスト:
env_check 変数の値に % や / が含まれる場合に、 ユーザの環境から取り除かれる環境変数。 この機能
は、出来のよくないプログラムに見られる printf 形式のフォーマットの脆弱性に対処するために
利用できる。 このオプションの引き数は、ダブルクォートで囲まれ、 スペースで区切られたリス
トでもよく、 ダブルクォートなしの単一の値でもよい。リストは、=, +=, -=, ! 演算子を使っ
て、それぞれ置き換えたり、追加したり、削除したり、 無効にしたりすることができる。
env_check で指定された変数は、 env_reset オプショの有効・無効にかかわらず、 上記のチェッ
クにパスすれば、環境に保存されることになる。 チェックされる環境変数のデフォルトのリスト
は、root ユーザが sudo に -V オプションを付けて実行したときに表示される。
env_delete env_reset オプションが無効になっているときに、 ユーザの環境から取り除かれる環境変数。この
オプションの引き数は、 ダブルクォートで囲まれ、スペースで区切られたリストでもよく、 ダブ
ルクォートなしの単一の値でもよい。 リストは、=, +=, -=, ! 演算子を使って、それぞれ置き換
えたり、追加したり、 削除したり、無効にしたりすることができる。 取り除かれる環境変数のデ
フォルトのリストは、root ユーザが sudo に -V オプションを付けて実行したときに表示される。
留意すべきは、オペレーティングシステムには、 危険をもたらしかねない変数をいかなる setuid
プロセス (sudo もその一つ) の環境からも取り除くことにしているものが多いということである。
env_keep env_reset オプションが有効になっているときでも、 ユーザの環境にそのまま保存される環境変
数。このオプションによって、 sudo から生み出されるプロセスが受け取る環境を、 きめ細かく制
御することが可能になる。このオプションの引き数は、 ダブルクォートで囲まれ、スペースで区切
られたリストでもよく、 ダブルクォートなしの単一の値でもよい。リストは、 =, +=, -=, ! 演算
子を使って、それぞれ置き換えたり、 追加したり、削除したり、無効にしたりすることができる。
保存される変数のデフォルトのリストは、root ユーザが sudo に -V オプションを付けて実行した
ときに表示される。
ファイル
/etc/sudoers 誰が何を実行できるかのリスト
/etc/group ローカルのグループファイル
/etc/netgroup ネットワークグループのリスト
/var/log/sudo-io 入出力のログファイル (訳注: 厳密には、 入出力のログを記録するファイル群をその下に
格納するトップディレクトリ)
/var/lib/sudo sudoers セキュリティ・ポリシーが使用するタイムスタンプを格納するディレクトリ。
/etc/environment Linux や AIX で -i モードを使用するときの初期環境
用例
以下は sudoers エントリの見本である。 正直なところ、いささか凝りすぎの部分もある。 まず最初に継承を許可す
る環境変数をいくつか指定し、 続いて aliases の定義をする。
# sudo 経由で X アプリケーションを実行するとき、HOME は
# .Xauthority ファイルを探すために使用される。ほかのプログラムも
# 設定ファイルを探すのに HOME を使用するので、この指定が
# 権限の昇格を引き起こしかねないことに注意してほしい。
Defaults env_keep += "DISPLAY HOME"
# User alias の指定
User_Alias FULLTIMERS = millert, mikef, dowdy
User_Alias PARTTIMERS = bostley, jwfox, crawl
User_Alias WEBMASTERS = will, wendy, wim
# Runas alias の指定
Runas_Alias OP = root, operator
Runas_Alias DB = oracle, sybase
Runas_Alias ADMINGRP = adm, oper
# Host alias の指定
Host_Alias SPARC = bigtime, eclipse, moet, anchor :\
SGI = grolsch, dandelion, black :\
ALPHA = widget, thalamus, foobar :\
HPPA = boa, nag, python
Host_Alias CUNETS = 128.138.0.0/255.255.0.0
Host_Alias CSNETS = 128.138.243.0, 128.138.204.0/24, 128.138.242.0
Host_Alias SERVERS = master, mail, www, ns
Host_Alias CDROM = orion, perseus, hercules
# Cmnd alias の指定
Cmnd_Alias DUMPS = /usr/bin/mt, /usr/sbin/dump, /usr/sbin/rdump,\
/usr/sbin/restore, /usr/sbin/rrestore
Cmnd_Alias KILL = /usr/bin/kill
Cmnd_Alias PRINTING = /usr/sbin/lpc, /usr/bin/lprm
Cmnd_Alias SHUTDOWN = /usr/sbin/shutdown
Cmnd_Alias HALT = /usr/sbin/halt
Cmnd_Alias REBOOT = /usr/sbin/reboot
Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, \
/usr/local/bin/tcsh, /usr/bin/rsh, \
/usr/local/bin/zsh
Cmnd_Alias SU = /usr/bin/su
Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less
以下では、コンパイル時に埋め込まれたデフォルト値のいくつかを変更している。 sudo には syslog(3) 経由でログ
を記録し、 ファシリティにはすべての場合に auth を使用させたい。 フルタイムのスタッフには sudo の訓戒を出
さないようにしたい。 ユーザ millert はパスワードを入力しないでよい。 コマンドを root として実行するとき
は、 環境変数 LOGNAME, USER, USERNAME を変更したくない。さらに、 SERVERS という Host_Alias に属するマシン
では、 ローカルなログファイルを副本として作り、 ログの記入事項は数年に渡って保存されるので、 ログの各行に
間違いなく年度が入るようにする。 最後に PAGERS という Cmnd_Alias に属するコマンド (/usr/bin/more,
/usr/bin/pg, /usr/bin/less) については、 シェル・エスケープを無効にする。
# built-in defaults の変更
Defaults syslog=auth
Defaults>root !set_logname
Defaults:FULLTIMERS !lecture
Defaults:millert !authenticate
Defaults@SERVERS log_year, logfile=/var/log/sudo.log
Defaults!PAGERS noexec
ユーザ設定が、誰が何を実行できるかを実際に決めている部分だ。
root ALL = (ALL) ALL
%wheel ALL = (ALL) ALL
root と wheel グループのすべてのユーザには、 どのホストでも任意のユーザとしていかなるコマンドでも実行する
ことを認める。
FULLTIMERS ALL = NOPASSWD: ALL
フルタイムのシステム管理者 (millert, mikef, dowdy) は、どのホストでも任意のコマンドを認証なしで実行でき
る。
PARTTIMERS ALL = ALL
パートタイムのシステム管理者 ((bostley, jwfox, crawl) は、どのホストでも任意のコマンドを実行できるが、 そ
の際に認証をしなければならない (このエントリには NOPASSWD タグが指定されていないので)。
jack CSNETS = ALL
ユーザ jack は、CSNETS というエイリアスに属するマシンで、任意のコマンドを実行できる (すなわち、ネットワー
クが 128.138.243.0, 128.138.204.0, 128.138.242.0 のマシンだ)。この内、128.138.204.0 にのみ class C のネッ
トワークであることを示す明示的な (CIDR 表記の) netmask がある。CSNETS のほかのネットワークについては、
ローカルマシンの netmask がマッチングの際に使われることになる。
lisa CUNETS = ALL
ユーザ lisa は、エイリアスが CUNETS のいかなるホストでも、 任意のコマンドを実行することができる (すなわ
ち、 128.138.0.0 という class B ネットワークのマシンだ)。
operator ALL = DUMPS, KILL, SHUTDOWN, HALT, REBOOT, PRINTING,\
sudoedit /etc/printcap, /usr/oper/bin/
ユーザ operator は、 用途が簡単な保守管理に限定されたコマンドを実行できる。この場合それは、 バックアップ
したり、プロセスを kill したり、印刷システムを操作したり、 システムをシャットダウンしたりするのに関係する
コマンドと、 /usr/oper/bin/ ディレクトリにある任意のコマンドである。
joe ALL = /usr/bin/su operator
ユーザ joe は、su(1) を使って operator になることしかできない。
%opers ALL = (: ADMINGRP) /usr/sbin/
opers グループのユーザは、/usr/sbin/ にあるコマンドを、 自分自身の資格で、 Runas_Alias ADMINGRP に属する
任意のグループ (すなわち、adm か oper グループ) として実行できる。
pete HPPA = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
ユーザ pete は、HPPA に属するマシンで root 以外なら誰のパスワードでも変更することを許されている。 上記の
指定は、passwd(1) がコマンドラインで複数のユーザ名を 受け付けないことを前提としている点に注意してほしい。
bob SPARC = (OP) ALL : SGI = (OP) ALL
ユーザ bob は、SPARC や SGI に属するマシンで Runas_Alias OP に登録されている任意のユーザとして (root と
operator である) どんなコマンドでも実行できる。
jim +biglab = ALL
ユーザ jim は、biglab ネットグループに属するマシンで、 どんなコマンドでも実行できる。 sudo は、"biglab"
に '+' の接頭辞が付いているので、 それをネットグループだと認識する。
+secretaries ALL = PRINTING, /usr/bin/adduser, /usr/bin/rmuser
secretaries ネットグループのユーザは、ユーザの追加や削除はもちろん、 プリンタの管理にも協力する必要があ
る。 そこで、すべてのマシンでその種のコマンドの実行を認められている。
fred ALL = (DB) NOPASSWD: ALL
ユーザ fred は、Runas_Alias DB の任意のユーザとして (oracle か sybase だ) パスワードを入力しないでもコマ
ンドを実行することができる。
john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*
ユーザ john は、ALPHA に属するマシンで su(1) を使って root 以外の誰にでもなることができるが、 su にオプ
ションを指定することは許されていない。
jen ALL, !SERVERS = ALL
ユーザ jen は、Host_Alias SERVERS に属するマシン (master, mail, www, ns) を除くいかなるマシンでも、 任意
のコマンドを実行できる。
jill SERVERS = /usr/bin/, !SU, !SHELLS
jill は、Host_Alias SERVERS のいかなるマシンでも /usr/bin/ ディレクトリにある任意のコマンドを実行できる
が、 SU や SHELLS という Cmnd_Aliases に属するコマンドは実行できない。
steve CSNETS = (operator) /usr/local/op_commands/
ユーザ steve は、ディレクトリ /usr/local/op_commands/ にある任意のコマンドを実行できるが、 operator とい
うユーザとして実行できるだけだ。
matt valkyrie = KILL
matt も、自分用のワークステーション valkyrie で、ハングしたプロセスの kill ぐらいはできる必要がある。
WEBMASTERS www = (www) ALL, (root) /usr/bin/su www
ホスト www で User_Alias WEBMASTERS に属するいかなるユーザも (will, wendy, wim だ)、ユーザ www (web ペー
ジの所有者) として任意のコマンドを実行することができる。 単に su(1) で www になってもよい。
ALL CDROM = NOPASSWD: /sbin/umount /CDROM,\
/sbin/mount -o nosuid\,nodev /dev/cd0a /CDROM
いかなるユーザも、Host_Alias が CDROM のマシンで (orion, perseus, hercules)、パスワードを入力することなく
CD-ROM をマウント、アンマウントできる。 上記のコマンドを打ち込むのはユーザにとっていささか面倒なので、
シェルスクリプトとしてカプセル化してしまうのがよいだろう。
[訳注]: 当然と言えば当然だが、sudo は自ホストの /etc/sudoers しか読まないし、 制御の及ぶ範囲も自ホストだ
けである。そこで、こういうことになる。 AAA というホストに aaa というユーザがいるとしよう。 ホスト
AAA の /etc/sudoers に「ホスト BBB でユーザ aaa は sudo を介して /bin/ls を実行できる」という記述
があったとしても、 ユーザ aaa がホスト AAA から telnet や ssh でホスト BBB にログインし、 BBB 上
で sudo を使って ls を実行できるわけではない。それができるためには、 ホスト BBB の /etc/sudoers
に「BBB でユーザ aaa は sudo を介して /bin/ls を実行できる」という記述がなければならないのだ。 ホ
スト BBB で実行する sudo は BBB の sudo であり、 BBB の sudo は BBB の /etc/sudoers しか読まない
のだから。
それでは、何故、上記の「用例」で自ホスト以外の設定が行われているのか? そもそも、sudoers の書式で
自ホスト以外のホストを指定できるのは、 何故なのか? ホストに ALL を指定できるのは、何故なのか?
それは、管理しているサイトのすべてのホストの設定を記した sudoers ファイルを一つ作って、それをすべ
てのホストにコピーして使う、 そういった使い方を想定しているからだ。 もし、サイト中のすべてのホス
トの設定を一ヶ所にまとめて置き、 それをすべてのホストに共有させたいのなら (すなわち、sudo の設定
の集中管理がしたいのなら)、 LDAP の採用を考えるべきである。
セキュリティに関する注意点
一般的に言って、演算子 '!' を使用して ALL からコマンドの「引き算」をするのは、あまり有力な方法ではない。
ユーザは実行したいコマンドを名前を変えてコピーし、 それからそれを実行するといった簡単な方法で、裏をかくこ
とができるからだ。 たとえば、
bill ALL = ALL, !SU, !SHELLS
という行は、SU や SHELLS に列記されているコマンドの bill による実行を、 本当に阻止することにはならな
い。なぜなら、 bill としては、そうしたコマンドを単に名前を変えてコピーすればよいし、 エディタやほかのプロ
グラムからシェル・エスケープを利用することもできるからだ。 だから、この種の制限はやった方がまし程度に考え
ておくべきである (そして、しっかりした運用方針によって制限の実効力を上げるべきだ)。
さらに言うと、fast_glob オプションが使われている場合、 パス名に glob 文字 (ワイルドカードとも言う) が含ま
れるコマンドを間違いなく無効にすることは不可能である。 その理由は、C ライブラリの fnmatch(3) 関数が相対パ
スを解決することができないからだ。 このことは、権限を許可するルールにとっては、 たいていの場合不便なだけ
にすぎないが、権限を減らしたり、 取り消したりするルールにとっては、セキュリティ上の問題をもたらしかねな
い。
たとえば、sudoers に以下のエントリがあるとしよう。
john ALL = /usr/bin/passwd [a-zA-Z0-9]*, /usr/bin/chsh [a-zA-Z0-9]*,
/usr/bin/chfn [a-zA-Z0-9]*, !/usr/bin/* root
fast_glob が有効になっていると、john はこれでも /usr/bin/passwd root を実行できてしまう。 /usr/bin にカレ
ント・ディレクトリを移動して、 ./passwd root と打ち込めばよいのだ。
シェル・エスケープを防止する
sudo があるプログラムを実行した場合、そのプログラムは、 ほかのプログラムの実行も含めて、何でも自由に好き
なことができる。 このことがセキュリティ上の問題になりかねないのは、 プログラムがシェル・エスケープを許し
ているのは珍しいことではなく、 そのために、ユーザが sudo のアクセス制御やロギングをすり抜けることが可能に
なるからだ。 よく使うプログラムでシェル・エスケープを許しているものには、 次のようなものがある。 (当然な
がら) シェル、エディタ、ページャ、メーラ、ターミナルなど。
この問題に対処するには、基本的に二つの方法がある。
制限 ユーザに任意のコマンドの実行を許すようなコマンドに対して、 ユーザがアクセスできないようにす
る。エディタの場合は、制限モードと称して、 シェル・エスケープが使えないモードを持っているものも
多い。 とは言え、sudo 経由でエディタを使うのなら、 sudoedit を使用する方がより優れた対策であ
る。 シェル・エスケープを提供するプログラムはたくさんあるので、 それを提供しないプログラムのみ
を使用するようにユーザを制限するのは、 たいてい実現不可能である。
noexec 共有ライブラリをサポートしている多くのシステムには、環境変数 (たいていは LD_PRELOAD) で別の共有
ライブラリを指定することによって、 デフォルトのライブラリ関数を置き換える能力がある。 そういっ
たシステムでは、sudo の noexec 機能を使えば、 sudo から実行されるプログラムが、 何かほかのプロ
グラムを実行するのを防ぐことができる。 とは言え、これが当てはまるのは、 動的にリンクされたネイ
ティブなプログラムだけだということに留意してほしい。 静的にリンクされたプログラムや、 バイナ
リ・エミュレーションのもとで動くほかの OS のプログラムには効果がない。
noexec 機能は SunOS, Solaris, *BSD, Linux, IRIX, Tru64 UNIX, MacOS X, HP-UX 11.x、それに 5.3 以
上の AIX で使えることがわかっている。環境変数 LD_PRELOAD をサポートしているたいていのオペレー
ティングシステムが、 この機能に対応しているはずだ。 使用しているオペレーティングシステムのマ
ニュアルページを調べて、 ダイナミック・リンカについて (通例 ld.so, ld.so.1, dyld, dld.sl, rld,
loader といった名前になっている) LD_PRELOAD がサポートされているかどうか確認していただきたい。
Solaris 10 以上の場合、noexec は 環境変数 LD_PRELOAD ではなく、Solaris 特権を使用している。
あるコマンドに対して noexec を有効にするには、 上記「ユーザ設定」セクションで述べたように、
NOEXEC タグを使用する。そのときの例を再掲しよう。
aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
この例では、ユーザ aaron 対して、noexec を有効にした上で、 /usr/bin/more と /usr/bin/vi の実行
を許可している。 このようにすれば、この二つのコマンドから (シェルのような) ほかのコマンドを実行
することができなくなるわけだ。 使用しているシステムが noexec に対応する能力があるかどうか よく
わからない場合でも、取りあえず試してみることなら、いつだってできる。 noexec を有効にして、 シェ
ル・エスケープが可能かどうか確かめてみればよいのだ。
注意してほしいが、シェル・エスケープの禁止は万能薬ではない。 ルートの権限で動いているプログラムには、ほか
にも、危険性のあるさまざまな作業 (ファイルの中身を変更するとか、上書きしてしまうとか) が可能であり、 思い
がけずに権限を拡大してしまうこともありえるのだ。特にエディタについて言うと、 ユーザには sudoedit を実行す
る許可を与えるのが、より安全な方法である。
デバッグ・フラグ (sudo-1.8.4 の新機能)
バージョン 1.8.4 以上の sudoers プラグインは、 デバッグのための枠組みに対応しており、 問題が発生したと
き、プラグインの内部で何が起きているかを突き止めるために、 それを利用することができる。 その設定
は、sudo(8) のマニュアルでも説明したように、 /etc/sudo.conf ファイルで行うことが可能だ。
sudoers プラグインは、 sudo そのものと同じデバッグ・フラグの書式を使用する。 すなわち、subsystem@priority
である。
sudoers が使用する priority (重大度) を深刻なものから挙げると、 crit, err, warn, notice, diag, info,
trace, debug である。ある priority を指定すると、 それより深刻なすべての priority も併せて指定したことに
なる。 たとえば、notice という priority を指定すれば、 notice レベル以上のデバッグメッセージがログに記録
されるわけである。
sudoers では以下のサブシステムが使用できる。
alias User_Alias, Runas_Alias, Host_Alias, Cmnd_Alias の処理
all あらゆるサブシステムにマッチする
audit Solaris BSM (Basic Security Module) と Linux の監査コード
auth ユーザの認証
defaults sudoers の Defaults 設定
env 環境の取扱い
ldap LDAP を使用する sudoers
logging ロギングのサポート
match sudoers におけるユーザ、グループ、ホスト、 ネットグループのマッチング
netif ネットワークインターフェースの取扱い
nss sudoers におけるネームサービス・スイッチの取扱い
parser sudoers ファイルの解析
perms パーミッションの設定
plugin プラグインにとって main に相当する
pty 擬似 tty に関連したコード
rbtree 赤黒木 (redblack tree) の内部情報
util ユーティリティ関数群
セキュリティに関する注意点
sudoers はタイムスタンプ・ディレクトリ (デフォルトでは /var/lib/sudo) の所有者を調べて、所有者が root で
なかったり、 root 以外のユーザにも書き込み可能だったりする場合には、 そのディレクトリの内容を無視す
る。root 以外のユーザでも chown(2) を利用して、ファイルの所有者を変えられるシステムでは、 タイムスタン
プ・ディレクトリが (たとえば、/tmp といった) 誰にでも書き込めるディレクトリにあると、一般ユーザが、sudo
を実行する前にタイムスタンプ・ディレクトリを作成することが可能になる。もっとも、 sudoers はタイムスタン
プ・ディレクトリとその中身の、 所有者とモードをチェックするので、起こりえる唯一の被害は、 ファイルを「隠
匿」する目的でそのディレクトリに入れておかれることぐらいだ。 これはあまりありそうにないことである。 なぜ
なら、タイムスタンプ・ディレクトリが root の所有になり、 ほかのユーザによるアクセスが禁じられてしまうと、
ファイルをそこに置いたユーザは、それを回収できなくなるからだ。
sudoers はあまりにも未来に設定されたタイムスタンプを認めない。 タイムスタンプが「現在時 + 2 * TIMEOUT」
より新しい日時だった場合、そのタイムスタンプは無視され、 sudo がログに記録して、警告を発する。このように
なっているのは、 一般ユーザがファイルの所有者を変えられるシステムで、 タイムスタンプ・ディレクトリが誰に
でも書き込めるディレクトリにある場合に、 ユーザがいい加減な日付を付けて勝手に自分のタイムスタンプを作れな
いようにするためである。
ブートタイムを参照できるシステムでは、 タイムスタンプがマシンがブートするよりも前の日時になっている場合、
sudoers はそれを無視する。
タイムスタンプ・ファイルはファイルシステム中に作られるので、 ユーザのログイン・セッションが終わって
も、残っている。 そのため、次のようなことが起こりえる。ユーザがログインし、 認証してから sudo を使ってコ
マンドを実行して、ログアウトする。 再びログインして、認証なしで sudo を実行する。 タイムスタンプ・ファイ
ルの内容更新日時 (modification time) が 5 分以内であれば (あるいは、sudoers で設定されたタイムアウト時間
以内であれば)、 そういうことが可能になってしまうのだ。 tty_tickets オプションが有効になっている場合、 タ
イムスタンプは tty ごとに別々に作られるが、 それでも、ユーザセッションが終わった後まで生き残ってしま
う。devpts ファイルシステムを使用している Linux や、devices ファイルシステムを持つ Solaris、 それに、デバ
イスを作成するごとに、その inode 番号をひたすら増やしていく devfs ファイルシステムを利用しているシステム
(たとえば、Mac OS X) では、 tty ごとのタイムスタンプ・ファイルがいつ用済みになるかを判定することができる
ので、 sudoers はそうしたタイムスタンプ・ファイルを無視することになる。 だが、システムの管理者はこの機能
を当てにしない方がよい。 どのシステムでも利用できるとはかぎらないからだ。
もし ユーザに許可するコマンドが ALL になっているならば、 ユーザが自分でプログラムを作って (あるいは、シェ
ルを自分専用に別の名前でコピーして)、 ルート・シェルを獲得するのを防ぐことはできない。 ユーザ設定でどんな
項目に '!' を付けようとも防止不可能である。
関連項目
rsh(1), su(1), fnmatch(3), glob(3), mktemp(3), strftime(3), sudoers.ldap(5), sudo_plugin(8), sudo(8),
visudo(8)
警告
sudoers ファイルの編集には、必ず visudo コマンドを使うべきだ。 そうすれば、visudo がファイルをロック
し、文法のチェックをやってくれる。 sudoers ファイルに文法的な間違いがあると、sudo が動かないので、
sudoers ファイルには文法エラーが絶対にあってはならないのだ。
ネットグループを (ユーザについてではなく) マシンについて使用し、 netgroup ファイルに完全修飾ホスト名を記
載する場合は (たいていそうするものだが)、そのマシンのホスト名を hostname コマンドが出力する通りの完全修飾
名で書くか、 さもなければ、sudoers ファイルで fqdn オプションを使うかしなければならない。
バグ
sudo にバグを発見したと思ったら、下記のページにアクセスして、 バグレポートを提出していただきたい。
http://www.sudo.ws/sudo/bugs/
サポート
ある程度の無料サポートが sudo-users メーリングリストを通して利用できる。 購読やアーカイブの検索には下記
URL を御覧になること。
http://www.sudo.ws/mailman/listinfo/sudo-users
免責
sudo は「現状のまま」提供される。 明示的な、あるいは黙示的ないかなる保証も、 商品性や特定目的への適合性に
ついての黙示的な保証を含め、 またそれのみに止まらず、これを否認する。詳細な全文については、 sudo と一緒に
配布されている LICENSE ファイルや、 下記 Web ページを御覧いただきたい。
http://www.sudo.ws/sudo/license.html
1.8.4 February 5, 2012 SUDOERS(5)