名前


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_Alias
es ではなく、
Runas_Alias
es を含めることができる。


 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/KeyOPIE などの) ワンタイムパスワードを使用している場合にこのオプションが有効になっていると、 ローカルなウインドウに入力したパスワードを 簡単にカット&ペーストできるように、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 にすると、sudoDNS のルックアップが必要になることに注意すること。 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 は デフォルトのエディタリストを使う前に、 環境変数 EDITORVISUAL の値を使う。 ユーザはログに記録されることなく 任意のコマンドを 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 パスワードの入力をなしですませるためには、 現在のホストのすべてのユーザの sudoers エントリに
NOPASSWD
フラグが設定されていなければならない。
any パスワードの入力をなしですませるためには、 現在のホストの少なくとも一人のユーザの sudoers エントリに
NOPASSWD
フラグが 設定されていなければならない。
never ユーザは、-v フラグを使う際にパスワードを必要としない。
always ユーザは、-v フラグを使う際に常にパスワードを入力しなければならない。

デフォルトの値は ‘all’ である。

listpw このオプションは、ユーザが sudo-l オプションで実行したときに、 いつパスワードが必要とされるかを制御する。 このオプションには以下の値のいずれかを設定できる。
all パスワードの入力をなしですませるためには、 現在のホストのすべてのユーザの sudoers エントリに
NOPASSWD
フラグが設定されていなければならない。
any パスワードの入力をなしですませるためには、 現在のホストの少なくとも一人のユーザの sudoers エントリに
NOPASSWD
フラグが設定されていなければならない。
never ユーザは、-l フラグを使う際にパスワードを必要としない。
always ユーザは、-l フラグを使う際に常にパスワードを入力しなければならない。

デフォルトの値は ‘any’ である。

真偽値としても使用されるリスト:
env_check 変数の値に
%
文字または
/
文字を 含んでいる場合に、ユーザーの環境から削除される環境変数。 これは良く考えずに書かれたプログラムにおける printf 形式の脆弱性を防ぐためにある。 引き数はダブルクォーテーションで囲んだスペース区切りのリスト、 またはクォートしない 1 個の値である。 リストの置換・追加・削除・無効化は、それぞれ
=
,
+=
,
-=
,
!
オペレータで出来る。 チェックされる環境変数のデフォルトのリストは、 sudo-V をつけて実行すると表示される。
env_delete ユーザーの環境から削除される環境変数。 引き数はダブルクォーテーションで囲んだスペース区切りのリスト、 またはクォートしない 1 個の値である。 リストの置換・追加・削除・無効化は、それぞれ
=
,
+=
,
-=
,
!
オペレータで出来る。 チェックされる環境変数のデフォルトのリストは、 sudo-V をつけて実行すると表示される。
env_keep env_reset オプションが実行されるときに、 ユーザーの環境で保存される環境変数。 これにより sudo が起動したプロセスが受け取る環境を細かく制御できる。 引き数はダブルクォーテーションで囲んだスペース区切りのリスト、 またはクォートしない 1 個の値である。 リストの置換・追加・削除・無効化は、それぞれ
=
,
+=
,
-=
,
!
オペレータで出来る。 このリストはデフォルトでは何も含まない。
syslog(3) でログを記録している場合、 sudo は syslog の facility (syslog パラメータの値) として、 authpriv (OS がサポートしている場合), auth, daemon, user, local0, local1, local2, local3, local4, local5, local6, local7 を受け付ける。 syslog の priority としては、 alert, crit, debug, emerg, err, info, notice, warning がサポートされている。

ユーザ設定



 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/lsoperator として、 また /bin/kill/usr/bin/lprmroot として 実行することが許可される。

\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 オプションを使って変更できる。

ワイルドカード (別名、メタキャラクタ):


sudosudoers ファイルにおいて、 コマンドライン引き数やパス名に対して シェル形式のワイルドカードを使うことができる。 ワイルドカードのマッチングは、 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

以下の設定では、コンパイル時のデフォルト値のいくつかを上書きする。 sudosyslog(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

rootwheel グループのユーザに、 全てのユーザとして、全てのホスト上のコマンドを実行できるようにしている。


 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 は、SPARCSGI 計算機上で、

Runas_Alias
OP にリストされたユーザ (rootoperator) として、全てのコマンドを実行できる。


 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 にあるユーザ (oraclesybase) として、パスワードなしでコマンドを実行できる。


 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
SUSHELLS に属しているコマンドは除く。


 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

上の例では、実際には SUSHELLS にリストされているコマンドを bill に実行させないようにすることができない。 なぜなら、bill は、これらのコマンドを別な名前にコピーしたり、 エディタや他のコマンドのシェルエスケープから使えるからである。 よって、このような制限は、せいぜい補助的なものと考えるべきである (さらにポリシーで強化すべきである)。

警告


sudoers ファイルは、常に visudo コマンドで編集すべきである。 このコマンドは、ファイルをロックし、文法チェックをする。 sudosudoers ファイルが文法的に間違っていると実行できないので、 sudoers にはエラーがひとつも無いようにしなければならない。

(ユーザのではなく) 計算機のネットグループを使う場合、 (よくあるように) ネットグループに 完全なドメイン名付きのホスト名を入れる場合、 ホスト名は

hostname
コマンドで返される 完全なドメイン名付きのものである必要がある。 また sudoersfqdn オプションを指定する必要がある。

ファイル



 /etc/sudoers           誰が何を実行できるかのリスト
 /etc/group             ローカルのグループファイル
 /etc/netgroup          ネットワークグループのリスト

関連項目


rsh(1), sudo(8), visudo(8), su(1), fnmatch(3).

openSUSE Logo

コンテンツ