/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」は以下の様になります.

User_Spec ::= User_List Host_List '=' Cmnd_Spec_List (':' Host_List '=' Cmnd_Spec_List)*

つまり,左から順に
「ユーザリスト」「ホストリスト」「=記号」「コマンドスペックリスト」が来て,そのあとに(「:記号」「ホストリスト」「=記号」「コマンドスペックリスト」)のセットが、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
なら

may ALL=( jun ) /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: というタグであり,末尾の : まで含めてタグです.
複数のタグが : で区切られて列挙されている分けではありません.

書き方が,

(ユーザ名) NOPASSWD: コマンド名

となるのがよく分かります.


この記事が気に入ったらサポートをしてみませんか?