sudoers - どのユーザが何を実行できるかのリスト sudoers ファイルは、2 つのタイプのエントリから構成される。 (基本的には変数である) エイリアスと (誰が何を実行できるかを指定する) ユーザ指定である。 sudoers の文法は、 Extended Backus-Naur Form (EBNF) (拡張バッカス・ナウア記法) を用いたかたちで以下に記述する。 EBNF を知らなくても諦めないでほしい。 EBNF は割に簡単だし、以下の定義には注釈をつけてある。

EBNF の簡単なガイド
EBNF は言語の文法を記述する簡単で厳密な方法である。 EBNF の各定義は、生成規則からなっている。 シンボル ::= 定義 | 別の定義 1 | 別の定義 2 ... 各生成規則は他の生成規則を参照する。 このようにして言語の文法ができあがる。 EBNF は以下のようなオペレータを含む。 これは多くの人が正規表現でお馴染みだろう。 しかし、これとは異なる意味を持った、 "ワイルドカード" 文字と混同してはならない (訳注: 後者はシェルのワイルドカードパターンのことだろう。 と を参照のこと)。 前に置かれたシンボル (または、シンボルのグループ) が 省略可能であることを意味する。 つまり、シンボルが 1 個登場するか、あるいは全然登場しないかである。 前に置かれたシンボル (または、シンボルのグループ) が 0 個以上登場できる。 前に置かれたシンボル (または、シンボルのグループ) が 1 個以上登場する。 括弧を使うとシンボルをグループにまとめることができる。 以降の例では、(シンボル名ではない) 文字通りの文字列は シングルクオート ('') を使用して明示する。

