kazmax - Linux で自宅サーバー

sudoers - ファイルのフォーマットと規約の説明 - Linux コマンド集 一覧表

  1. 名前
  2. 説明
  3. セキュリティ上の注意
  4. 警告
  5. ファイル
  6. 関連項目

名前

sudoers - どのユーザが何を実行できるかのリスト

説明

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

EBNF の簡単なガイド

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
パスワードの入力をなしですませるためには、現在のホストのすべてのユーザの 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) でログを記録している場合、 sudosyslogfacility (syslog パラメータの値) として、 authpriv (OS がサポートしている場合), auth, daemon, user, local0, local1, local2, local3, local4, local5, local6, local7 を受け付ける。 syslogpriority としては、 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/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" で評価される任意の文字 "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 は、(L"biglab(R" がネットグループであることを プレフィックス '+' によって知る。

 +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 から コマンドを (L"差し引く(R" ことは、一般に有効でない。 ユーザは、欲しいコマンドを別な名前でコピーして実行すれば、 これを簡単に回避できてしまう。 例を挙げる。

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).