Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
80
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

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

何を

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

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

ワイルドカードで指定

ワイルドカード文字列はシェルglob1によって解釈される。
特に、よく使われる * は0字以上の任意の文字列にマッチする。

  • コマンドのファイル名として使う場合
    • * はスラッシュ(/)にはマッチしない。
  • コマンドライン引数として使う場合
    • * はスラッシュ(/)やホワイトスペース()にマッチする。※要注意

例:

sudoers
# /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

/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
Defaults    env_reset
Defaults    secure_path="/sbin:/bin:/usr/sbin:/usr/bin"

sudoedit

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

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

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

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

参考

脚注

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
80
Help us understand the problem. What are the problem?