エイリアス
User_Alias, Runas_Alias, Host_Alias, Cmnd_Alias という 4 種類のエイリアスがある。 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_User_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 のうちの 1 つである。 NAME は、大文字・数字・ アンダースコア文字 ('_') から構成される文字列である。 NAME は大文字から始まっていなければならない。 セミコロン (':') でつなげれば、 同一タイプの複数のエイリアス定義を 1 行に置くことができる。 例を挙げる。 Alias_Type NAME = item1, item2, item3 : NAME = item4, item5 続けて、有効なエイリアスメンバを構成する要素の定義を記述する。 User_List ::= User | User ',' User_List User ::= '!'* username | '!'* '#'uid | '!'* '%'group | '!'* '+'netgroup | '!'* User_Alias User_List には、ユーザ名・ユーザ ID ('#' を前に付ける)・ システムグループ ('%' を前に付ける) ・ ネットグループ ('+' を前に付ける)・ 別のエイリアス、が 1 個以上含まれる。 リストの各アイテムの前には、1 個以上の '!' オペレータを置いてもよい。 奇数個の '!' オペレータはアイテムの値を無効にする。 偶数個のオペレータは、互いに相殺されるだけである。 Runas_List ::= Runas_User | Runas_User ',' Runas_List Runas_User ::= '!'* username | '!'* '#'uid | '!'* '%'group | '!'* +netgroup | '!'* Runas_Alias 同様に、Runas_List は User_List と同じ要素を持つことができる。 ただし、User_Alias ではなく Runas_Alias を含む点が異なる。 Host_List ::= Host | Host ',' Host_List Host ::= '!'* hostname | '!'* ip_addr | '!'* network(/netmask)? | '!'* '+'netgroup | '!'* Host_Alias Host_List には、ホスト名・IP アドレス・ ネットワーク番号・ネットグループ ('+' を前に付ける)・ その他のエイリアス、が 1 個以上含まれる。 ここでも、アイテムの値は '!' オペレータによって無効にされる。 ネットワーク番号にネットマスクを指定しない場合、 ホストのイーサネットインターフェースのネットマスクが マッチングの際に使われる。 ネットマスクは、ドットで 4 つに区切った表記 (例えば 255.255.255.0) と CIDR 表記 (ビットの数、例えば 24) のどちらで指定してもよい。 ホスト名には、シェル形式のワイルドカード (以下の `ワイルドカード' のセクションを参照) を使ってもよい。 ただし、計算機の hostname コマンドが 完全なドメイン名付きのホスト名を返さない場合に ワイルドカードを使えるようにするには、 fqdn オプションを指定する必要があるだろう。 Cmnd_List ::= Cmnd | Cmnd ',' Cmnd_List commandname ::= filename | filename args | filename '""' Cmnd ::= '!'* commandname | '!'* directory | '!'* Cmnd_Alias Cmnd_List は、コマンド名・ディレクトリ・別のエイリアス、が 1 個以上含まれるリストである。 コマンド名は完全なファイル名で、シェル形式のワイルドカード (以下の `ワイルドカード' セクションを参照) を使うことができる。 単なるファイル名にすると、望みの引き数とともにコマンドを実行することができる。 しかし、さらに (ワイルドカードをも含む) コマンドライン引き数を指定することもできる。 反対に、コマンドライン引き数なしでコマンドを実行させるには、 "" を指定すれば良い。 ディレクトリは '/' でおわる完全なパス名である。 Cmnd_List でディレクトリを指定すると、 ユーザはそのディレクトリにある全てのファイルを実行できる (しかし、そのサブディレクトリにあるファイルは実行できない)。 Cmnd がコマンドライン引き数と関連づけられている場合、 Cmnd の中の引き数は、 ユーザがコマンドラインで指定した引き数と完全にマッチしなければならない (ワイルドカードがあった場合は、それと完全にマッチしなければならない)。 ',', ':', '=', '\' という文字を コマンドライン引き数として使う場合、 '\' でエスケープしなければならない点に注意すること。

デフォルト
ある設定オプションの値を、1 行以上の Default_Entry 行を使って、 デフォルトの値から変更することができる。 この行が効果を持つ範囲は、全てのホスト上の全てのユーザにすることも、 指定したホスト上の全てのユーザにすることも、 指定したユーザにすることもできる。 複数のエントリがマッチする場合は、順番に適用される。 矛盾する値がある場合は、マッチする行の最後の値が効果を持つ。 Default_Type ::= 'Defaults' || 'Defaults' ':' User || 'Defaults' '@' Host Default_Entry ::= Default_Type Parameter_List Parameter ::= Parameter '=' Value || '!'* Parameter || Parameter は フラグ・整数・文字列 のいずれかである。 フラグは実は真偽値であり、'!' オペレータで off にできる。 整数と文字列パラメータのなかにも真偽値の意味で使えるものがあり、 それらは無効にできる。 値に複数のワードが含まれる場合は、 ダブルクオート (") で囲まなければならない。 特殊文字はバックスラッシュ (\) でエスケープしなければならない。 フラグ: (S/Key や OPIE などの) ワンタイムパスワードを使用している場合にこのオプションが有効になっていると、 ローカルなウインドウに入力したパスワードを 簡単にカット＆ペーストできるように、2 行のプロンプトが使われる。 これをデフォルトにするのは良くないが、便利だと言う人もいる。 このフラグはデフォルトでは off である。 このフラグを設定すると、$PATH にある (カレントディレクトリを表す) '.' と '' が無視される。 $PATH そのものは変更されない。 このフラグはデフォルトでは off である。 ユーザが sudo を実行する度に、mailto ユーザにメールが送られる。 このフラグはデフォルトでは off である。 このフラグを設定すると、 sudo を起動したユーザが sudoers ファイルにない場合、 mailto ユーザにメールが送られる。 このフラグはデフォルトでは on である。 このフラグを設定すると、 sudo を起動したユーザが sudoers ファイルに存在するが、 現在のホストでコマンドを実行することが許可されていない場合、 mailto ユーザにメールが送られる。 このフラグはデフォルトでは off である。 このフラグを設定すると、 ユーザが sudo を使うことは許可されているが、 実行しようとしたコマンドが sudoers ファイルのエントリにない場合、 mailto ユーザにメールが送られる。 このフラグはデフォルトでは off である。 このフラグを設定すると、 ユーザは tty 毎に認証しなければならない。 通常、sudo はチケットディレクトリの中にある 実行しているユーザと同じ名前のディレクトリを使う。 このフラグが on になっていると、sudo は チケットディレクトリの中にある ユーザがログインしている tty に対応したファイル名を使う。 このフラグはデフォルトでは off である。 このフラグを設定すると、 初めて sudo を実行したとき、ユーザは短いレクチャーを受け取る。 このフラグはデフォルトでは on である。 このフラグを設定すると、 ユーザはパスワード (もしくは、別の認証方法) で自分自身に対して 認証をしなければならない。 このデフォルトの値は PASSWD タグと NOPASSWD タグを使って変更できる。 このフラグはデフォルトでは on である。 このフラグを設定すると、root も sudo が実行できる。 このフラグを off にすると、ユーザが "sudo sudo /bin/sh" のようにして root のシェルを入手しようと "挑戦する" ことが防止できる。 このフラグはデフォルトでは on である。 このフラグを設定すると、 ホスト名が (syslog ではない) sudo ログファイルに記録される。 このフラグはデフォルトでは off である。 このフラグを設定すると、 4 桁の年が (syslog ではない) sudo ログファイルに記録される。 このフラグはデフォルトでは off である。 このフラグが設定されている場合に sudo が引き数なしで起動されると、 -s フラグが与えられた場合と同様に動作する。 つまり、sudo はシェルを root として実行する (環境変数 SHELL が設定されている場合、 シェルはその環境変数で決定される。 設定されていない場合、 起動したユーザの /etc/passwd のエントリにあるシェルを使う)。 このフラグはデフォルトでは off である。 このフラグが設定されている場合に sudo が -s フラグで起動されると、 環境変数 HOME が対象ユーザのホームディレクトリに設定される (この場合の対象ユーザは、-u オプションで指定されない限り root である)。 このフラグは、-s フラグが使われた場合に -H を暗黙のうちに有効にする。 このフラグはデフォルトでは off である。 通常 sudo はコマンドが $PATH に見つからない場合ユーザに告知する。 通常のユーザが、アクセスできない実行ファイルの場所に関する 情報を収集できないように、 サイトによってはこの告知をユーザに行わないようにしたいことがあるかもしれない。 しかし告知を行わないと、 単に実行ファイルがユーザの $PATH にないだけの場合でも、 sudo はユーザに「実行許可がない」と伝えてしまい、 紛らわしくなる。 このフラグはデフォルトでは off である。 sudoers ファイルに完全なドメイン名付きのホスト名を入れたい場合は、 このフラグを設定する。 すなわち myhost ではなく myhost.mydomain.edu を使いたい場合である。 このフラグを設定しても、使いたければ短い形式を使うことができる (短い形式と完全な形式を混ぜて使うこともできる)。 fqdn を on にすると、sudo は DNS のルックアップが必要になることに注意すること。 DNS のルックアップをすると、 DNS が稼働していないとき (計算機がネットワークに接続されていない場合など) sudo は安全でなくなる。 DNS にあるホストの正式な名前を使わなければならない点にも注意すること。 つまり、パフォーマンスの問題と DNS から全てのエイリアスを取得できないという問題から、 ホスト名のエイリアス (CNAME エントリ) を使うことはできない。 (hostname コマンドで返される) 計算機のホスト名が 既にドメイン名付きの完全なものである場合、 fqdn を設定するべきではない。 このフラグはデフォルトでは off である。 このフラグを設定すると、sudo は 不正なパスワードを入力したユーザを侮辱する。 このフラグはデフォルトでは off である。 このフラグを設定すると、 ユーザが real tty からログインしているときのみ sudo が実行できる。 rsh(1) は tty を確保しないので、 "rsh somehost sudo ls" といったことが許可されなくなる。 tty がないとエコーが消せないので、 入力時にパスワードが現れてしまうのを防止するために、 このフラグを設定したいと思うサイトもあるだろう。 このフラグはデフォルトでは off である。 このフラグを設定すると、visudo は デフォルトのエディタとして環境変数 EDITOR と VISUAL の値を使う。 大部分のエディタではユーザがシェル (root のシェルの場合もあり、ログに記録されない) を取得できてしまうので、 これはセキュリティホールを作ってしまうことに注意すること。 このフラグを設定すると、sudo は 起動したユーザのパスワードではなく、 root のパスワードを要求する。 このフラグを設定すると、sudo は 起動したユーザのパスワードではなく、 runas_default オプションで定義されたユーザ (デフォルトでは root) のパスワードを要求する。 このフラグを設定すると、sudo は 起動したユーザのパスワードではなく、 -u フラグで指定されたユーザ (デフォルトでは root) のパスワードを要求する。 通常 sudo は環境変数 LOGNAME と USER を対象ユーザ (-u フラグで指定されないければふつうは root) の名前に設定する。 しかし、実際のユーザの識別に LOGNAME を使うプログラム (RCS revision control system などが含まれる) があるので、 この挙動を変更したいこともある。 これには set_logname を off にすればよい。 このフラグを設定すると、sudo は、 対象ユーザのログインクラスがあれば、それに指定されたデフォルトの値を適用する。 sudo の (コンパイル時に) --with-logincap オプションが 設定されている場合にのみ、有効である。 整数: sudo が失敗をログに記録して終了するまでに、 ユーザがパスワードを入力できる回数。 デフォルトは 3。 真偽値としても使用される整数: ファイルログの 1 行当たりの文字数。 この値は、ログファイルを見やすくするために、 行を何桁で折り返すかを決定するために使われる。 syslog ファイルには何も影響せず、ファイルログだけに影響する。 デフォルトは 80 (折り返しをしない場合は 0 を指定する)。 sudo が再度パスワードを尋ねるまでに経過する分数。 デフォルトは 5。 常にパスワードを要求させるには 0 に設定する。 sudo のパスワード要求が時間切れになるまでの分数。 デフォルトは 5。 パスワード要求の時間切れをなくすには 0 に設定する。 root コマンドを実行する場合の umask。 ユーザの umask を上書きしないためには、0777 に設定すること。 デフォルトは 0022。 文字列: mailto ユーザに送られるメールの Subject (題名)。 エスケープ %h は計算機のホスト名に展開される。 デフォルトは "*** SECURITY information for %h ***"。 ユーザが不正なパスワードを入力した場合に表示されるメッセージ。 insults が設定されていない限り、 デフォルトは "Sorry, try again."。 sudo がタイムスタンプファイルを置くディレクトリ。 デフォルトは @TIMEDIR@。 パスワードを尋ねるときに使われるデフォルトのプロンプト。 -p オプションや環境変数 SUDO_PROMPT を使って変更できる。 2 つのエスケープがサポートされている。 "%u" はユーザのログイン名に展開され、 "%h" はローカルホスト名に展開される。 デフォルトの値は "Password:"。 -u フラグがコマンドラインで指定されていない場合に、 コマンドを実行するデフォルトのユーザ。 デフォルトは "root"。 ユーザが認証に成功した場合に使われる syslog の priority。 デフォルトは "notice"。 ユーザが認証に失敗した場合に使われる syslog の priority。 デフォルトは "alert"。 visudo が使用するエディタのパス。 デフォルトはシステム上の vi のパス。 真偽値としても使用される文字列: (syslog ログファイルではなく) sudo ログファイルへのパス。 パスを設定すると、そのファイルへログが記録される。 設定しなければ、記録されない。 ログの記録に syslog が使われている場合の syslog の facility (syslog によるログの記録をしない場合は、設定しないこと)。 デフォルトは "local2"。 警告メールを送るのに使われるメールプログラムのパス。 デフォルトは、設定時に見つかった sendmail のパス。 メーラーを起動するときに使われるフラグ。 デフォルトは -t。 警告メールとエラーメールを送るアドレス。 デフォルトは "root"。 このグループに属するユーザは、パスワードと PATH が必要ない。 デフォルトでは設定されていない。 sudo で実行される全てのコマンドに使われるパス。 sudo を実行するユーザを信用していない場合、 使用させたい正しい環境変数 PATH を指定する。 別の使用法としては、"root のパス" を "ユーザのパス" と 分けるために使う場合がある。 デフォルトでは設定されていない。 このオプションは、ユーザが sudo を -v オプションで実行したときに、 いつパスワードが必要とされるかを制御する。 このオプションには以下の値のいずれかを設定できる。 all パスワードの入力をなしですませるためには、 現在のホストのすべてのユーザの I<sudoers> エントリに C<NOPASSWD> フラグが設定されて いなければならない。 any パスワードの入力をなしですませるためには、 現在のホストの少なくとも一人のユーザの I<sudoers> エントリに C<NOPASSWD> フラグが 設定されていなければならない。 never ユーザは、B<-v> フラグを使う際に パスワードを必要としない。 always ユーザは、B<-v> フラグを使う際に 常にパスワードを入力する必要がある。 デフォルトの値は `all' である。 このオプションは、ユーザが sudo を -l オプションで実行したときに、 いつパスワードが必要とされるかを制御する。 このオプションには以下の値のいずれかを設定できる。 all パスワードの入力をなしですませるためには、 現在のホストのすべてのユーザの I<sudoers> エントリに C<NOPASSWD> フラグが設定されて いなければならない。 any パスワードの入力をなしですませるためには、 現在のホストの少なくとも一人のユーザの I<sudoers> エントリに C<NOPASSWD> フラグが 設定されていなければならない。 never ユーザは、B<-l> フラグを使う際に パスワードを必要としない。 always ユーザは、B<-l> フラグを使う際に 常にパスワードを入力する必要がある。 デフォルトの値は `any' である。 syslog(3) でログを記録している場合、 sudo は syslog の facility (syslog パラメータの値) として、 authpriv (OS がサポートしている場合), auth, daemon, user, local0, local1, local2, local3, local4, local5, local6, local7 を受け付ける。 syslog の prioritiy としては、 alert, crit, debug, emerg, err, info, notice, warning がサポートされている。

ユーザ設定
User_Spec ::= User_list Host_List '=' User_List Cmnd_Spec_List \ (':' User_Spec)* Cmnd_Spec_List ::= Cmnd_Spec | Cmnd_Spec ',' Cmnd_Spec_List Cmnd_Spec ::= Runas_Spec? ('NOPASSWD:' | 'PASSWD:')? Cmnd Runas_Spec ::= '(' Runas_List ')' ユーザ設定は、指定したホスト上でユーザが (どのユーザとして) どのコマンドを実行できるかを決定する。 デフォルトではコマンドは root として実行されるが、 これはコマンド毎に変更可能である。 ユーザ設定を構成要素ごとに分けてみる。

Runas_Spec
Runas_Spec は単に (上で定義した) Runas_List を括弧で括ったものである。 ユーザ設定で Runas_Spec を指定しないと、 root のデフォルトの Runas_Spec が使われる。 Runas_Spec は、その後に続くコマンドのデフォルトを設定する。 つまり: dgb boulder = (operator) /bin/ls, /bin/kill, /usr/bin/who のようなエントリがある場合、 ユーザ 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 として 実行することが許可される。

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 ただし、PASSWD タグは exempt_group オプションで 指定されたグループに属しているユーザには効果がない点に注意すること。 デフォルトでは、現在のホスト上のあるユーザのどれかのエントリに NOPASSWD タグが適用されていれば、 そのユーザは sudo -l をパスワードなしに実行できるようになる。 さらに、あるユーザの現在のホストに関連する全てのエントリに NOPASSWD タグがある場合に限り、 そのユーザは sudo -v をパスワードなしに実行できるようになる。 この動作は verifypw と listpw オプションを使って変更できる。

ワイルドカード (別名、メタキャラクタ):
sudo は sudoers ファイルにおいて、 コマンドライン引き数やパス名に対して シェル形式のワイルドカードを使うことができる。 ワイルドカードのマッチングは、 POSIX の fnmatch(3) ルーチンを使って行われる。 正規表現ではない点に注意すること。 任意の 0 個以上の文字にマッチする。 任意の 1 個の文字にマッチする。 指定した範囲にある任意の文字にマッチする。 指定した範囲にない任意の文字にマッチする。 "x" で評価される任意の文字 "x"。 これは、"*", "?", "[", "}" のような エスケープ文字に対して使われる。 フォワードスラッシュ ('/') は、パス名で使われるワイルドカードに対しては マッチしない点に注意すること。 コマンドライン引き数に対してマッチングをする場合、 スラッシュはワイルドカードにマッチする。 これは /usr/bin/* のようなパスを、 /usr/bin/who にはマッチさせ、 /usr/bin/X11/xterm にはマッチさせないようにするためである。

ワイルドカードの規則における例外:
上の規則に対して、次の例外が適用される。 空の文字列 "" が sudoers エントリの 唯一のコマンドライン引き数である場合、 「コマンドに引き数をつけたときは、実行することが許可されない」 ということを意味する。

その他の特殊文字と予約語:
シャープ記号 ('#') はコメントを表すために使われる。 (ユーザ名で使われている場合は除く。 また、1 個以上の数字が続いていて、ユーザ ID として扱われる場合も除く。) コメント文字とそれ以降のテキストは、行末まで無視される。 予約語 ALL は組込みのエイリアスで、 常にマッチを成功させる。 この予約語はどこでも使える。 これを使いたくない場合は、 Cmnd_Alias, User_Alias, Runas_Alias, Host_Alias を使うこと。 ALL という エイリアス を自分で定義しようとしてはならない。 組込みのエイリアスが優先されるからである。 ALL を使うと危険になる可能性がある点に注意すること。 なぜなら、これをコマンドの指定で使うと、 ユーザはシステム上の全てのコマンドを実行できるからである。 感嘆符 ('!') は、エイリアスの中と Cmnd の前で、 論理学の not オペレータとして使うことができる。 これにより、ある値を排除できる。 しかし ! を組込みの ALL エイリアスと組み合わせて、 ユーザが "全てではなく一部の" コマンドを実行できるように しようとしても、意図したように動作することは稀である点に注意すること (以下の「セキュリティ上の注意」を参照)。 長い行は、バックスラッシュ ('\') を行の最後の文字にすれば 続けることができる。 リストにおける構成要素間の空白や、 ユーザ設定における特殊な構文文字 ('=', ':', '(', ')') は、なくてもよい。 '@', '!', '=', ':', ',', '(', ')', '\' という文字をワード (例えば、ユーザ名やホスト名) の一部として使う場合は、 バックスラッシュ ('\') でエスケープしなければならない。 以下は sudoers エントリの例である。 正直なところ、いくつかは少しわざとらしい。 始めにエイリアスを定義する。 # User alias specification User_Alias FULLTIMERS = millert, mikef, dowdy User_Alias PARTTIMERS = bostley, jwfox, crawl User_Alias WEBMASTERS = will, wendy, wim # Runas alias specification Runas_Alias OP = root, operator Runas_Alias DB = oracle, sybase # Host alias specification 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 specification 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, /usr/sbin/fasthalt Cmnd_Alias REBOOT = /usr/sbin/reboot, /usr/sbin/fastboot 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 以下の設定では、コンパイル時のデフォルト値のいくつかを上書きする。 sudo に syslog(3) を使って 全ての場合について auth facility でログを記録させる。 フルタイムのスタッフには、sudo のレクチャーを受ける必要をなくす。 またユーザ millert はパスワードを入力しなくてよいようにする。 さらに Host_Alias の SERVERS にある計算機に (syslog とは別に) ローカルのログファイルを保存し、 長いログエントリを数年に渡り保存するためにログの各行に年を記録する。 # Override builtin defaults Defaults syslog=auth Defaults:FULLTIMERS !lecture Defaults:millert !authenticate Defaults@SERVERS log_year, logfile=/var/log/sudo.log ユーザ設定は、誰が何を実行できるかを実際に決定している部分である。 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> だけに クラス C ネットワークを示す明示的な (CIDR 表記の) ネットマスクがある。 CSNETS にある他のネットワークについては、 マッチングの際にローカルの計算機のネットマスクが使われる。 lisa CUNETS = ALL ユーザ lisa は、CUNETS エイリアス (クラス B ネットワーク 128.138.0.0) にある 全てのホストで、全てのコマンドを実行できる。 operator ALL = DUMPS, KILL, PRINTING, SHUTDOWN, HALT, REBOOT,\ /usr/oper/bin/ ユーザ operator は、 簡単なメンテナンス用のコマンドに限って実行することができる。 これらはディレクトリ /usr/oper/bin/ にあるコマンド全てで、 バックアップ・プロセスの kill・印刷システム・システムのシャットダウン、 といったことに関連したものである。 joe ALL = /usr/bin/su operator ユーザ joe は、operator になるための su(1) しか実行できない。 pete HPPA = /usr/bin/passwd [A-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* ALPHA 計算機上で、ユーザ john は、 su で root 以外の全てのユーザになれる。 しかし su(1) にフラグを指定することはできない。 jen ALL, !SERVERS = ALL ユーザ jen は、Host_Alias の SERVERS にある計算機 (master, mail, www, ns) 以外で、全てのコマンドを実行できる。 jill SERVERS = /usr/bin/, !SU, !SHELLS Host_Alias の SERVERS にある計算機で、 jill は /usr/bin ディレクトリにある全てのコマンドを実行できる。 ただし、Cmnd_Aliases の SU と SHELLS に属しているコマンドは除く。 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) は、(web ページを所有している) ユーザ www として 全てのコマンドを実行できる。 また、単に 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 のマウントとアンマウントができる。 このコマンドをユーザが入力するのは長くて大変なので、 シェルスクリプトに書いてカプセル化してしまう方がよい。 '!' オペレータを使って ALL から コマンドを "差し引く" ことは、一般に有効でない。 ユーザは、欲しいコマンドを別な名前でコピーして実行すれば、 これを簡単に回避できてしまう。 例を挙げる。 bill ALL = ALL, !SU, !SHELLS 上の例では、実際には SU と SHELLS にリストされているコマンドを bill に実行させないようにすることができない。 なぜなら、bill は、これらのコマンドを別な名前にコピーしたり、 エディタや他のコマンドのシェルエスケープから使えるからである。 よって、このような制限は、せいぜい補助的なものと考えるべきである (さらにポリシーで強化すべきである)。 sudoers ファイルは、常に visudo コマンドで編集すべきである。 このコマンドは、ファイルをロックし、文法チェックをする。 sudo は sudoers ファイルが文法的に間違っていると実行できないので、 sudoers にはエラーがひとつも無いようにしなければならない。 (ユーザのではなく) 計算機のネットグループを使う場合、 (よくあるように) ネットグループに 完全なドメイン名付きのホスト名を入れる場合、 ホスト名は hostname で返される 完全なドメイン名付きのものである必要がある。 また sudoers に fqdn オプションを指定する必要がある。 /etc/sudoers 誰が何を実行できるかのリスト /etc/group ローカルのグループファイル /etc/netgroup ネットワークグループのリスト sudo(8), visudo(8), su(1), fnmatch(3).