ときどき書くと書式がわからなくなるのと、Manページの学習コストが割と高いので、備忘がてらに書いておく。
大事なことは全てManページに書いてある。
基本構文
誰が どのホストで = (誰として) 何を
具体例
# rootユーザはどこでも、誰としてでも何でもできる
root ALL=(ALL:ALL) ALL
# wheelグループのユーザはどこでも、誰としてでもパスワード無しで何でもできる
%wheel ALL=(ALL:ALL) NOPASSWD: ALL
# bobはaliceとして閲覧コマンドを実行できる
bob ALL=(alice) /bin/ls, /bin/cat
以下、基本構文の簡単な解説。
誰が
上の %wheel
のように %
を付けるとグループ指定。
他にも指定の仕方がいくつかあるが、ほとんどの人は使う機会がないだろうと思う。
どこで
ここはホスト名を入れることができるのだが、基本はローカル上で解釈されるので、 ALL
でも問題ない。
LDAPとか使っていると話は違ってくるが、この記事ではLDAPの話はしない。
(誰として)
例で (ALL:ALL)
と書いたが、左側がユーザ、右側がグループを表す。
ユーザ権限のみで十分の場合、 (app)
のように書く。
この場合、対象者はappユーザとしてコマンドを実行できる。
何を
実行コマンドをカンマ区切りで指定する。
- フルパスで指定する
- 引数も指定することができる
- ディレクトリを指定すると、そのディレクトリ直下の全てのコマンドを実行可能になるが、サブディレクトリは許可されない。
- パスや引数に
*
などの ワイルドカード文字列 を指定することもできる(後述)
# aliceはbobとして/home/bob/bin/以下のあらゆるコマンドを実行可能
alice ALL=(bob) /home/bob/bin/
ワイルドカードで指定
ワイルドカード文字列はシェルglob1によって解釈される。
特に、よく使われる *
は0字以上の任意の文字列にマッチする。
- コマンドのファイル名として使う場合
-
*
はスラッシュ(/
)にはマッチしない。
-
- コマンドライン引数として使う場合
-
*
はスラッシュ(/
)やホワイトスペース(
-
例:
# /opt/bin/fooは実行できるが、/opt/bin/foo/barは実行できない
someone ALL=(ALL) /opt/bin/f*
# "cat /var/log/messages /etc/shadow" も可能になってしまうので、まずい
someone ALL=(ALL) /bin/cat /var/log/messages*
補遺:
- ワイルドカードはホスト名にも使える。
その他よく使う構文
#include, #includedir
#includedir /etc/sudoers.d
これはコメントではなく、 /etc/sudoers.d/
以下のファイルを追加のsudoersファイルとしてインクルードするというディレクティブである。
同様に、 #include
ディレクティブは別のsudoersファイルを読み込む。
この他に #
がコメントとして解釈されないケースは、ユーザを指定するときにuidを指定するケースだけである。
Defaults
sudoersのオプションを指定する。
例:
Defaults !requiretty
Defaults env_reset
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC LS_COLORS"
Defaults env_keep += "MAIL PS1 PS2 LANG"
よく使うオプション
上記 Defaults
構文でよく見るもの。
env_reset (真偽値)
sudo
実行時に環境変数をリセットする。
セキュリティ上、重要。
後述のsecure_pathオプションを指定した場合、PATHの値はsecure_pathで指定した値になる。
requiretty (真偽値)
これがセットされたとき、ttyがないときにsudoが実行できない。
cronなどではsudoが実行できなくなる。
env_keep (リスト)
上のenv_resetを有効にしているときに、ユーザ側から引き継げる環境変数をホワイトリスト的に指定する。
secure_path (文字列)
sudo経由のコマンドの PATH
環境変数に設定される値。
例:
Defaults env_reset
Defaults secure_path="/sbin:/bin:/usr/sbin:/usr/bin"
sudoedit
sudoeditはsudoの組み込みコマンドで、通常対象ファイルにアクセス権限のないユーザに対して安全にファイルを編集するインタフェースを提供する。
ユーザにsudoeditを許可するには、例えば次のようにsudoersファイルに記述する:
# bobは/etc/motdを編集可能
bob ALL = sudoedit /etc/motd
# operatorグループのユーザは、/etc/motdをパスワードなしで編集可能
%operator ALL = NOPASSWD: sudoedit /etc/motd
※ユーザ権限で実行するので、 (誰として)
の条件は不要。