sudo

sudoers覚え書き

ときどき書くと書式がわからなくなるのと、Manページの学習コストが割と高いので、備忘がてらに書いておく。

大事なことは全てManページに書いてある。

基本構文

sudoers
誰が どのホストで = (誰として) 何を

具体例

sudoers
# 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ユーザとしてコマンドを実行できる。

何を

実行コマンドをカンマ区切りで指定する。

  • フルパスで指定する
  • 引数も指定することができる
  • ディレクトリを指定すると、そのディレクトリ直下の全てのコマンドを実行可能になるが、サブディレクトリは許可されない。
  • パスや引数にワイルドカードなどのシェルglob1を指定することもできる
sudoers
# aliceはbobとして/home/bob/bin/以下のあらゆるコマンドを実行可能
alice ALL=(bob) /home/bob/bin/

その他よく使う構文

#include, #includedir

/etc/sudoers
#includedir /etc/sudoers.d

これはコメントではなく、 /etc/sudoers.d/ 以下のファイルを追加のsudoersファイルとして印クルードするというディレクティブである。

同様に、 #include ディレクティブは別のsudoersファイルを読み込む。

この他に # がコメントとして解釈されないケースは、ユーザを指定するときにuidを指定するケースだけである。

Defaults

sudoersのオプションを指定する。
例:

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 環境変数に設定される値。

ワイルドカードの利用について

sudoersファイルでは、コマンドパスやコマンドライン引数、ホスト名にシェル形式のワイルドカードが使用できる。
特に、 * は0字以上の任意の文字列にマッチする。

コマンドのファイル名として使う

  • * はスラッシュ(/)にはマッチしない。
    • 例) /usr/bin/* ... /usr/bin/who にマッチするが、 /usr/local/bin/java にはマッチしない。

コマンドライン引数として使う

  • * はスラッシュ(/)やホワイトスペース()にマッチする。※要注意
    • 例) /bin/cat /var/log/messages* ... cat /var/log/messages /etc/shadow も実行可能。

sudoedit

sudoeditはsudoの組み込みコマンドで、通常対象ファイルにアクセス権限のないユーザに対して安全にファイルを編集するインタフェースを提供する。

ユーザにsudoeditを許可するには、例えば次のようにsudoersファイルに記述する:

sudoers
# bobは/etc/motdを編集可能
bob ALL = sudoedit /etc/motd
# operatorグループのユーザは、/etc/motdをパスワードなしで編集可能
%operator ALL = NOPASSWD: sudoedit /etc/motd

※ユーザ権限で実行するので、 (誰として) の条件は不要。

参考

脚注