|
HOME > Linux Tips ( 目次 ) > Linux コマンド 一覧表 > s > sudoers - ファイルのフォーマットと規約の説明 sudoers - ファイルのフォーマットと規約の説明 - Linux コマンド集 一覧表名前sudoers - どのユーザが何を実行できるかのリスト 説明sudoers ファイルは、2 つのタイプのエントリから構成される。 (基本的には変数である) エイリアスと (誰が何を実行できるかを指定する) ユーザ 指定である。 sudoers の文法は、 Extended Backus-Naur Form (EBNF) (拡張バッカス・ナウア記法) を用いたかたちで以下に記述する。 EBNF を知 らなくても諦めないでほしい。 EBNF は割に簡単だし、以下の定義には注釈をつけてある。 EBNF の簡単なガイドEBNF は言語の文法を記述する簡単で厳密な方法である。 EBNF の各定義は、生成規則からなっている。
シンボル ::= 定義 │ 別の定義 1 │ 別の定義 2 ...
各生成規則は他の生成規則を参照する。このようにして言語の文法ができあがる。 EBNF は以下のようなオペレータを含む。これは多くの人が正規表 現でお馴染みだろう。しかし、これとは異なる意味を持った、 "ワイルドカード" 文字と混同してはならない (訳注: 後者はシェルのワイルドカード パターンのことだろう。 regex(7) と glob(7) を参照のこと)。
括弧を使うとシンボルをグループにまとめることができる。以降の例では、(シンボル名ではない) 文字通りの文字列はシングルクオート (’’) を使用して明示する。 エイリアス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 エイリアスより前でユーザ指定より後にする点に注意す ること。 フラグ:
整数:
真偽値としても使用される整数:
文字列:
真偽値としても使用される文字列:
真偽値としても使用されるリスト:
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_SpecRunas_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) ルーチンを使って行われる。正規表現ではない点に注意すること。
フォワードスラッシュ (’/’) は、パス名で使われるワイルドカードに対してはマッチしない点に注意すること。コマンドライン引き数に対してマッ チングをする場合、スラッシュはワイルドカードにマッチする。これは /usr/bin/* のようなパスを、 /usr/bin/who にはマッチさせ、 /usr/bin/X11/xterm にはマッチさせないようにするためである。 ワイルドカードの規則における例外:上の規則に対して、次の例外が適用される。
その他の特殊文字と予約語:シャープ記号 (’#’) はコメントを表すために使われる。 (ユーザ名で使われている場合は除く。また、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 は、(L"biglab(R" がネットグループであることを プレフィックス '+' によって知る。 +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 セキュリティ上の注意'!' オペレータを使って ALL から コマンドを (L"差し引く(R" ことは、一般に有効でない。 ユーザは、欲しいコマンドを別な名前でコピーして実行すれば、 これを簡単に回避できてしまう。 例を挙げる。 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).
|
|