Provided by: manpages-ja_0.5.0.0.20221215+dfsg-1_all
名前
sudoers - sudo のデフォルトのセキュリティポリシー・プラグイン
説明
sudoers ポリシー・プラグインは、ユーザにどんな sudo 権限があるかを決定する。 このプラグイ ンが sudo のデフォルトのポリシー・プラグインである。 ポリシーの運用は /etc/sudoers ファイ ルによって行われるが、 LDAP を使用することも可能である。ポリシーを設定するときの書式は、 「SUDOERS ファイルの書式」セクションで詳しく説明している。 sudoers ポリシーの情報を LDAP に格納することについては、 sudoers.ldap(5) をご覧いただきたい。 sudoers ポリシー・プラグインを使うための sudo.conf の設定 sudo は sudo.conf(5) ファイルを参照して、 どのポリシー・プラグインと入出力ロギング・プラグ インをロードするかを決める。 sudo.conf(5) ファイルが存在しない場合や、存在しても Plugin 行 を含まない場合は、 sudoers プラグインがポリシーの決定や 入出力ロギングに使用されることにな る。 sudoers プラグインを使用するように明示的に設定するには、 sudo.conf(5) に次のよう書き 込めばよい。 Plugin sudoers_policy sudoers.so Plugin sudoers_io sudoers.so sudo 1.8.5 以来、sudoers プラグインに対する任意の引き数を sudo.conf(5) で指定することが可 能になっている。 そうした引き数が存在する場合は、プラグインのパスの後ろに続けることになる (すなわち、sudoers.so の後ろだ)。 引き数がいくつもあるときは、ホワイトスペースで区切って指 定すればよい。 一例を挙げる。 Plugin sudoers_policy sudoers.so sudoers_mode=0400 以下のプラグインに対する引き数が使用できる。 ldap_conf=pathname ldap_conf 引き数を使用すると、 ldap_conf ファイルのパスをデフォルトのものから変 更することができる。 ldap_secret=pathname ldap_secret 引き数を使用すると、 ldap_secret ファイルのパスをデフォルトのものか ら変更することができる。 sudoers_file=pathname sudoers_file 引き数を使用すると、 sudoers ファイルのパスをデフォルトのものから変 更することができる。 sudoers_uid=uid sudoers_uid 引き数を使用すると、 sudoers ファイルの所有者をデフォルトのものから 変更することができる。 指定には、ユーザ ID 番号を使うべきである。 sudoers_gid=gid sudoers_gid 引き数を使用すると、 sudoers ファイルのグループをデフォルトのものか ら変更することができる。 指定には、グループ ID 番号を使用しなければならない (グ ループ名ではない)。 sudoers_mode=mode sudoers_mode 引き数を使用すると、 sudoers ファイルのファイル・モードをデフォルト のものから変更することができる。 指定には、8 進数の値を使うべきである。 sudo.conf(5) の設定についてさらに詳しいことをお知りになりたかったら、 sudo.conf(5) のマ ニュアルをご覧になっていただきたい。 ユーザの認証 sudoers セキュリティポリシーでは、ユーザはたいていの場合、 本人であることを証明してからで なければ。sudo を使用できない。ただし、 sudo の実行者が root だったり、変身対象ユーザが sudo の実行者と同一であったり、 ポリシーがその実行者やコマンドに対して認証を免除している場 合は、パスワードが要求されることはない。 su(1) とは違って、sudoers ポリシーが認証に当たっ てチェックするのは、 sudo を実行するユーザの認証情報 (訳注: 通常はパスワード) であって、 変身対象ユーザの (あるいは、root の) 認証情報ではない。この動作は、後述する rootpw, targetpw, runaspw フラグによって変更することができる。 ポリシーに登録されていないユーザが sudo を使って、コマンドを実行しようとすると、 しかるべ き権威者にメールが送付される。そうしたメールの宛先は、 後述する「デフォルト設定」の mailto 行によって設定できるが、 デフォルトでは root になっている。 sudo を使用する権限のないユーザが、-l や -v オプションを付けて sudo の実行を試みても、認証 に失敗し、しかも mail_always または mail_badpass フラグが有効になっている場合を除いて、 メールは送付されないことに注意していただきたい。そうした動作にすることで、自分に sudo の使 用が許可されているかどうか、ユーザが自分で判断できるようにしているのである。 sudo 実行の試 みは (成功、失敗にかかわらず)、すべてログに記録される。 メールが送られるかどうかには関係が ない。 sudo が root によって実行されたとき、環境変数 SUDO_USER が設定されていると、 sudoers ポリ シーは、実際のユーザが誰かを判断するのに、その値を使用することになる。 ユーザとしては、こ の動作を利用することで、すでにルートシェルを起動している場合でも、 自分が sudo を介して実 行したコマンドのログを取ることができる。 また、この動作のおかげで、sudo で実行するスクリプ トやプログラムから呼び出される場合でさえ、 -e オプションが役に立つものになっている。ただ し、そうした場合でも、 sudoers ファイルの参照はやはり root に対してなされるのであって、 SUDO_USER が指定しているユーザに対してではないことに注意していただきたい。 sudoers は、認証情報の一時保存 (credential caching) にユーザごとのタイムスタンプ・ファイル を使用する。 ユーザの認証が済むと、記録が書き込まれるが、それには、認証に使用された uid、 端末セッション ID、タイムスタンプ (利用できるならば、単調増加時計 (monotonic clock) を使用 する) が含まれている。ユーザは、その後しばらくの間 (timestamp_timeout オプションによって変 更されていなければ、5 分間)、パスワードなしで sudo を使うことができる。 sudoers はデフォル トでは、各 tty ごとに別の記録を使用する。 そこで、認証は、ユーザのログイン・セッションごと に独立して行われることになる。 tty_tickets オプションを無効にすれば、あるユーザのすべての セッションに対して、 単一のタイムスタンプの使用を強制することができる。 ロギング sudoers は sudo の実行が成功したときも失敗したときも、 その旨を (エラーの内容とともに) syslog(3) や独自のファイル、 あるいはその両方に記録することができる。sudoers はデフォルト では、 syslog(3) 経由でログを記録することになっているが、この動作はデフォルト設定の syslog と logfile を使って変更することができる。 ログファイルの書式については、「ログの書式」セク ションの説明をご覧いただきたい。 また sudoers は、擬似 tty でコマンドを実行して、 すべての入力や出力をログに記録することも できる。 標準入力、標準出力、標準エラーが端末と結びついていない場合でさえ、 それをログに記 録することができるのだ。入出力ロギングは、デフォルトでは ON になっていないが、 log_input や log_output オプションを使って有効にすることができる。 コマンド・タグの LOG_INPUT や LOG_OUTPUT を使用して有効にすることも可能だ。 入出力ログファイルがどんなふうに格納されるか については、 「入出力ログファイル」セクションに詳細な説明がある。 コマンド環境 環境変数はプログラムの動作に影響を与えることがあるので、sudoers は、 実行されるコマンドが ユーザの環境からどんな変数を引き継ぐかについて、 制御する手段を用意している。すなわ ち、sudoers は二つの異なった方法で、 環境変数を処理することができる。 デフォルトでは env_reset オプションが有効になっている。 この場合、コマンドは新しい、最小の 環境で実行されることになる。 AIX (及び PAM を使用していない Linux システム) で は、/etc/environment ファイルの内容で環境が初期化される。新しい環境には、TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME, 及び SUDO_* という変数、 それに、呼び出し側のプロセ スから来た変数で、env_check や env_keep オプションによって許可されたものが含まれている。こ れは、言わば、 環境変数のホワイトリストである。値が () で始まる環境変数は、 変数名と値の両 方が env_keep や env_check の指定にマッチしないかぎり、 除去されるが、それは、bash シェル の古いバージョンでは関数と解釈されることになるからである。 1.8.11 より前のバージョンで は、そうした変数は無条件で除去されていた。 これに対して、env_reset オプションが無効になっている場合は、 env_check や env_delete オプ ションによって明示的に拒否されていないかぎり、 いかなる環境変数も呼び出し側のプロセスから 継承される。 この場合、env_check や env_delete は、ブラックリストのように振る舞うわけだ。 値が () で始まる環境変数は、ブラックリストの一つにマッチしない場合でも、 必ず除去され る。危険性のある環境変数のすべてをブラックリストに載せることは不可能なので、 env_reset を 有効にしておくデフォルトの動作を採用することをお勧めする。 デフォルトでは、環境変数のマッチは変数名によって行われる。 しかしながら、マッチに使われる パターンに等号 ('=') が含まれる場合は、 変数名と値の両方がマッチしなければならない。たとえ ば、旧式の (shellshock 問題以前の export 方法による) bash のシェル関数にマッチさせるなら ば、次のように指定すればよいだろう。 env_keep += "my_func=()*" 旧式の bash のシェル関数は、デフォルトでは保存されないので、 "=()*" という後続部分がなかっ たら、こうした環境変数はマッチしないことになる。 [訳注]: shellshock 以前の bash では、たとえば "my_func='() { ls -F; }'" といったシェル変数 を export することで、 my_func という関数をサブシェルに渡すことができた。 shellshock 以後の bash では、この方法による関数の継承はできなくなり、 値が "() { ls -F; }" である my_func という変数が、 渡されるだけになっている。だから、 sudoers ファイルの Defaults 行に上のように書いても、 shellshock 以後の bash を使っているか ぎり、 my_func という環境変数が保存されるだけで、関数が渡されるわけではない。 sudo が許可、または拒否する環境変数すべてのリストは、"sudo -V" を root の資格で実行したと きの出力中に含まれている。このリストは、 sudo が実行されるオペレーティングシステムによって 異なることに気をつけていただきたい。 PAM をサポートしているシステムで、pam_env モジュールが sudo に対して有効になっていると、 PAM の管理する環境にある変数が、環境にマージされることになるだろう。 ただし、PAM 環境にあ る変数がユーザの環境にすでに存在している場合に、 その値が上書きされることになるのは、 その 変数が sudoers によって保存されていないときだけである。 すなわち、env_reset が有効になって いるときは、 env_keep のリストによって sudo を実行するユーザの環境から保存された変数が、 PAM 環境にある変数より優先される。また、 env_reset が無効になっているときは、 sudo を実行 するユーザの環境にある変数が、 env_delete のリストのパターンにマッチしていないかぎり、 PAM 環境にある変数よりも優先されるのである。 たいていのオペレーティングシステムのダイナミック・リンカは、 ダイナミック・リンキングを制 御する働きがある環境変数を、 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 は、変身対象ユーザのそれにセットされる。ATX (及び PAM を使用していない Linux システム) では、/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 (それぞれ、接頭辞 '%' と '%#' が付く)、 ネットグループ名 (接頭辞 '+' が付く)、 non-Unix グループ名やその ID (それぞれ、接頭辞 '%:' と '%:#' が付 く)、 それに User_Alias。 リストの各項目の前には一個以上の '!' 演算子を付けてもよい。 奇数 個の '!' はその項目の値を否定する。偶数個の場合は互い相殺されるだけだ。 なお、ユーザのネッ トグループについては、 ネットグループの成員中のユーザとドメインの要素のみを使って、マッチ ングが行われる。 ホストの要素はマッチングに使用されない。 ユーザ名、uid、グループ名、gid、ネットグループ名、non-Unix グループ名、 non-Unix グループ の gid は、ダブルクォートで囲めば、特殊文字をエスープしないですむ。 ダブルクォートで囲まず に特殊文字を使いたいなら、エスケープした 16 進数を指定してやればよい。 たとえば、スペース なら \x20 という具合だ。 ダブルクォートを使用する場合は、接頭辞があれば、それをダブル クォートの内側に入れなければならない。 non-Unix グループやその gid を指定するときのの書式が、 実際にどんなものになるかは、 利用す るグループ・プロバイダー・プラグイン (group provider 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" というホスト名がマッチするのは、 それが実際の ホスト名であるときだけであり、 それは通常、ネットワークにつながっていないシステムの場合に しか当てはまらない。 digest ::= [A-Fa-f0-9]+ | [[A-Za-z0-9+/=]+ Digest_Spec ::= "sha224" ':' digest | "sha256" ':' digest | "sha384" ':' digest | "sha512" ':' digest Cmnd_List ::= Cmnd | Cmnd ',' Cmnd_List command name ::= file name | file name args | file name '""' Cmnd ::= Digest_Spec? '!'* command name | '!'* directory | '!'* "sudoedit" | '!'* Cmnd_Alias Cmnd_List は一個以上の、コマンド名、ディレクトリ、 他のエイリアスからなるリストである。コ マンド名は絶対パスのファイル名であり、 シェル風のワイルドカードを含んでいても構わない(下記 の「ワイルドカード」セクションを参照)。 単にファイル名だけ指定した場合、 ユーザはお望みの どんな引き数でも付けてそのコマンドを実行することができる。 とは言え、コマンドライン引き数 を (ワイルドカードを含めて) 指定しても構わないし、また、引き数に "" を指定して、そのコマン ドは、 コマンドライン引き数を付けずに実行することしかできないと指示することもできる。 ディ レクトリは '/' で終わる絶対パス名である。 Cmnd_List にディレクトリを指定すると、 ユーザー はそのディレクトリ内の任意のファイルを実行できるようになる (だが、そのサブディレクトリにあ るファイルは実行できない)。 Cmnd がコマンドライン引き数を伴っている場合は、 Cmnd 中の引き数は、 ユーザがコマンドライン で打ち込む引き数と正確に一致しなければならない (Cmnd 中の引き数にワイルドカードがあるなら ば、 それがコマンドラインの引き数とマッチしなければならない)。 以下に挙げる文字をコマンド 引き数の中で用いるときは、 '\' によってエスケープしなければならないことに注意していただき たい。 ',', ':', '=', '\' がそれである。 Cmnd に "sudoedit" という sudo の組み込みコマンド を指定すると、 ユーザに sudo を -e オプション付きで (あるいは、sudoedit というコマンド名 で) 実行することを許可することになる。 この場合、コマンドライン引き数も指定することができ るのは、 普通のコマンドとまったく同様だ。 "sudoedit" は、sudo そのものに組み込まれたコマン ドなので、sudoers ファイルではパスを前に付けずに指定しなければならないことに注意していただ きたい。 コマンド名の前に Digest_Spec が付いている場合、コマンドのマッチに成功するのは、 指定された SHA-2 ダイジェストを使って照合できたときだけである。 ダイジェストのフォーマットとしては、 sha224, sha256, sha384, sha512 をサポートしている。 文字列は、16 進数形式でも base64 形式 でも指定できる (base64 の方が短くて済む)。 SHA-2 ダイジェストを 16 進数形式で生成できる ユーティリティはいくつかある。 openssl, shasum, sha224sum, sha256sum, sha384sum, sha512sum といったものがそうだ。 たとえば、openssl を使うなら、 $ openssl dgst -sha224 /bin/ls SHA224(/bin/ls)= 118187da8364d490b4a7debbf483004e8f3e053ec954309de2c41a25 openssl を使って、base64 の出力を生成することもできる。 $ openssl dgst -binary -sha224 /bin/ls | openssl base64 EYGH2oNk1JC0p9679IMATo8+BT7JVDCd4sQaJQ== 注意: もしユーザがコマンドそのものに対して (直接であれ、sudo コマンドを通してであれ) 書き 込み権限を持っているならば、そのユーザは、ダイジェストチェックが済み、 コマンドが実行され るまでの間に、コマンドを別のものに置き換えることができるかもしれない。 同様の競合状態 が、fexecve(2) システムコールを持っていないシステムでは、 コマンドが存在するディレクトリが ユーザによって書き込み可能であるときに起こりえる。 コマンド・ダイジェストをサポートしているのは、バージョン 1.8.7 以上だけである。 デフォルト設定 (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? SELinux_Spec? Tag_Spec* Cmnd Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')' SELinux_Spec ::= ('ROLE=role' | 'TYPE=type') Tag_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' | 'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' | 'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | 'PASSWD:' | 'NOPASSWD:' | 'SETENV:' | 'NOSETENV:') ユーザ設定は、あるユーザが、指定されたホストで (どのユーザに変身して) どのコマンドを実行で きるかを決定する。デフォルトでは、コマンドは 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_Lists が両方と も空の場合は、 sudo を実行するユーザの資格でしかコマンドを実行できない。 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 に設定することも自由である。 SELinux_Spec SELinux をサポートするシステムでは、sudoers ファイルのエントリで SELinux の role や type をコマンドに関連付けることも可能である。 role や type を特定のコマンドについて指定すると、 sudoers 中でデフォルトとして設定されている role や type があっても、 それよりも優先され る。もっとも、role や type をコマンドラインで指定すれば、 そちらが sudoers 中の値よりさら に優先されることになる。 Tag_Spec コマンドは 0 個以上のタグを伴うことができる。使用できるタグの値は 14 個あり、 EXEC, NOEXEC, FOLLOW, NOFOLLOW, LOG_INPUT, NOLOG_INPUT, LOG_OUTPUT, NOLOG_OUTPUT, MAIL, NOMAIL, PASSWD, NOPASSWD, SETENV, NOSETENV が、それである。 ある Cmnd にタグをセットすると、 Cmnd_Spec_List 中のそれ以後の Cmnd は、 反対の意味を持つタグによって変更されないかぎり、そ のタグを継承することになる (すなわち、PASSWD は NOPASSWD を無効にし、NOEXEC は EXEC を無効 にする)。 EXEC と NOEXEC sudo が noexec サポートつきでコンパイルされ、 使用しているオペレーティングシステムがそれ に対応している場合、NOEXEC タグを利用すれば、 動的にリンクされた実行ファイルが、そこから さらにコマンドを実行するのを防ぐことができる。 次の例では、ユーザ aaron は /usr/bin/more と /usr/bin/vi を実行できるが、シェル・エス ケープは利用できない。 aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi NOEXEC がどんなふうに働くのか、お使いのシステムで利用できるかどうか、 などについてさらに 詳しく知りたかったら、 後述の「シェル・エスケープの防止」セクションを御覧になるとよい。 FOLLOW と NOFOLLOW バージョン 1.8.15 以来、sudoedit は、 sudoedit_follow オプションが有効になっていないかぎ り、 ファイルがシンボリックリンクならば、それを開かないようになっている。 FOLLOW と NOFOLLOW タグは、sudoedit_follow の値を上書きするので、 これを使用すれば、シンボリックリ ンクの編集をコマンドごとに許可したり、 禁止したりすることができる。 この二つのタグが効果 があるのは、sudoedit コマンドに対してのみであり、 他のどんなコマンドに対しても無視され る。 LOG_INPUT と NOLOG_INPUT この二つのタグは log_input オプションの値をコマンドごとに変更する。 詳しい情報について は、後述する「SUDOERS のオプション」セクションの log_input の説明をご覧になっていただき たい。 LOG_OUTPUT と NOLOG_OUTPUT この二つのタグは log_output オプションの値をコマンドごとに変更する。 詳しい情報について は、後述する「SUDOERS のオプション」セクションの log_output の説明をご覧になっていただき たい。 MAIL と NOMAIL この二つのタグを使えば、 mail_all_cmnds オプションの値をコマンドごとに上書きすることに よって、 ユーザがコマンドを実行したときにメールを送付するかどうかについて、 きめ細かな制 御を行うことができる。 sudo が -l や -v オプションを付けて実行されたときには、効果がな い。 NOMAIL は、mail_always や mail_no_perms オプションも上書きする。 詳細については、後 述の「SUDOERS のオプション」セクションにある mail_all_cmnds, mail_always, mail_no_perms の説明をご覧いただきたい。 PASSWD と NOPASSWD デフォルトでは、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 オプションによって変更できる。 SETENV と NOSETENV 上記のタグは setenv オプションの値をコマンドごとに変更する。 あるコマンドに対して SETENV を設定すると、 ユーザがコマンドラインから -E オプションを使用して、 env_reset オプション を無効にできるようになることに注意してほしい。 それだけではない。コマンドラインから設定 する環境変数が env_check, env_delete, env_keep による規制を受けないようにもなる。 それ 故、こうした形で環境変数を設定することを許可するのは、 信用できるユーザだけに限るべきで ある。なお、マッチするコマンドが ALL だった場合は、暗黙のうちに SETENVタグがそのコマンド に付けられるが、 このデフォルトの動作は UNSETENV タグを使えば打ち消すことができる。 ワイルドカード sudoers ファイルでは、ホスト名、コマンドのパス名、 コマンドライン引き数にシェル形式のワイ ルドカード (メタ文字とか glob キャラクタとも言う) が使用できる。ワイルドカードのマッチング は、 IEEE Std 1003.1 ("POSIX.1") で規定されている glob(3) や fnmatch(3) 関数を用いて行われ る。 * 0 個以上の任意の文字 (ホワイトスペースも含む) にマッチする。 ? 任意の 1 文字 (ホワイトスペースも含む) にマッチする。 [...] 指定された範囲の任意の 1 文字にマッチする。 [!...] 指定された範囲以外の任意の 1 文字にマッチする。 \x 'x' がどんな文字であっても、'x' そのものとして評価する。 この表記法は '*', '?', '[', ']' といった特殊文字をエスケープするために使用される。 上記のものは正規表現ではないことに注意していただきたい。 正規表現とは違って、範囲内の文字 一つ以上にマッチさせる方法は存在しない。 使用しているシステムの glob(3) や fnmatch(3) 関数が文字クラスに対応しているなら、 文字クラ スが使用できる。ただし、':' 文字は、 sudoers で特別な意味を持っているので、エスケープしな ければならない。 一例を上げる。 /bin/ls [[\:alpha\:]]* sudoers 中で上のように書けば、アルファベットの文字で始まるどんなファイル名にもマッチするだ ろう。 コマンドのファイル名の部分で使われたワイルドカードはフォワードスラッシュ ('/') にマッチし ないことに注意していただきたい。そこで、次のようなパスは、 /usr/bin/* /usr/bin/who にマッチするが、/usr/bin/X11/xterm にはマッチしない。 だが、コマンドライン引き数の部分のマッチングでは、 ワイルドカードはスラッシュにしっかり マッチする。 コマンドライン引き数には、任意の文字列を含むことが認められており、 パス名しか 許されていないわけではないからだ。 sudoers 中でコマンドライン引き数にワイルドカードを使用するときは、 注意しなければならな い。 コマンドライン引き数は、結合して一つの文字列にした上で、マッチングを行う。 そのため、'?' や '*' といったワイルドカード文字が、 ユーザが指定したコマンドライン引き数と、 単語の境界 をまたいでマッチしてしまうことになるのだ。 これは想定外のことかもしれない。たとえ ば、sudoers に次のような行があると、 %operator ALL = /bin/cat /var/log/messages* 以下のコマンドが実行できることになるが、 $ sudo cat /var/log/messages.1 また、以下のコマンドの実行も可能になってしまう。 $ sudo cat /var/log/messages /etc/shadow 後者は、おそらく意図に反しているだろう。たいていの場合、 コマンドラインの処理は、sudoers ファイルの中ではなく、 スクリプト言語中で行った方が間違いがない。 ワイルドカード・ルールの例外 上記ルールには以下の例外がある。 "" sudoers ファイルのエントリにおいて、空文字列 "" が唯一のコマンドライン引き数だっ た場合は、 そのコマンドは引き数を付けずに実行しなければならないことを意味してい る。 sudoedit 組み込みコマンド sudoedit にコマンドラインで渡す引き数は、 常にパス名であるはず だ。そこで、ワイルドカードはフォワードスラッシュ ('/') にマッチしないようになっ ている (訳注: sudoers 中で sudoedit に対して引き数を指定する場合、 それは一般の コマンドライン引き数と同じ扱いではなく、パス名扱いになるということ)。 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 である。 なお、ファイル名には %h エスケープが使える。これはホスト名の短縮形を示している。 たとえ ば、マシンのホスト名が "xerxes" のとき、 #include /etc/sudoers.%h と書けば、sudo はファイル /etc/sudoers.xerxes をインクルードすることになる。 #includedir 命令を使えば、sudoers.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 演算子として使用することができる。 これによってある値を除外することが可能になるわけ だ。 ただし、'!' 演算子が効果を持つためには、 そこから除外する対象が存在しなければならな い。 たとえば、root 以外のすべてのユーザにマッチさせたい場合は、 次の表現を使用する。 ALL,!root 次のように ALL の記述を省くと、 !root 確かに root を明示的に否定することにはなるが、 他のどんなユーザともマッチすることがない。 この点が、正真の「否定」演算子とは違っている。 とは言え、組込みエイリアス ALL と '!' を組み合わせて、 「二三のコマンド以外のすべての」コ マンドの実行をあるユーザに許可しようとしても、 意図どおりの動きになることはめったにないこ とに気をつけていただきたい (下記の「セキュリティに関する注意点」を参照)。 長い行は、行末にバックスラッシュ '\' を置けば、継続することができる。 リストにおける要素間やユーザ設定における構文用特殊文字 ('=', ':', '(', ')') の前後に空白 (white space) を入れることは、任意である。 次の文字を単語 (ユーザ名とかホスト名とか) の一部として使うときは、 バックスラッシュ ('\') でエスケープしなければならない。 '!', '=', ':', ',', '(', ')', '\' がそれである。
SUDOERS のオプション
すでに説明したように、sudo の動作は Default_Entry 行によって変更することができる。 Defaults に与えることのできるパラメータについて、 サポートされているもののすべてを、タイプ 別にまとめて以下に列挙する。 ブーリアン・フラグ (真偽値) always_query_group_plugin group_plugin の設定がなされている場合に、 %group の形式のグループを解決 するのに、 同名のシステム・グループが同時に存在しないかぎり、 指定された group_plugin を使用する。 always_query_group_plugin が設定されていない通 常の状態では、 %:group の形式のグループのみが group_plugin に渡されるの である。 このフラグはデフォルトでは off である。 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 である。 exec_background デフォルトでは、sudo 自体がフォアグラウンドで実行されているかぎり、 コマ ンドは sudo によってフォアグラウンド・プロセスとして実行される。それに対 して、 exec_background フラグが有効になっている場合は、 コマンドが (入出 力ロギングや use_pty フラグのために) pty で実行されていると、 そのコマン ドはバックグラウンド・プロセスとして実行されることになる。 このとき、そ のコマンドが制御ターミナルから読み込みを行おうとすると (あるいは、ターミ ナルの設定を変更しようとすると)、 コマンドは SIGTTIN シグナル (ターミナ ル設定の場合は SIGTTOU シグナル) によってサスペンドされる。そうしたこと が起きても、 sudo がフォアグラウンド・プロセスならば、 そのコマンドは制 御ターミナルの使用を許可され、 ユーザが何の操作をしないでも、フォアグラ ウンドで実行が再開される。 コマンドの実行をバックグラウンドで始めること の利点は、 そうすれば、コマンドが明示的に要求しないかぎり、 sudo はター ミナルから読み込みを行う必要がないということである。 そうしない場合 は、コマンドが入力を要求しているか否かに関わりなく、 いかなる入力もコマ ンドに渡さなければならないのだ (カーネルがターミナルのバッファリングをし ているので、 コマンドが本当にその入力を必要としているかどうかを、 判断す ることはできないのである)。 この動作は、従来の sudo の動作とは異なってい る。 また、コマンドが pty で実行されていないときの動作とも異なっている。 この動作がシームレスに行われるためには、オペレーティングシステムが、 シ ステムコールの自動的な再スタートをサポートしていなければならない。 残念 なことに、すべてのオペレーティングシステムが、 デフォルトでそれを行って くれるわけではなく、 それを行ってくれるオペレーティングシステムにも、バ グがあることがある。たとえば、 Mac OS X は、tcgetattr() や tcsetattr() システムコールの再スタートに失敗する (これは Mac OS X のバグである)。そ れだけではなく、この動作は、 コマンドが SIGTTIN や SIGTTOU シグナルで停 止することを当てにしているので、 そうしたシグナルは捕獲し、別のシグナル (たいていは SIGSTOP) で自分を停止させるプログラムは、自動的にフォアグラ ウンド化できない。 linux の su(1) コマンドの動作が、系統によっては、そん なふうになっている。 このフラグはデフォルトでは off である。 この設定は、バージョン 1.8.7 以上でのみサポートされている。 また、入出力 ロギングが有効になっている場合や、 use_pty フラグが有効になっている場合 以外、この設定には効果がない。 env_editor これをセットすると、visudo はデフォルトのエディタ・リストを利用する前 に、 環境変数 EDITOR や VISUAL の値を使用するようになる。 それがセキュリ ティホールになりかねないことに注意していただきたい。 ユーザが root とし て任意のコマンドを、 ログに記録されることなく実行できるようになるから だ。 こうした環境変数を利用するときの、env_editor を有効にするよりも安全 な方法は、 sudoers ファイルの editor オプションにコロンで区切ったエディ タのリストを書いておくことだ。そうすれば、 visudo が EDITOR や VISUAL を 使うのは、それが editor オプションに指定した値とマッチしたときだけにな る。 env_reset フラグが有効な場合に、sudo 経由で visudo を起動したとき env_editor フラグが効果を持つためには、 環境変数 EDITOR や VISUAL が env_keep のリストに存在していなければならない。 このフラグはデフォルトで は 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 オプションを付けて実行すれば、 sudoers 中でグローバルな Defaults パラメータによって変更された結果を、 見ることができる。 な お、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 ローカル・ホスト名 (hostname コマンドが返すもの) がドメイン名を含まない とき、 sudoers ファイルで完全修飾ホスト名を使用したかったら、 このフラッ グをセットするとよい。すなわち、myhost ではなく、 myhost.mydomain.edu を 使いたい場合だ。そのときでも、 そうしたければ、短縮形も使用できる (両方 を混ぜて使うこともできる)。 このオプションに効果があるの は、getaddrinfo() や gethostbyname() 関数が返すホストの「正規名 (canonical name)」が、 完全修飾ドメイン名であるときだけである。 システム がホスト名の解決に DNS を使用するように設定されているときは、普通そうな る。 システムが DNS よりも優先して /etc/hosts を使用するように設定されている 場合、 ホストの正規名は完全修飾名ではないかもしれない。 ホスト名解決のた めに問い合わせる情報源の順番は、普通 /etc/nsswitch.conf, /etc/netsvc.conf, /etc/host.conf ファイルで指定されている。 /etc/resolv.conf のこともある。/etc/hosts ファイルでは、 エントリの最初 のホスト名が正規名と見なされる。後に続く名前はエイリアスであり、 sudoers によって使用されることはない。たとえば、hosts ファイルに "xyzzy" という マシンについて下記の行があるとき、 完全修飾ドメイン名がホストの正規名で あり、短い方の名前はエイリアスである。 192.168.1.1 xyzzy.sudo.ws xyzzy hosts ファイルにおけるマシンのエントリの書式が不適切だと、 hosts ファイ ルへの問い合わせが DNS より前に行われる場合、fqdn オプションを指定して も、効果がない。 気を付けてほしいのは、ホスト名の解決に DNS を使用する場合、 fqdn 有効に すると、sudoers は DNS に問い合わせをしなければならないので、 DNS が稼働 していないと (たとえば、マシンがネットワークから切り離されていると)、 sudo が使えなくなるということである。 もう一つ気を付けるべきことがあ る。hosts ファイルを使用する場合と同じことだが、 DNS が知っているホスト の正規名を使わなければならない。 言い換えれば、ホストのエイリアス (CNAME のエントリ) を使ってはいけない。 パフォーマンスの問題もあるし、DNS から エイリアスをすべて取得する方法はないからでもある。 このフラグはデフォルトでは 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 に結び つけられていない場合でも、その入力はやはりキャプチャーされ、 独立したロ グファイルに書き込まれる。 より詳しい情報については、「入出力ログファイ ル」セクションをご覧になるとよい。 このフラグはデフォルトでは off であ る。 log_output これをセットすると、sudo は、擬似 tty でコマンドを実行し、 スクリーンに 送られたすべての出力をログに取ることになる。 script(1) コマンドと似たこ とをやるわけだ。 より詳しい情報については、「入出力ログファイル」セク ションをご覧になるとよい。 このフラグはデフォルトでは off である。 log_year これをセットすると、四桁の年が (syslog 経由ではない) sudo のログファイル に記入されることになる。 このフラグはデフォルトでは off である。 long_otp_prompt S/Key や OPIE のような One Time Password (OTP) スキームを採用していると きにこれを有効にすると、 チャレンジをローカルウィンドウにカット・アン ド・ペーストしやすいように、 二行のプロンプトが使用される。デフォルトの プロンプトほど見栄えはよくないが、 こちらの方が便利だと思う人もいる。こ のフラグはデフォルトでは off である。 mail_all_cmnds ユーザが sudo 経由でコマンドの実行を試みるたびに (sudoedit の実行も含 む)、mailto ユーザにメールを送付する。 ただし、ユーザが sudo に -l や -v オプションを付けて実行したときは、 認証エラーがあり、しかも mail_badpass フラグがセットされていないかぎり、 メールを送付することはない。このフラ グはデフォルトでは off である。 mail_always ユーザが sudo を実行するたびに、mailto ユーザにメールを送る。 このフラグ はデフォルトでは off である。 mail_badpass sudo を実行するユーザが正しいパスワードを入力しなかったら、 mailto ユー ザにメールを送付する。ユーザが実行しようとしているコマンドが sudoers に よって許可されていない場合に、mail_all_cmnds, mail_always, mail_no_host, mail_no_perms, mail_no_user フラグのどれかがセットされていると、このフラ グは効果を持たないことになる。 このフラグはデフォルトでは off である。 mail_no_host これをセットすると、sudo を起動したユーザが sudoers ファイルに記載されて はいるものの、 使用中のホストでコマンドの実行を許可されていない場合に、 mailto ユーザにメールを送付する。このフラグはデフォルトでは off である。 mail_no_perms これをセットすると、sudo を起動したユーザが sudo の使用を許可されている が、 実行しようとしているコマンドが sudoers ファイルの そのユーザのエン トリに登録されていないか、明示的に禁止されている場合に、 mailto ユーザに メールを送付する。このフラグはデフォルトでは off である。 mail_no_user これをセットすると、sudo を起動したユーザが sudoers ファイルに記載されて いない場合に、mailto ユーザにメールを送付する。 このフラグはデフォルトで は on である。 netgroup_tuple これをセットすると、 ネットグループの検索がネットグループのタプル全部を 使って行われることになる (すなわち、ホスト名、ユーザ名、ドメインの三つ が、それぞれ設定されているならば、 使用される)。従来の sudo では、 User_List で使用されるネットグループについては、 ユーザ名とドメインだけ を照合し、Host_List で使用されるネットグループについては、 ホスト名とド メインだけを照合していた。このフラグはデフォルトでは off である。 noexec これをセットすると、sudo を通して実行されるすべてのコマンドが、 EXEC タ グで無効にされないかぎり、 あたかも NOEXEC タグが設定されているかのごと く振舞うようになる。 前述の「EXEC と NOEXEC」の説明、および、 このマニュ アルの終わりの方にある「シェル・エスケープの防止」というセクションを参照 していただきたい。 このフラグはデフォルトでは off である。 pam_session 認証に PAM を使用するシステムでは、sudo は新しい PAM セッションを作成 し、 その中でコマンドを実行する。PAM の実装が古い場合や、 PAM セッション の開始が utmp や wtmp ファイルを変更するオペレーティングシステムでは、 pam_session を無効にする必要があるかもしれない。 ただし、PAM セッション のサポートを無効にすると、 実行されるコマンドに対するリソースの上限が更 新されないかもしれない。 なお、pam_session, pam_setcred, use_pty が無効 になっていて、 しかも 入出力ロギングが設定されていない場合は、 sudo はコ マンドを子プロセスとしてではなく、 直接実行する。このフラグはデフォルト では on である。 この設定は、バージョン 1.8.7 以上でのみサポートされている。 pam_setcred 認証に PAM を使用するシステムでは、sudo はデフォルトでは、 使用している 認証システムがサポートしているなら、変身対象ユーザの認証情報 (credential) が有効であることを確認しようとする。認証情報の例を一つ挙げ れば、 Kerberos のチケットがそれである。pam_session, pam_setcred, use_pty が無効になっていて、しかも 入出力ロギングが設定されていない場合 は、 sudo はコマンドを子プロセスとしてではなく、直接実行する。 このフラ グはデフォルトでは on である。 この設定は、バージョン 1.8.8 以上でのみサポートされている。 passprompt_override 通常、passprompt オプションによって指定されたパスワードプロンプトが使用 されるのは、 PAM のようなシステムが用意しているパスワードプロンプトが、 "Password:" という文字列にマッチしているときだけである。 passprompt_override をセットすると、passprompt が無条件で使われることに なる。 このフラグはデフォルトでは off である。 path_info 通常 sudo は、環境変数 PATH 中にコマンドが見付からないと、 ユーザにその 旨を知らせる。これを利用すれば、 一般ユーザにアクセス権のない実行ファイ ルのありかについて情報を収集できるという理由から、 この動作を無効にした いサイトもあるかもしれない。 その場合の欠点は、実行ファイルが単にユーザ の PATH 中になかっただけの場合でも、 実行の許可がないと sudo がユーザに 告げることになって、 実情がわかりにくいかもしれないことである。 このフラ グはデフォルトでは on である。 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 のリストに LOGNAME, USER, USERNAME などが入っていると、 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 である。 sudoedit_checkdir これをセットすると、 sudoedit は、編集対象ファイルのパス中にあるディレク トリ部分のすべてについて、 sudoedit を実行するユーザとって書き込み可能か どうかを、チェックすることになる。 ユーザに書き込み可能なディレクトリに 存在するいかなるシンボリックリンクも、 たどられることがなく、また、ユー ザに書き込み可能なディレクトリにあるファイルの編集は、 拒否されることに なる。 ただし、こうした制限は、sudoedit を実行するユーザが root の場合に は、行われない。 システムによっては、編集対象ファイルのパス中にあるディ レクトリ部分のすべてが、 変身対象ユーザにとって読み込み可能でないかぎ り、 sudoedit でファイルを編集できないものもある。 このフラグはデフォル トでは on である。 この設定が最初に導入されたのは、バージョン 1.8.15 だったが、 当初のもの には競合状態を引き起こす欠陥があった。 編集対象ファイルのパスの途中に書 き込み可能なディレクトリがあり、 そこにシンボリックリンクが存在する場合 のチェックは、バージョン 1.8.16 で追加された。 sudoedit_follow sudoedit はデフォルトでは、ファイルをオープンするときにシンボリックリン クをたどらない。 sudoedit_follow オプションを有効にすると、 sudoedit が シンボリックリンクをオープンできるようになる。 そうした動作は FOLLOW や NOFOLLOW タグを使えば、 コマンドごとに変更することができる。このフラグは デフォルトでは off である。 この設定は、バージョン 1.8.15 以上でのみサポートされている。 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_netgroups これをセットすると、ユーザやホストを指定する場所でネットグループ (接頭辞 '+' が付く) が使えるようになる。LDAP を使用する sudoers では、 ネットグ ループをサポートすると、/etc/ldap.conf ファイルで NETGROUP_BASE 設定オプ ションを指定していない場合に、 サーバ側で負荷の高い部分文字列 (substring) のマッチングを行う必要が生じる。 そこで、ネットグループを使 用する必要がない場合は、 このオプションを off にすれば、LDAP サーバの負 荷を減らすことができる。 このフラグはデフォルトでは on である。 use_pty これをセットすると、sudo は入出力のロギングが行われていないときでも、 擬 似 tty でコマンドを実行することになる。 sudo によって実行された悪意のあ るプログラムが、 バックグラウンド・プロセスをフォークし、 そのプロセス が、メインプログラムの実行が終了した後でも、 ユーザのターミナルデバイス を握って離さないといったことが考えられる。 このオプションを使えば、そう いったことが不可能になる。 このフラグはデフォルトでは off である。 utmp_runas これをセットすると、sudo は utmp (または utmpx) ファイルを更新するとき、 変身対象ユーザの名前を記録するようになる。sudo はデフォルトでは、 sudo を実行したユーザの名前を記録するのだ。 このフラグはデフォルトでは off で ある。 visiblepw デフォルトでは、ユーザがパスワードを入力しなければならないときに、 使用 しているターミナルでエコーの抑制ができなかったら、 sudo は実行を拒否する ようになっている。 それに対し、visiblepw フラグが設定されていると、 パス ワードがスクリーンに表示されてしまう場合でも、 sudo はプロンプトを出し て、パスワードを求めるようになる。 ssh(1) はデフォルトでは、コマンドを実 行する際に tty を割り当てないので、 sudo はエコーの抑制ができないが、そ の場合でも、この設定によって、 "ssh somehost sudo ls" といった操作の実行 が可能になるわけだ。 このフラグはデフォルトでは off である。 整数: closefrom sudo はコマンドを実行する前に、標準入力、標準出力、標準エラー (すなわ ち、ファイルディスクリプタ 0-2 ) を除いて、 開いているすべてのファイル・ ディスクリプタをクローズする。 closefrom オプションを使用すると、 0-2 以 外のどのファイル・ディスクリプタから閉じて行くかを指定することができる。 デフォルトは 3 である。 maxseq 入出力ログファイルで "%{seq}" エスケープシーケンスに置き換えられる連続番 号の最大値 (詳細については、後述の iolog_dir オプションの説明を参照する こと)。 "%{seq}" に置き換えられる値は 36 進数だが、maxseq そのものは 10 進数で指定するべきである。2176782336 (38 進数の連続番号では、 "ZZZZZZ" に相当する) より大きい値は 、暗黙のうちに 2176782336 に縮小される。デ フォルトの値は 2176782336 である。 使用している連続番号が maxseq の値に達したら、最初の値の 0 に戻る。 それ 以後は、sudoers は存在している入出力ログファイルをサイズ 0 に短縮して、 そのパス名を再利用することになる。 この設定は、バージョン 1.8.7 以上でのみサポートされている。 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 環境変数や VISUAL 環境変数とマッチしたリスト 中のエディタを選択する。 それができないときは、このリストにあるエディタ で、実際に存在し、 かつ実行可能な最初のエディタを使用する。 環境変数 EDITOR や VISUAL は、env_reset オプションが有効な場合、 デフォルトでは保 存されないことに注意していただきたい。 デフォルトは vi である。 iolog_dir このオプションの値をトップレベル・ディレクトリにして、 入出力ログを置く ディレクトリのパス名が構成される。この値が使用されるのは、 log_input や log_output オプションが有効になっているときや、 LOG_INPUT や LOG_OUTPUT タグがコマンドに付いているときだけである。 このディレクトリ以下に、セッ ション ID が連番ならば、 セッションの連番が (訳注: 以下の "%{seq}" の説 明にあるような形で) 格納されることになるわけだ。デフォルトは /var/log/sudo-io である。 以下のパーセント ('%') エスケープシーケンスが使用できる。 %{seq} 単調に増加する 36 進数の連続番号に展開される。たとえば、0100A5 と いった番号であり、二桁づつ使って新しいディレクトリを作っていく。 この場合なら、01/00/A5 といった具合だ。 %{user} sudo を実行するユーザーのログイン名に展開される。 %{group} sudo を実行するユーザーの実グループ ID の名前に展開される。 %{runas_user} 変身対象ユーザのログイン名に展開される (たとえば root)。 %{runas_group} 変身対象ユーザのグループ名に展開される (たとえば wheel)。 %{hostname} ドメイン名なしのローカル・ホスト名に展開される。 %{command} 実行されるコマンドのベースネームに展開される。 このほか、システムの strftime(3) 関数がサポートしているエスケープシーケ ンスは、 いかなるものでも展開の対象になる。 '%' 文字そのものを使いたかったら、文字列 '%%' を使用すればよい。 iolog_file iolog_dir を基点とする相対パス名であり、log_input や log_output オプショ ンが有効になっていたり、LOG_INPUT や LOG_OUTPUT タグがコマンドに付いてい る場合に、入出力ログがこの中に格納される。 iolog_file の値が複数のディレ クトリ構成要素を含んでいることがあるのに注意していただきたい。 デフォル トは "%{seq}" である。 使用できるパーセント ('%') エスケープシーケンスのリストについては、 上記 の iolog_dir オプションを参照。 エスケープシーケンスの展開とは別に、パス名が六個以上の X で終わっている 場合は、 X の部分が、他と重複しない英数字の組み合わせに置き換えられる。 mktemp(3) 関数の場合と同様である。 iolog_dir と iolog_file を結合して作られるパスがすでに存在している場合 は、 iolog_file が 6 個以上の X で終わっていないかぎり、 既存の入出力ロ グファイルは、サイズ 0 に短縮された上で、上書きされることになる。 lecture_status_dir sudo はこのディレクトリに、 ユーザが訓戒を受けたかどうかを示すファイル を、ユーザごとに入れておく。 ユーザが訓戒を受けると、サイズ 0 のファイル がこのディレクトリに作成され、 sudo はそのユーザに再び訓戒を行わなくな る。このディレクトリは、 システムのブート時に消去すべきではない。 デフォ ルトは /var/lib/sudo/lectured である。 mailsub mailto ユーザに送付するメールの件名。 エスケープ文字 %h はマシンのホスト 名に展開される。 デフォルトは「*** SECURITY information for %h ***」であ る。 noexec_file sudo バージョン 1.8.1 以来、このオプションはサポートされていない。 現在 では、noexec ファイルのパスは sudo.conf(5) ファイルで設定するべきであ る。 pam_login_service PAM を認証に使用しているシステムでは、このオプションの値が、 sudo コマン ドに -i オプションが指定されたとき使用されるサービス名になる。 デフォル トの値は、 "sudo" である。pam_service の説明もご覧いただきたい。 この設定は、バージョン 1.8.8 以上でのみサポートされている。 pam_service PAM を使用しているシステムでは、このオプションで指定するサービス名が、 適用される PAM ポリシーを指定することになる。サービス名は pam.conf ファ イル中のエントリ名や、/etc/pam.d にあるファイル名に対応している。 デフォ ルトの値は "sudo" である。 この設定は、バージョン 1.8.8 以上でのみサポートされている。 passprompt パスワードを要求するときに使用するデフォルトのプロンプト。 -p オプション や環境変数 SUDO_PROMPT によって変更することができる。 以下のパーセント ('%') エスケープシーケンスが使用できる。 %H ドメイン名付きのローカルホスト名に展開される (マシンのホスト名が完 全修飾名か、 fqdn オプションがセットされている場合のみ)。 %h ドメイン名なしのローカル・ホスト名に展開される。 %p パスワードを要求されているユーザ名に展開 (sudoers ファイルの rootpw, targetpw, runaspw フラグを尊重する)。 %U 変身対象ユーザの (デフォルトでは root) ログイン名に展開。 %u sudo を実行するユーザーのログイン名に展開される。 %% 連続した二個の % は、一個の % 文字そのものを意味する。 デフォルトの値は「Password:」である。 role コマンドの実行に当たって SELinux の新しいセキュリティ・コンテキストを構 成するときに使用する、 デフォルトのロール。デフォルトのロールは、 sudoers ファイルや、コマンドラインオプションを使って、 コマンドごとに変 更することができる。このオプションが利用できるのは、 sudo が SELinux サ ポートつきでビルドされたときだけである。 runas_default コマンドラインで -u オプションが指定されていないときの、 デフォルトの変 身対象ユーザ。デフォルトでは root になっている。 syslog_badpri ユーザが認証に失敗したときに使用する syslog の重大度 (priority)。 デフォ ルトでは alert になっている。 syslog の重大度には、次のものが指定できる。emerg, alert, crit, err, warning, notice, info, debug。 syslog_goodpri ユーザが認証に成功したときに使用する syslog の重大度 (priority)。 デフォ ルトでは notice になっている。 どんな syslog の重大度が指定できるかについては、 syslog_badpri を参照。 sudoers_locale sudoers ファイルを解析したり、コマンドのログを記録したり、 email を送付 したりするときに使用するロケール。 ロケールの変更は、sudoers の解釈に影 響があるかもしれないので、 気をつけていただきたい。デフォルトでは "C" に なっている。 timestampdir sudo がタイムスタンプ・ファイルを置くディレクトリ。 このディレクトリ は、システムがリブートするとき、クリアされるべきである。 デフォルトは /var/run/sudo/ts になっている。 timestampowner ユーザが訓戒を受けたかどうかを示すファイルを入れておくディレクトリや、 タイムスタンプ・ディレクトリ、 及びそうしたディレクトリに置かれるすべて のファイルの所有者。 デフォルトは root である。 type コマンドの実行に当たって SELinux の新しいセキュリティ・コンテキストを構 成するときに使用する、 デフォルトのタイプ。デフォルトのタイプは、 sudoers ファイルや、コマンドラインオプションを使って、 コマンドごとに変 更することができる。このオプションが利用できるのは、 sudo が SELinux サ ポートつきでビルドされたときだけである。 真偽値としても使用できる文字列: env_file env_file オプションでは、 実行するプログラムの環境に設定する変数を記載した ファイルの絶対パスを指定する。 このファイルに記載する項目 は、"VARIABLE=value" か "export VARIABLE=value" の形でなければならない。変数 の値をシングルクォートやダブルクォートで囲んでもよい。 このファイルに含まれ る変数は、env_keep や env_check のような sudo のほかの環境設定の影響を受け る。 exempt_group このグループのユーザはパスワードの入力や secure_path などによる PATH の限定 を免除される。指定するグループ名に接頭辞の % を付けてはいけない。 このオプ ションはデフォルトではセットされていない。 group_plugin このオプションの値となる文字列には、 sudoers が使用するグループ・プラグイン と、必要ならその引き数を指定する。 値となる文字列は、プラグインのパスに続け て、その設定に必要な引き数があれば、 それを付け加えたものだが、パスは絶対パ スか、 /usr/local/libexec/sudo を基点とする相対パスにするべきである。 引き数 が存在するなら、それはプラグインの初期化関数に渡される。 引き数が存在する場 合は、文字列全体をダブルクォート ("") で囲まなければならない。 詳細については、 「グループ・プロバイダー・プラグイン」セクションををご覧い ただきたい。 lecture sudo はパスワードプロンプトに添えて簡単な訓戒を表示することができる。 このオ プションはその訓戒をいつ表示するかを決定する。以下の値が可能である。 always いつでも必ず訓戒を表示する。 never 訓戒をまったく表示しない。 once ユーザがはじめて sudo を実行したときだけ表示する。 値を指定しないと、once を指定したことになる。頭に '!' を付けて、 このオプ ションを否定すると、値に never が使用される。 デフォルトの値は once である。 lecture_file 標準の訓戒とは別の sudo の訓戒を書き込んだファイルのパス。 指名したファイル が存在すれば、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 「安全」だと見なされない場合に、ユーザの環境から取り除かれる環境変数。 TZ 以外のすべての環境変数について、「安全」というのは、変数の値に '%' や '/' という文字を一つも含まないことである。この動作を利用すれば、 出来の よくないプログラムに見られる printf 形式のフォーマットの脆弱性に対処する ことが可能になる。 TZ 変数については、以下のどれかが真ならば、安全ではな いと見なされる。 • 変数の値が絶対パス名であり (コロン (':') が先頭に付いていることもあ る)、 それが zoneinfo ディレクトリの位置にマッチしない。 • 変数の値に .. というパスの要素が存在する。 • 変数の値にホワイトスペースや表示不能文字が存在する。 • 変数の値が PATH_MAX の値より長い。 このオプションの引き数は、ダブルクォートで囲まれ、 スペースで区切られた リストでもよく、 ダブルクォートなしの単一の値でもよい。リストは、=, +=, -=, ! 演算子を使って、それぞれ置き換えたり、追加したり、削除したり、 無 効にしたりすることができる。env_check で指定された変数は、 env_reset オ プショの有効・無効にかかわらず、上記のチェックにパスすれば、 環境に保存 されることになる。チェックされる環境変数のグローバルなリストは、 root ユーザが sudo に -V オプションを付けて実行したときに表示される。 env_delete env_reset オプションが無効になっているときに、 ユーザの環境から取り除か れる環境変数。このオプションの引き数は、 ダブルクォートで囲まれ、スペー スで区切られたリストでもよく、 ダブルクォートなしの単一の値でもよい。 リ ストは、=, +=, -=, ! 演算子を使って、それぞれ置き換えたり、追加したり、 削除したり、無効にしたりすることができる。 取り除かれる環境変数のグロー バルなリストは、root ユーザが sudo に -V オプションを付けて実行したとき に表示される。 なお、オペレーティングシステムには、危険をもたらしかねな い変数を、 いかなる setuid プロセス (sudo もその一つ) の環境からも取り除 くことにしているものが多いことに留意してほしい。 env_keep env_reset オプションが有効になっているときでも、 ユーザの環境にそのまま 保存される環境変数。このオプションによって、 sudo から生み出されるプロセ スが受け取る環境を、 きめ細かく制御することが可能になる。このオプション の引き数は、 ダブルクォートで囲まれ、スペースで区切られたリストでもよ く、 ダブルクォートなしの単一の値でもよい。 リストは、=, +=, -=, ! 演算 子を使って、 それぞれ置き換えたり、追加したり、削除したり、無効にしたり することができる。 保存される変数のグローバルなリストは、root ユーザが sudo に -V オプションを付けて実行したときに表示される。
グループ・プロバイダー・プラグイン
sudoers プラグインは、non-Unix グループの検索を可能にするために、 補助的なプラグインに対す るインターフェースを備えており、それによって、 標準的な Unix グループ・データベース以外の グループ情報源に対する問い合わせができるようになっている。 先に述べたような、non-Unix グ ループを指定する書式の使用を可能にしたかったら、 この仕組みが使用できる。 グループ・プロバイダー・プラグインは、デフォルト設定の group_plugin によって指定す る。group_plugin に対する引き数は、プラグインのパスに続けて、 その設定に必要なオプションが あれば、それを付け加えたものだが、 パスは絶対パスか、/usr/local/libexec/sudo を基点とする 相対パスにするべきである。そうしたオプションは (指定されていれば) プラグインの初期化関数に 渡されることになる。オプションがある場合は、 文字列全体をダブルクォート ("") で囲まなけれ ばならない。 以下のグループ・プロバイダー・プラグインがデフォルトでインストールされている。 group_file group_file プラグインは、/etc/group の代わりに、 /etc/group と同じ書式を使用する 別のグループファイルを使えるようにする。 プラグインに対するオプションとして、グ ループファイルのパスを指定するべきである。 たとえば、使用するグループファイルが /etc/sudo-group ならば、 次のように書くことになる。 Defaults group_plugin="group_file.so /etc/sudo-group" system_group system_group プラグインは、標準 C ライブラリの関数 getgrnam() と getgrid() によ るグループ検索をサポートしている。このプラグインは、 ユーザがそのユーザの補助グ ループのリストに存在しないグループに所属しているといった場合にも使用できる。 こ のプラグインはオプションを取らないので、書式は次のようになる。 Defaults group_plugin=system_group.so グループ・プロバイダー・プラグインの API については、sudo_plugin(5) に詳細な説明がある。
ログの書式
sudoers は、何が起きたかを記録するのに、syslog(3) を使用することもできるし、 単独のログ・ ファイルを使用することもできる。 どちらの場合も、ログの書式はほとんど同じである。 実行を許可されたコマンドに関するログ記載事項 sudo が実行したコマンドは、次の書式を使って記録される (読みやすいように、ここでは複数行に 分けている)。 date hostname progname: username : TTY=ttyname ; PWD=cwd ; \ USER=runasuser ; GROUP=runasgroup ; TSID=logid ; \ ENV=env_vars COMMAND=command 各フィールドは以下のようになっている。 date コマンドが実行された日時。たいていは、"MMM, DD, HH:MM:SS" の形式である。 syslog(3) 経由でロギングしている場合に、 日時が実際にどんな形式になるかを決 めるのは、syslog デーモンである。 sudo 独自のファイルにロギングしていると き、 log_year オプションが有効だと、日時に年度も含まれることになる。 hostname sudo が実行されたホストの名前。このフィールドは、 syslog(3) 経由でロギングし ているときにのみ存在する。 progname プログラム名。普通は、sudo か sudoedit。このフィールドは、 syslog(3) 経由で ロギングしているときのみ存在する。 username sudo を実行したユーザのログイン名。 ttyname sudo が実行された端末の短縮名 (たとえば、"console", "tty01", "pts/0" な ど)。端末が存在しなかった場合は、 "unknown" になる。 cwd sudo が実行されたカレント・ワーキング・ディレクトリ。 runasuser 変身対象ユーザ。 runasgroup 変身対象グループがコマンドラインで指定されていれば、そのグループ。 logid 入出力ログの識別名。コマンドの出力を再生するときに使用できる。 このフィール ドは、log_input や log_output オプションが有効なときにのみ存在する。 env_vars 環境変数がコマンドラインで指定された場合、そのリスト。 command 実行された実際のコマンド。 メッセージは sudoers_locale で指定されたロケールを使って記録される。 デフォルトは "C" であ る。 実行を拒否されたコマンドに関するログ記載事項 ユーザがコマンドの実行を認められなかった場合、 拒否された理由が、ユーザ名の後に記録される ことになる。 理由として挙げられるものには、次のようなものがある。 user NOT in sudoers そのユーザに関する記載が sudoers ファイルに存在しない。 user NOT authorized on host そのユーザに関する記載が sudoers ファイルに存在するが、 このホストではコマンドの実行を 許可されていない。 command not allowed このホストに対するそのユーザの記載が sudoers ファイルに存在するが、 指定されたコマンド の実行を許可されていない。 3 incorrect password attempts ユーザがパスワードの入力に 3 回失敗した。実際に書き込まれる試行回数は、 失敗した回数と passwd_tries オプションの値によって様々である。 a password is required sudo に -n オプションを指定したが、パスワードが必要だった。 sorry, you are not allowed to set the following environment variables ユーザがコマンドラインで環境変数を指定したが、 それは sudoers によって許可されていな い。 エラーに関するログ記載事項 エラーが起きると、sudoers はメッセージをログに記録し、たいていの場合は、 管理者に email で 報告する。起きるかもしれないエラーには次のものがある。 parse error in /etc/sudoers near line N sudoers が上記ファイルの解析中にエラーに出会った。 エラーのタイプによっては、実際のエ ラーは、記載された行番号より 1 行上、 あるいは、1 行下にあることもある。 problem with defaults entries sudoers ファイル中に意味不明なデフォルト設定 (Defaults setting) が、 一つ以上ある。この エラーがあっても、sudo が実行できなくなることはないが、 visudo を使って sudoers ファイ ルをチェックするべきである。 timestamp owner (username): No such user timestampowner オプションで指定されたタイムスタンプ・ディレクトリの所有者が、 パスワー ド・データベースに存在しなかった。 unable to open/read /etc/sudoers sudoers ファイルを読み込もうとしたが、オープンできなかった。 そうしたことは、sudoers ファイルがリモート・ファイルシステムに存在して、 そこではユーザ ID 0 を別の値にマップし ている場合に起きることがある (訳注: たとえば、NFS で root_squash が有効な場合)。 通常 sudoers は、この問題を回避するために、グループのパーミッションを使って sudoers ファイル をオープンしようとする。 /etc/sudoers の所有権を変更するなり、 sudo.conf(5) ファイルの sudoers Plugin 行の末尾に "sudoers_uid=N" ('N' は、sudoers ファイルの所有者のユーザ ID) といった引き数を追加するなりを、考慮すべきである。 unable to stat /etc/sudoers /etc/sudoers ファイルが見つからない。 /etc/sudoers is not a regular file /etc/sudoers は存在するが、通常ファイルでもシンボリック・リンクでもない。 /etc/sudoers is owned by uid N, should be 0 sudoers ファイルの所有者が適切ではない。 sudoers ファイルの所有者を変更したい場合に は、sudo.conf(5) ファイルの sudoers Plugin 行に "sudoers_uid=N" ('N' は、 sudoers ファ イルの所有者のユーザ ID) を付け加えていただきたい。 /etc/sudoers is world writable sudoers ファイルのパーミッションがすべてのユーザに書き込みを許している。 sudoers ファイ ルは、誰にでも書き込み可であってはならず、 デフォルトのファイルモードは 0440 である (所 有者とグループのみ読むことができ、 書き込み権限は誰にもない)。デフォルトのモード は、sudo.conf(5) ファイルの sudoers Plugin 行に "sudoers_mode" オプションを指定すること で変更することができる。 /etc/sudoers is owned by gid N, should be 1 sudoers ファイルの所有グループが適切ではない。 sudoers ファイルの所有グループを変更した い場合には、 sudo.conf(5) ファイルの sudoers Plugin 行に "sudoers_gid=N" ('N' は、sudoers ファイルの所有グループ ID) を付け加えていただきたい。 unable to open /var/run/sudo/ts/username sudoers がユーザのタイムスタンプ・ファイルを読み込んだり、 作成したりすることができな かった。そうしたことは、 timestampowner が root 以外のユーザに設定されていて、 しかも /var/run/sudo のモードが、 グループやその他のユーザに対して検索不可になっている場合に起 きることがある。 /var/run/sudo のデフォルトのモードは、0711 である。 unable to write to /var/run/sudo/ts/username sudoers がユーザのタイムスタンプ・ファイルに書き込むことができなかった。 /var/run/sudo/ts is owned by uid X, should be Y タイムスタンプ・ディレクトリの所有者が timestampowner 以外のユーザである。 そうしたこと は、timestampowner の値を変更した時に起きることがある。 sudoers は、ディレクトリの所有 者が訂正されるまで、 タイムスタンプ・ディレクトリを無視することになる。 /var/run/sudo/ts is group writable タイムスタンプ・ディレクトリがグループによって書き込み可能になっている。 書き込みが可能 なのは、timestampowner のみにするべきだ。 タイムスタンプ・ディレクトリのデフォルトの モードは、700 である。 sudoers は、ディレクトリのモードが訂正されるまで、 タイムスタン プ・ディレクトリを無視することになる。 syslog 経由でロギングするときの注意点 デフォルトでは、sudoers は syslog(3) 経由でメッセージをログに記録する。 その場合、date, hostname, progname フィールドをログに付加するのは、 syslog デーモンであって、sudoers では ない。 従って、そうしたフィールドは、システムが違えば書式も違うかもしれない。 ほとんどのシステムで、syslog(3) は、かなり小さなログ・バッファしか持っていない。 そこ で、コマンドライン引き数の後ろの方が切り捨てられたりしないように、 sudoers は、(date, hostname, 及び "sudo" という文字列を別にして) ログ・メッセージが 960 字以上になると、それ を分割するようになっている。 メッセージが分割される場合、後続部分では、 ユーザ名の後ろに "(command continued)" という文字列が続き、 その後にコマンドライン引き数の残りが続くことに なる。 ファイルにロギングするときの注意点 logfile オプションを設定すると、sudoers は /var/log/sudo といったローカルなファイルにログ を記録するようになる。ファイルにロギングする場合も、 sudoers は syslog(3) とほとんど同じ書 式を使用するが、 いつくかの重要な違いがある。 1. progname と hostname フィールドは存在しない。 2. log_year オプションが有効な場合、日付には年度も含まれることになる。 3. loglinelen (デフォルトでは 80) 文字よりも長い行は改行され、 4 文字分のインデントを付 けて次の行に続くことになる。 そうすることで、記述情報が人間に読みやすくなるが、 ログ ファイルに対して grep(1) を使用することは難しくなる。 loglinelen オプションに 0 を指 定すると (あるいは、頭に '!' をつけて、否定すると)、改行は行われなくなる。
入出力ログファイル
入出力ロギングを有効にすると、sudo は擬似 tty でコマンドを実行して、 ユーザのすべての入力 や出力のログを取ることになる。 入出力は、iolog_dir オプションで指定したディレクトリに (デ フォルトでは /var/log/sudo-io)、 一意なセッション ID を使って記録される。 このセッション ID は、(訳注: syslog 経由であれ、独自ファイルであれ) sudo に関するログの行に、"TSID=" に続 く値として書き込まれているものだ。 iolog_file オプションを使えば、 セッション ID の形式を 変更することができる。 各入出力ログは、独立したディレクトリに収納される。 そうしたディレクトリには、次のような ファイルが入っている。 log 次のような情報を含むテキストファイル。コマンドが実行された日時、 sudo を実行した ユーザの名前、変身対象ユーザ名、変身対象グループ名 (ないこともある)、 sudo が実 行された端末、その端末の縦横のサイズ (何行何桁か)、 コマンドがそこから実行された カレントディレクトリ、 それに、コマンドそのもののパス名 (引き数があれば、それも) timing 入出力ログに記録される各事項間の時間間隔と各事項の入出力バイト数のログ (セッショ ンの再生で使用される) ttyin ユーザが使用している端末からの入力 (ユーザがタイプしたこと)。 stdin パイプやファイルからの入力 ttyout 擬似 tty の出力 (コマンドがスクリーンに書き出したこと) stdout パイプへ出力されたり、ファイルにリダイレクトされた標準出力 stderr パイプへ出力されたり、ファイルへリダイレクトされた標準エラー log 以外のすべてのファイルは、compress_io オプションが無効になっていないかぎり、 gzip 形式 で圧縮される。バッファリングを行うので、入出力のデータは、 sudo コマンドが完了するまで、完 全なものにはならない。 入出力ログファイルの出力の部分は、sudoreplay(8) を使って再生するこ とができる。 また、sudoreplay(8) ユーティリティは、利用できるログをリスト表示したり、 検索 したりするのに使うこともできる。 ユーザの入力には、パスワードのような (たとえ、 画面にエコーされることはないにしても) 秘密 情報が含まれていることがある。 そういった情報も、暗号化されずに、ログファイルに記録される ことに注意していただきたい。 たいていの場合、log_output や LOG_OUTPUT を使って、 コマンド の出力をログに記録するだけで十分用が足りる。 入出力ログは、セッションごとに独立したディレクトリに収納される。 そのため、従来からあるロ グローテーション・ユーティリティを使用して、 保存しておく入出力ログ数を制限することはでき ない。 保存する入出力ログ数を制限する最も簡単な方法は、 maxseq オプションで保存したいログ の最大数を指定することである。 入出力ログの連番が maxseq に達すると、連番は 0 にリセットさ れ、 sudoers は既存の入出力ログファイルをサイズ 0 に短縮して、再利用することになる。
ファイル
/etc/sudo.conf sudo フロントエンドの設定 /etc/sudoers 誰が何を実行できるかのリスト /etc/group ローカルのグループファイル /etc/netgroup ネットワークグループのリスト /var/log/sudo-io 入出力のログファイル (訳注: 厳密には、 入出力のログを記録する ファイル群をその下に格納するトップディレクトリ) /var/run/sudo/ts sudoers セキュリティポリシーが使用するタイムスタンプを格納する ディレクトリ /var/lib/sudo/lectured 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,\ sha224:0GomF8mNN3wlDt1HD9XldjJ3SNgpFdbjO1+NsQ== \ /home/operator/bin/start_backups 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) については、 シェル・エスケープを無効にする。なお、最後の設定 は、 許可するコマンドが ALL になっているユーザに対しては、 効果的な抑制にはならないことに 注意していただきたい。 # 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/ ディレクトリにある任意のコ マンドである。 注意: DUMPS という Cmnd_Alias に属するコマンドのひとつ、すなわち /home/operator/bin/start_backups は、sha224 ダイジェスト付きである。 そうしているのは、そ のスクリプトが置かれているディレクトリが operator ユーザによって書き込み可能だからだ。スク リプトが変更された場合 (その結果、ダイジェストが一致しないことになる)、 sudo 経由でそのス クリプトを実行することはもはや不可能になる。 joe ALL = /usr/bin/su operator ユーザ joe は、su(1) を使って operator になることしかできない。 pete HPPA = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root %opers ALL = (: ADMINGRP) /usr/sbin/ opers グループのユーザは、/usr/sbin/ にあるコマンドを、 自分自身の資格で、Runas_Alias ADMINGRP に属する任意のグループ (すなわち、adm か oper グループ) として実行できる。 ユーザ pete は、HPPA に属するマシンで root 以外なら誰のパスワードでも変更することを許され ている。 コマンドライン引き数は、結合して一つの文字列にした上で、マッチングを行うので、 ワ イルドカード '*' は、複数の単語とマッチすることになる。だから、 この例は、passwd(1) がコマ ンドラインで複数のユーザ名を受け付けないことを前提としているのである。 GNU のシステムで は、 passwd(1) に対するオプションをユーザ引き数の後ろに置くことができるのに注意していただ きたい。 そのため、このルールは次のようなコマンドも許可してしまうことになる。 passwd username --expire これは、望ましくないことかもしれない。 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_Alias に属するコマンドは実行できない。 ルール のこのくだりでは特に言っていないが、 Cmnd_Alias PAGER のコマンドはすべて /usr/bin にあり、 noexec オプションが設定されている。 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 をマウント、アンマウントできる。 上記のコマンドを打ち込むのはユー ザにとっていささか面倒なので、 シェルスクリプトとしてカプセル化してしまうのがよいだろう。 [訳注]: 注意していただきたいが、 /etc/sudoers ファイルに「user1 ALL = (ALL) ALL」といった 設定を書いても、 user1 が sudo 経由であらゆるコマンドを実行できるようになるのは、 自ホスト、すなわち、その /etc/sudoers が存在するホストだけであって、 telnet や ssh で接続したホストで sudo 経由でコマンドを実行できるとはかぎらない。 他ホストの sudo は、自分のところにある /etc/sudoers ファイルしか参照しないからである。 それでは、何故、上記の「用例」で自ホスト以外の設定が行われているのだろうか? そも そも、sudoers の書式で自ホスト以外のホストを指定できるのは、 何故なのか? ホストに ALL を指定できるのは、何故なのか? それは、管理しているサイトのすべてのホストの設 定を記した sudoers ファイルを一つ作って、それをすべてのホストにコピーして使う、 そ ういった使い方を想定しているからだろう。昔の習慣の名残りかもしれない。 もし、サイ ト中のすべてのホストの設定を一ヶ所にまとめて置き、 それをすべてのホストに共有させ たいのなら (すなわち、sudoers セキュリティポリシー設定の集中管理がしたいのなら)、 LDAP の採用を考えるべきである。
セキュリティに関する注意点
'!' 演算子の限界 一般的に言って、演算子 '!' を使用して ALL からコマンドの「引き算」をするのは、あまり効果的 な方法ではない。 ユーザは実行したいコマンドを名前を変えてコピーし、 それからそれを実行する といった簡単な方法で、裏をかくことができるからだ。 たとえば、 bill ALL = ALL, !SU, !SHELLS という行は、SU や SHELLS に列記されているコマンドの bill による実行を、 本当に阻止すること にはならない。なぜなら、bill としては、 そうしたコマンドを単に名前を変えてコピーすればよい し、 エディタなどのプログラムからシェル・エスケープを利用することもできるからだ。 だか ら、この種の制限はやった方がまし程度に考えておくべきである (そして、しっかりした運用方針に よって制限の実効力を上げるべきだ)。 一般に、もし ユーザに許可するコマンドに ALL が入っているならば、 ユーザが自分でプログラム を作って (あるいは、シェルを自分専用に別の名前でコピーして)、 ルート・シェルを獲得するのを 防ぐことはできない。 ユーザ設定でどんな項目に '!' を付けようとも防止不可能である。 fast_glob の持つセキュリティ上の問題 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 のア クセス制御やロギングをすり抜けることが可能になるからだ。 よく使うプログラムでシェル・エス ケープを許しているものには、 (当然ながら) シェル、エディタ、 ページャ、メーラ、ターミナル などがある。 この問題に対処するには、基本的に二つの方法がある。 制限 ユーザに任意のコマンドの実行を許すようなコマンドに対して、 ユーザがアクセスでき ないようにする。 エディタの場合は、制限モード (restricted mode) と称して、 シェ ル・エスケープが使えないモードを持っているものも多い。 とは言え、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 がサポートされているかどうか確認していただきたい。 あるコマンドに対して noexec を有効にするには、 上述の「ユーザ設定」セクションで 解説したように、NOEXEC タグを使用する。 そのときの例を再掲しよう。 aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi この例では、ユーザ aaron 対して、noexec を有効にした上で、 /usr/bin/more と /usr/bin/vi の実行を許可している。 このようにすれば、この二つのコマンドから (シェルのような) ほかのコマンドを実行することができなくなるわけだ。使用している システムが noexec に対応する能力があるかどうかよくわからない場合でも、 取りあえ ず試してみることなら、いつだってできる。noexec を有効にして、 シェル・エスケープ が可能かどうか確かめてみればよいのだ。 注意してほしいが、シェル・エスケープの禁止は万能薬ではない。 root の権限で動いているプログ ラムには、ほかにも、危険性のあるさまざまな作業 (ファイルの属性を変更するとか、上書きしてし まうとか) が可能であり、 思いがけずに権限を拡大してしまうこともありえるのだ。特にエディタ について言うと、 ユーザには sudoedit を実行する許可を与えるのが、より安全な方法である (下 記参照)。 安全な編集作業 sudoers プラグインでは sudoedit が使用できるようになっており、 ユーザは好みのエディタを 使って、安全にファイルを編集することができる。 sudoedit は sudo の組み込みコマンドなので、 sudoers ファイル中で指定するときは、 頭にパスを付けてはいけない。ただし、コマンドライン引 き数については、 通常のコマンドと全く同じように指定することができる。 sudoedit のコマンド ライン引き数にワイルドカードを使用した場合は、 sudoedit の引き数にはパス名が来るはずなの で、 ワイルドカードはフォワードスラッシュ ('/') にマッチしないようになっている。 sudo 経由で実行される他のコマンドとは違って、エディターは sudo を起動するユーザの資格 で、環境を変更せずに実行される。 詳しくは、sudo(8) のマニュアルの -e オプションの説明をご 覧になるとよい。 たとえば、ユーザ operator が "message of the day" ファイルを編集できるようにするに は、sudoers で次のように指定する。 operator ALL = sudoedit /etc/motd そして、ユーザ operator は、sudoedit を次のように実行する。 $ sudoedit /etc/motd エディタは、root ではなく、ユーザ operator の資格で、/etc/motd の作業用コピーに対して実行 される。ファイルの編集が済むと、 /etc/motd は作業用コピーの内容で更新されることになる。 ユーザが書き込み権限を持っているディレクトリに存在するファイルに対して、 ファイル名を直接 指定してであれ、ワイルドカードによって指定してであれ、 sudoedit を使って編集する許可をその ユーザに与えてはいけない。 もし、ユーザがディレクトリに対して書き込み権限を持っているなら ば、編集を許可されたファイルを、 別のファイルに対するリンクで置き換えることができるわけ で、そうすることによって、 任意のどんなファイルでも編集できるようになってしまうからだ。 そ うした事態を防ぐために、バージョン 1.8.16 以降の sudoedit では、 sudoedit_checkdir オプ ションが無効になっている場合や、 sudoedit を実行するユーザが root である場合を除いて、 ユーザが書き込み権限を持っているディレクトリに存在するいかなるシンボリックリンクも、 たど らないようになっている。 また、書き込み権限があるディレクトリに存在するファイルの編集を行 うことも拒否する。 さらに、バージョン 1.8.15 以降の sudoedit では、 sudoers ファイルで sudoedit_follow オプションが有効になっているか、 sudoedit コマンドの前に FOLLOW タグが指定 してあるかのどちらかでないかぎり、 シンボリックリンクをオープンしないようになっている。 タイムスタンプ・ファイルのチェック sudoers は、タイムスタンプ・ディレクトリ (デフォルトでは /var/run/sudo/ts) の所有者を調べ て、所有者が root でなかったり、 root 以外のユーザにも書き込み可能であったりすると、 その ディレクトリの中身を無視する。古いバージョンの sudo は、 タイムスタンプ・ファイルを /tmp に置いていたが、 そうしたことは今では推奨できない。 特権を持たないユーザが自分の作ったファ イルの所有者を変更できるシステムでは、 ユーザがタイムスタンプを自分で作成することが可能に なるかもしれないからだ。 タイムスタンプ・ディレクトリは、 リブートしたときにその中身を消去されるべきだが、 すべての システムに /var/run ディレクトリが存在するとはかぎらない。 問題が起きるのを避けるため に、sudoers は、 ブートタイムを参照できるシステムでは、 マシンがブートした時刻よりも古い日 時を持つタイムスタンプ・ファイルを無視する。 グラフィカルなデスクトップ環境を持っているシステムの中には、 特権を持たないユーザにシステ ム・クロックの変更を許しているものがある。 sudoers は、タイムスタンプが有効か否を確認する のに、 システム・クロックを拠り所にしている。そこで、そうしたシステムでは、 ユーザがクロッ クを後戻りさせることで、timestamp_timeout よりも長い時間 sudo を実行することが可能になるか もしれない。そうした事態に対抗するため、 sudoers は、システムがサポートしているならば、 タ イムスタンプに単調増加時計 (monotonic clock) を使用する (単調増加時計は後戻りすることがな いからだ)。 sudoers はあまりにも未来に設定されたタイムスタンプを認めない。 タイムスタンプが「現在時 + 2 * TIMEOUT」より新しい日時だった場合、 そのタイムスタンプは無視され、sudoers はログに記録 して、警告を発する。 タイムスタンプ・ファイルはファイルシステム中に作られるものだから、 ユーザのログイン・セッ ションが終わっても残っている。 そのため、ユーザがログインし、認証を行ってから sudo を使っ てコマンドを実行し、一旦ログアウトして、再度ログインしたとき、 認証なしで sudo を実行する ことが可能になってしまうかもしれない。 タイムスタンプ・ファイルに記録されているタイムスタ ンプが 5 分以内のものであれば (あるいは、sudoers ファイルで設定されているタイムアウト時間 以内のものであれば)、 そういうことが可能かもしれないのだ。 tty_tickets オプションが有効な 場合は、タイムスタンプの記録に、 ユーザが認証するときに使った端末のデバイス番号が含まれ る。それよって、 tty ごとのきめ細かな管理が可能になるが、それでもタイムスタンプの記録が、 ユーザのセッションが終わった後まで有効である可能性もある。また、 タイムスタンプの記録に は、最後に認証を行ったプロセスのセッション ID も含まれている。 別の端末セッションのプロセ スが、同じタイムスタンプの記録を使えないようにしているのだ。 それはまた、ユーザがログアウ トし、再度同じ端末にログインしたときに、 パスワードを入力することなしに sudo を実行できる 可能性を減少させる役にも立っている。
デバッギング
バージョン 1.8.4 以上の sudoers プラグインは、 デバッグのための柔軟な枠組みをサポートして おり、問題が発生したときに、 プラグインの内部で何が起きているかを突き止めるために、 それを 利用することができる。設定は sudo.conf(5) ファイルで行うことが可能だ。 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 and 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) の内部情報 sssd SSSD を使用する sudoers util ユーティリティ関数群 一例を挙げておく。 Debug sudoers.so /var/log/sudo_debug match@info,nss@info より詳しい情報については、sudo.conf(5) マニュアルをご覧いただきたい。
関連項目
ssh(1), su(1), fnmatch(3), glob(3), mktemp(3), strftime(3), sudo.conf(5), sudoers.ldap(5), sudo(8), sudo_plugin(5), visudo(8)
作者
多数の人々が長年に渡って sudo の開発に携わってきた。 当バージョンは主として次の者が書いた コードからできている。 Todd C. Miller sudo の開発に貢献してくださった方々の詳細なリストについては、 配布物中の CONTRIBUTORS ファ イルをご覧になっていただきたい。 (https://www.sudo.ws/contributors.html)
警告
sudoers ファイルの編集には、必ず visudo コマンドを使うべきである。 そうすれば、visudo が ファイルをロックし、文法のチェックをやってくれる。 sudoers ファイルに文法的な間違いがある と、sudo が動かなくなるので、 sudoers ファイルには文法エラーが絶対にあってはならないのだ。 ネットグループを (ユーザについてではなく) マシンについて使用し、 netgroup ファイルに完全修 飾ホスト名を記載する場合は (たいていそうするものだが)、hostname コマンドの返すそのマシンの ホスト名が、 完全修飾ホスト名になっていなければならない。そうでないときは、sudoers ファイ ルで fqdn オプションを使う必要がある。
バグ
sudo にバグを発見したと思ったら、https://bugzilla.sudo.ws/ にアクセスして、バグレポートを 提出していただきたい。
サポート
ある程度の無料サポートが sudo-users メーリングリストを通して利用できる。 購読やアーカイブ の検索には、次の URL をご覧になるとよい。 https://www.sudo.ws/mailman/listinfo/sudo-users
免責
sudo は「現状のまま」提供される。 明示的な、あるいは黙示的ないかなる保証も、 商品性や特定 目的への適合性についての黙示的な保証を含め、 またそれのみに止まらず、これを否認する。詳細 な全文については、 sudo と一緒に配布されている LICENSE ファイルや、 次の Web ページをご覧 いただきたい。 https://www.sudo.ws/license.html