/etc/sudoers の書き方 2
sudo の設定である /etc/sudoers の書き方を説明します.
かなり難しいです.興味があれば読んでください.コンパイラ,パーサの知識があると読みやすいです.
単に使いたいだけの方は「書き方1」を読んでください.
設定の詳細
あるユーザ(群)の設定は,以下の様に書きます.
User_Spec ::= User_List Host_List '=' Cmnd_Spec_List (':' Host_List '=' Cmnd_Spec_List)*
Cmnd_Spec_List ::= Cmnd_Spec | Cmnd_Spec ',' Cmnd_Spec_List
Cmnd_Spec ::= Runas_Spec? Option_Spec* Tag_Spec* Cmnd
Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')'
Option_Spec ::= (SELinux_Spec | Date_Spec | Timeout_Spec)
SELinux_Spec ::= ('ROLE=role' | 'TYPE=type')
Date_Spec ::= ('NOTBEFORE=timestamp' | 'NOTAFTER=timestamp')
Timeout_Spec ::= 'TIMEOUT=timeout'
Tag_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' |
'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' |
'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | 'PASSWD:' |
'NOPASSWD:' | 'SETENV:' | 'NOSETENV:')
引用元 man page. Cite from man page
設定の1行「ユーザスペック User_Spec」は以下の様になります.
つまり,左から順に
「ユーザリスト」「ホストリスト」「=記号」「コマンドスペックリスト」が来て,そのあとに(「:記号」「ホストリスト」「=記号」「コマンドスペックリスト」)のセットが、0組以上続きます。
「ユーザリスト User_List」は,「,」で区切られた「ユーザ User」の集まりです.
ユーザ名やグループ名を列挙したものを想像してください.
後述します.
「ホストリスト Host_List」は,「,」で区切られた「ホスト Host」の集まりです.
ホスト名やIPアドレスを列挙したものですが,実際は ALL であることが多いです.
後述します.
「コマンドスペックリスト Cmnd_Spec_List」は「,記号」で区切られた「コマンドスペック Cmdn_Spec」の集まりです.
「コマンドスペック Cmnd_Spec」は,左から順に「ランアズスペック(誰のの権限で実行するか) Runas_Spec」が0個 or 1個,「オプションスペック Option_Spec」が0個以上,「タグスペック Tag_Spec」が0個以上,「Cmnd コマンド」となります.
「タグスペック Tag_Spec」は後述します.
「ランアズスペック Runas_Spec」は,左から順に「(記号」、「ランアズリスト Runas_List」が0個 or 1個,(「:記号」「Runas_List」)が0個 or 1個,「)記号」となります.
「ランアズリスト Runas_List」は,上には書いてありませんで、下に書いてあります.
「,記号」で区切られた「ランアズメンバ Runas_Member」の集まりです.
ユーザ名やグループ名を列挙したものを想像してください.
例:
ユーザリスト(User_List) が may
ホストリスト(Host_List) が ALL
コマンドスペックリスト(Cmnd_Spec_List) が ( june )
コマンド が /bin/ls
なら
その他
ユーザリスト User_List
User_List ::= User |
User ',' User_List
User ::= '!'* user name |
'!'* #uid |
'!'* %group |
'!'* %#gid |
'!'* +netgroup |
'!'* %:nonunix_group |
'!'* %:#nonunix_gid |
'!'* User_Alias
「ユーザリスト User_List」は「,記号」で区切られた「ユーザ User」の集まりです.
「ユーザ User」は,
「ユーザ名」
「#記号」「uid」
「%記号」「グループ」
「%記号」「#記号」「gid」
などです.
エイリアスが使えることも分かります.ただし,説明しません.
ホストリスト Host_List
Host_List ::= Host |
Host ',' Host_List
Host ::= '!'* host name |
'!'* ip_addr |
'!'* network(/netmask)? |
'!'* +netgroup |
'!'* Host_Alias
「ホストリスト Host_List」は「,記号」で区切られた「ホスト Host」の集まりです.
「ホスト Host」は,
「ホスト名」
「IPアドレス」
などです.
ランアズリスト Runas_List
Runas_List ::= Runas_Member |
Runas_Member ',' Runas_List
Runas_Member ::= '!'* user name |
'!'* #uid |
'!'* %group |
'!'* %#gid |
'!'* %:nonunix_group |
'!'* %:#nonunix_gid |
'!'* +netgroup |
'!'* Runas_Alias
「ランアズリスト Runas_List」は「,記号」で区切られた「ランアズメンバ Runas_Member」の集まりです.
「ランアズメンバ Runas_Member」は,
「ユーザ名」
「#記号」「uid」
「%記号」「グループ」
「%記号」「#記号」「gid」
などです.
タグスペック Tag_Spec
Tag_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' |
'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' |
'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | 'PASSWD:' |
'NOPASSWD:' | 'SETENV:' | 'NOSETENV:')
Tag_Spec には,NOPASSWD: の他にも複数あるのが分かります.
また,NOPASSWD: というタグであり,末尾の : まで含めてタグです.
複数のタグが : で区切られて列挙されている分けではありません.
書き方が,
となるのがよく分かります.