名前
sudoers - どのユーザが何を実行できるかのリスト
説明
sudoers ファイルは、2 つのタイプのエントリから構成される。 (基本的には変数である) エイリアスと (誰が何を実行できるかを指定する) ユーザ指定である。 sudoers の文法は、 Extended Backus-Naur Form (EBNF) (拡張バッカス・ナウア記法) を用いたかたちで以下に記述する。 EBNF を知らなくても諦めないでほしい。 EBNF は割に簡単だし、以下の定義には注釈をつけてある。
\s-1EBNF\s0 の簡単なガイド
EBNF は言語の文法を記述する簡単で厳密な方法である。 EBNF の各定義は、生成規則からなっている。
シンボル ::= 定義 | 別の定義 1 | 別の定義 2 ...
各生成規則は他の生成規則を参照する。 このようにして言語の文法ができあがる。 EBNF は以下のようなオペレータを含む。 これは多くの人が正規表現でお馴染みだろう。 しかし、これとは異なる意味を持った、 ワイルドカード 文字と混同してはならない (訳注: 後者はシェルのワイルドカードパターンのことだろう。 regex(7) と glob(7) を参照のこと)。
? | 前に置かれたシンボル (または、シンボルのグループ) が 省略可能であることを意味する。 つまり、シンボルが 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_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 |
!* %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と似ているが、 (# を前に付けた) uid を含めることもできる。 また
User_Aliases ではなく、
Runas_Aliases を含めることができる。
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 += Value ||
Parameter -= Value ||
!* Parameter ||
Parameter は フラグ・整数・ 文字列・リストのいずれかである。 フラグは実は真偽値であり、! オペレータで off にできる。 整数・文字列・リストのパラメータのなかにも真偽値の意味で使えるものがあり、 それらは無効にできる。 値に複数のワードが含まれる場合は、 ダブルクオート (
") で囲まなければならない。 特殊文字はバックスラッシュ (
\) で エスケープしなければならない。
リストにはその他に 2 つの代入オペレータ
+=と
-=がある。 これらのオペレータはそれぞれリストの追加と削除を行う。
-=オペレータを使って リストに存在しない要素を削除するとエラーになる。
sudoers ファイルを順序正しく解析させるため、 デフォルトセクションは Host, User, Cmnd エイリアスより前で ユーザ指定より後にする点に注意すること。
フラグ:
long_otp_prompt | (S/Key や OPIE などの) ワンタイムパスワードを使用している場合にこのオプションが有効になっていると、 ローカルなウインドウに入力したパスワードを 簡単にカット&ペーストできるように、2 行のプロンプトが使われる。 これをデフォルトにするのは良くないが、便利だと言う人もいる。 このフラグはデフォルトでは off である。 | ||||||||
ignore_dot |
このフラグを設定すると、環境変数 PATHにある (カレントディレクトリを表す) . と が無視される。 PATHそのものは変更されない。 このフラグはデフォルトでは off である。 | ||||||||
mail_always | ユーザが sudo を実行する度に、mailto ユーザにメールが送られる。 このフラグはデフォルトでは off である。 | ||||||||
mail_badpass | sudo を実行したユーザが正しいパスワードを入力しなかった場合、 mailto ユーザにメールが送られる。 このフラグはデフォルトでは off である。 | ||||||||
mail_no_user | このフラグを設定すると、 sudo を起動したユーザが sudoers ファイルにない場合、 mailto ユーザにメールが送られる。 このフラグはデフォルトでは on である。 | ||||||||
mail_no_host | このフラグを設定すると、 sudo を起動したユーザが sudoers ファイルに存在するが、 現在のホストでコマンドを実行することが許可されていない場合、 mailto ユーザにメールが送られる。 このフラグはデフォルトでは off である。 | ||||||||
mail_no_perms | このフラグを設定すると、 ユーザが sudo を使うことは許可されているが、 実行しようとしたコマンドが sudoers ファイルのエントリにない場合、 mailto ユーザにメールが送られる。 このフラグはデフォルトでは off である。 | ||||||||
tty_tickets | このフラグを設定すると、 ユーザは tty 毎に認証しなければならない。 通常、sudo はチケットディレクトリの中にある 実行しているユーザと同じ名前のディレクトリを使う。 このフラグが on になっていると、sudo は チケットディレクトリの中にある ユーザがログインしている tty に対応したファイル名を使う。 このフラグはデフォルトでは off である。 | ||||||||
lecture | このフラグを設定すると、 初めて sudo を実行したとき、ユーザは短いレクチャーを受け取る。 このフラグはデフォルトでは on である。 | ||||||||
authenticate |
このフラグを設定すると、
ユーザはパスワード (もしくは、別の認証方法) で自分自身に対して
認証をしなければならない。
このデフォルトの値は PASSWDタグと NOPASSWDタグを使って変更できる。 このフラグはデフォルトでは on である。 | ||||||||
root_sudo |
このフラグを設定すると、root も sudo が実行できる。
このフラグを off にすると、
ユーザが "sudo sudo /bin/sh"のようにして root のシェルを入手しようと 挑戦する ことが防止できる。 このフラグはデフォルトでは on である。 | ||||||||
log_host | このフラグを設定すると、 ホスト名が (syslog ではない) sudo ログファイルに記録される。 このフラグはデフォルトでは off である。 | ||||||||
log_year | このフラグを設定すると、 4 桁の年が (syslog ではない) sudo ログファイルに記録される。 このフラグはデフォルトでは off である。 | ||||||||
shell_noargs |
このフラグが設定されている場合に sudo が引き数なしで起動されると、
-s フラグが与えられた場合と同様に動作する。
つまり、sudo はシェルを root として実行する
(環境変数 SHELLが設定されている場合、 シェルはその環境変数で決定される。 設定されていない場合、 起動したユーザの /etc/passwd のエントリにあるシェルを使う)。 このフラグはデフォルトでは off である。 | ||||||||
set_home |
このフラグが設定されている場合に
sudo が -s フラグで起動されると、
環境変数 HOMEが対象ユーザのホームディレクトリに設定される (この場合の対象ユーザは、-u オプションで指定されない限り root である)。 このフラグは、-s フラグが使われた場合に -H を暗黙のうちに有効にする。 このフラグはデフォルトでは off である。 | ||||||||
always_set_home |
このフラグを設定すると、sudo は環境変数 HOMEを 対象ユーザ (-u オプションを使わない限りは root) の ホームディレクトリに設定する。 このフラグは -H を暗黙のうちに有効にする。 このフラグはデフォルトでは off である。 | ||||||||
path_info |
通常 sudo はコマンドが PATH環境変数に見つからない場合ユーザに告知する。 通常のユーザが、アクセスできない実行ファイルの場所に関する 情報を収集できないように、 サイトによってはこの告知をユーザに行わないようにしたいことがあるかもしれない。 しかし告知を行わないと、 単に実行ファイルがユーザの PATHにないだけの場合でも、 sudo はユーザに「実行許可がない」と伝えてしまい、 紛らわしくなる。 このフラグはデフォルトでは off である。 | ||||||||
preserve_groups | デフォルトでは、sudo はグループベクトルを 対象ユーザが所属するグループのリストで初期化する。 preserve_groups が設定された場合、 ユーザが既に持っているグループベクトルは変更されない。 だだし実グループ ID と実効グループ ID は、 対象ユーザにマッチするように設定される。 このフラグはデフォルトでは off である。 | ||||||||
fqdn |
sudoers ファイルに完全なドメイン名付きのホスト名を入れたい場合は、
このフラグを設定する。
すなわち myhost ではなく myhost.mydomain.edu を使いたい場合である。
このフラグを設定しても、使いたければ短い形式を使うことができる
(短い形式と完全な形式を混ぜて使うこともできる)。
fqdn を on にすると、sudo は
DNS のルックアップが必要になることに注意すること。
DNS のルックアップをすると、
DNS が稼働していないとき
(計算機がネットワークに接続されていない場合など)
sudo は安全でなくなる。
DNS にあるホストの正式な名前を使わなければならない点にも注意すること。
つまり、パフォーマンスの問題と
DNS から全てのエイリアスを取得できないという問題から、
ホスト名のエイリアス (CNAMEエントリ) を使うことはできない。 ( hostnameコマンドで返される) 計算機のホスト名が 既にドメイン名付きの完全なものである場合、 fqdn を設定するべきではない。 このフラグはデフォルトでは off である。 | ||||||||
insults | このフラグを設定すると、sudo は 不正なパスワードを入力したユーザを侮辱する。 このフラグはデフォルトでは off である。 | ||||||||
requiretty |
このフラグを設定すると、
ユーザが real tty からログインしているときのみ sudo が実行できる。
rsh(1) は tty を確保しないので、
"rsh somehost sudo ls"といったことが許可されなくなる。 tty がないとエコーが消せないので、 入力時にパスワードが現れてしまうのを防止するために、 このフラグを設定したいと思うサイトもあるだろう。 このフラグはデフォルトでは off である。 | ||||||||
env_editor |
このフラグを設定すると、visudo は
デフォルトのエディタリストを使う前に、
環境変数 EDITOR と VISUAL の値を使う。
ユーザはログに記録されることなく
任意のコマンドを root として実行できてしまうので、
セキュリティホールを作ってしまうことに注意すること。
安全な代替案としては、
コンマで区切ったエディタのリストを
editor変数に設定することである。 そうするとvisudo は、 editorに指定された値に EDITOR または VISUAL がマッチするときにのみ、 その環境変数を使う。 このフラグはデフォルトでは off である。 | ||||||||
rootpw | このフラグを設定すると、sudo は 起動したユーザのパスワードではなく、 root のパスワードを要求する。 このフラグはデフォルトでは off である。 | ||||||||
runaspw |
このフラグを設定すると、sudo は
起動したユーザのパスワードではなく、
runas_default オプションで定義されたユーザ
(デフォルトでは root) のパスワードを要求する。 このフラグはデフォルトでは off である。 | ||||||||
targetpw |
このフラグを設定すると、sudo は
起動したユーザのパスワードではなく、
-u フラグで指定されたユーザ
(デフォルトでは root) のパスワードを要求する。 このフラグはデフォルトでは off である。 | ||||||||
set_logname |
通常 sudo は環境変数 LOGNAMEと USERを対象ユーザ (-u フラグで指定されないければふつうは root) の名前に設定する。 しかし、実際のユーザの識別に LOGNAMEを使うプログラム (RCS revision control system などが含まれる) があるので、 この挙動を変更したいこともある。 これには set_logname オプションを off にすればよい。 | ||||||||
stay_setuid | 通常 sudo がコマンドを実行する場合、 実 UID と実行 UID は対象ユーザ (デフォルトは root) に設定される。 このオプションは実 UID を 起動したユーザの UID のままにするように動作を変更する。 言い換えると、このオプションは sudo を setuid ラッパーとして 動作させるということである。 これはプログラムが setuid されて実行されるときの 潜在的に危険な機能を無効にしているシステムで役立つ。 ただし sudo は起動したユーザーの実 UID で実行されるので、 OS におけるシグナルと setuid プロセスの相互作用の定義によっては、 sudo が失敗をログに記録する前にユーザが kill できる点に注意すること。 | ||||||||
env_reset |
このフラグを設定すると、sudo は以下の変数のみを含むように
環境をリセットする: HOME, LOGNAME, PATH, SHELL, TERM, USER( SUDO_*以外に)。 これらのうちで TERMだけが 以前の環境からコピーされる。 他の変数はデフォルトの値に設定される (set_logname オプションの値で変更可能)。 sudo が SECURE_PATHオプションを付けて コンパイルされている場合、 その値は環境変数 PATHに使われる。 他の変数は env_keep オプションで保存することもできる。 | ||||||||
use_loginclass | このフラグを設定すると、sudo は、 対象ユーザのログインクラスがあれば、それに指定されたデフォルトの値を適用する。 sudo の (コンパイル時に) --with-logincap オプションが 設定されている場合にのみ、有効である。 このフラグはデフォルトでは off である。 | ||||||||
整数: | |||||||||
passwd_tries |
sudo が失敗をログに記録して終了するまでに、
ユーザがパスワードを入力できる回数。
デフォルトは 3。 | ||||||||
真偽値としても使用される整数: | |||||||||
loglinelen |
ファイルログの 1 行当たりの文字数。
この値は、ログファイルを見やすくするために、
行を何桁で折り返すかを決定するために使われる。
syslog ファイルには何も影響せず、ファイルログだけに影響する。
デフォルトは 80(折り返しをしない場合は 0 を指定する)。 | ||||||||
timestamp_timeout |
sudo が再度パスワードを尋ねるまでに経過する分数。
デフォルトは 5。 常にパスワードを要求させるには 0に設定する。 0より小さい値に設定すると、 ユーザのタイムスタンプは失効しない。 これはユーザが自身のタイムスタンプの作成・削除を sudo -vや sudo -kで可能にするために使う。 | ||||||||
passwd_timeout |
sudo のパスワード要求が時間切れになるまでの分数。
デフォルトは 5。 パスワード要求の時間切れをなくすには 0に設定する。 | ||||||||
umask |
コマンドを実行する場合の umask。
ユーザの umask を上書きしないためには、
このオプションを無効にするか 0777 に設定すること。
デフォルトは 0022。 | ||||||||
文字列: | |||||||||
mailsub |
mailto ユーザに送られるメールの Subject (題名)。
エスケープ %hは計算機のホスト名に展開される。 デフォルトは *** SECURITY information for %h ***。 | ||||||||
badpass_message |
ユーザが不正なパスワードを入力した場合に表示されるメッセージ。
insults が設定されていない限り、
デフォルトは Sorry, try again.。 | ||||||||
timestampdir | sudo がタイムスタンプファイルを置くディレクトリ。 デフォルトは /var/run/sudo。 | ||||||||
passprompt |
パスワードを尋ねるときに使われるデフォルトのプロンプト。
-p オプションや環境変数
SUDO_PROMPTを使って変更できる。 2 つのエスケープがサポートされている。 %u はユーザのログイン名に展開され、 %h はローカルホスト名に展開される。 デフォルトの値は Password:。 | ||||||||
runas_default |
-u フラグがコマンドラインで指定されていない場合に、
コマンドを実行するデフォルトのユーザ。
デフォルトは root。 | ||||||||
syslog_goodpri |
ユーザが認証に成功した場合に使われる syslog の priority。
デフォルトは notice。 | ||||||||
syslog_badpri |
ユーザが認証に失敗した場合に使われる syslog の priority。
デフォルトは alert。 | ||||||||
editor | visudo で使用可能なエディタのリスト。 リストはコロン (:) で区切る。 visudo はユーザーの USER 環境変数が設定されている場合には、 それにマッチするエディタを選択する。 設定されていない場合は、リストの最初に書かれている エディタが存在して実行可能であれば、それを選択する。 デフォルトはシステム上の vi のパス。 | ||||||||
真偽値としても使用される文字列: | |||||||||
logfile | (syslog ログファイルではなく) sudo ログファイルへのパス。 パスを設定すると、そのファイルへログが記録される。 設定しなければ、記録されない。 | ||||||||
syslog |
ログの記録に syslog が使われている場合の syslog の facility
(syslog によるログの記録をしない場合は、設定しないこと)。
デフォルトは local2。 | ||||||||
mailerpath | 警告メールを送るのに使われるメールプログラムのパス。 デフォルトは、設定時に見つかった sendmail のパス。 | ||||||||
mailerflags | メーラーを起動するときに使われるフラグ。 デフォルトは -t。 | ||||||||
mailto |
警告メールとエラーメールを送るアドレス。
アドレスは、sudo が @記号を解釈しないように、 ダブルクォート ( ") で括らなければならない。 デフォルトは root。 | ||||||||
exempt_group | このグループに属するユーザは、パスワードと PATH が必要ない。 デフォルトでは設定されていない。 | ||||||||
verifypw |
このオプションは、ユーザが sudo を -v オプションで実行したときに、
いつパスワードが必要とされるかを制御する。
このオプションには以下の値のいずれかを設定できる。
デフォルトの値は all である。 | ||||||||
listpw |
このオプションは、ユーザが sudo を -l オプションで実行したときに、
いつパスワードが必要とされるかを制御する。
このオプションには以下の値のいずれかを設定できる。
デフォルトの値は any である。 | ||||||||
env_check |
変数の値に %文字または /文字を 含んでいる場合に、ユーザーの環境から削除される環境変数。 これは良く考えずに書かれたプログラムにおける printf 形式の脆弱性を防ぐためにある。 引き数はダブルクォーテーションで囲んだスペース区切りのリスト、 またはクォートしない 1 個の値である。 リストの置換・追加・削除・無効化は、それぞれ =, +=, -=, !オペレータで出来る。 チェックされる環境変数のデフォルトのリストは、 sudo に -V をつけて実行すると表示される。 |
env_delete |
ユーザーの環境から削除される環境変数。
引き数はダブルクォーテーションで囲んだスペース区切りのリスト、
またはクォートしない 1 個の値である。
リストの置換・追加・削除・無効化は、それぞれ
=, +=, -=, !オペレータで出来る。 チェックされる環境変数のデフォルトのリストは、 sudo に -V をつけて実行すると表示される。 |
env_keep |
env_reset オプションが実行されるときに、
ユーザーの環境で保存される環境変数。
これにより sudo が起動したプロセスが受け取る環境を細かく制御できる。
引き数はダブルクォーテーションで囲んだスペース区切りのリスト、
またはクォートしない 1 個の値である。
リストの置換・追加・削除・無効化は、それぞれ
=, +=, -=, !オペレータで出来る。 このリストはデフォルトでは何も含まない。 |
ユーザ設定
User_Spec ::= User_list Host_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 として 実行することが許可される。
\s-1NOPASSWD\s0 と \s-1PASSWD\s0
デフォルトでは、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 で評価される任意の文字 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 built in 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の CD-ROM にある計算機 (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 ネットワークグループのリスト
関連項目
rsh(1), sudo(8), visudo(8), su(1), fnmatch(3).