特定のコマンドをパスワードなしでsudo する設定

ちょい分かりにくかったので、設定メモです。やりたいことは、sudo で実行する際に、find コマンド等、よく使う、かつ、実行してもあまり被害がないコマンドに関しては、パスワード入力なしで実行できるようにしたいということです。
sudo コマンドに関する設定は、「/etc/sudoers」にかかれています。
設定を変更するのは、これを直接編集するのではなく、「visudo」コマンドを実行します。このコマンドで設定を行うと、終了時にSyntax のチェックなどを行ってくれます。

$sudo visudo


ユーザー「lukesiliva」は、「find」コマンドだけについては、sudo で実行する際にパスワードを聞かれないようにしたいという設定は以下のようになります。
こで、find コマンドのみパスワード入力を求められず、他のコマンドをsudo で実行する際には、今まで通りパスワードを求められるようになります。

  • 「lukesilvia ALL=(ALL) NOPASSWD: /usr/bin/find」を追加する
# User privilege specification
root	ALL=(ALL) ALL
%admin	ALL=(ALL) ALL
+ lukesilvia ALL=(ALL) ALL
+ lukesilvia ALL=(ALL) NOPASSWD: /usr/bin/find


記述方法は、以下の通りです。

この権限の記述ルールは単純。

ユーザ ホスト = (権限) コマンド

ALLとすれば、全てのホスト・コマンド。/sbin/ とすれば /sbin/以下のコマンド。/sbin/shutdown とすれば shutdown コマンドを指定することができる。


これに従えば、「lukesilvia ALL=(ALL) NOPASSWD: /usr/bin/find」は、ユーザー「lukesilvia」は、全ての接続元から、全てのユーザー権限で、「/usr/bin/find」をパスワード入力なしで実行できる。ということになります。
全てのホストというのは、ssh などで別ホストからアクセスすることがあるからです。全てのユーザーというのは、「sudo -u hoge」のように、sudo はどのユーザー権限で実行するかを選択するオプションがあるためです。
「lukesilvia ALL=(ALL) ALL」を書いているのは、「/usr/bin/find」以外はパスワードありで実行できるようにするためです。これを書いておかないと、lukesilvia のユーザーは、admin グループに属していない限り、「/usr/bin/find」以外のコマンドはsudo できなくなります。(*1)


なお、ユーザー「lukesilvia」がadmin グループに属しているなら、以下のような設定でも同様の効果がえられます。

# User privilege specification
root	ALL=(ALL) ALL
%admin	ALL=(ALL) ALL
+ %admin  ALL=(ALL) NOPASSWD: /usr/bin/find

誤って設定してしまった場合

以前、以下のように間違えて設定してしまったことがありました。

# User privilege specification
root	ALL=(ALL) ALL
- %admin	ALL=(ALL) ALL
+ %admin  ALL=(ALL) NOPASSWD: /usr/bin/find

これを行うと、admin グループのユーザーは、「/usr/bin/find」以外のコマンドがsudo できなくなります。実際にやってしまって焦りました。何せ、sudo の設定をかえようにも、「sudo sudores」実行すると、許可がないって言われて実行できないので。

対処法と、正しい設定

上記のように誤って設定してしまった場合は、root ユーザーになってvisudo をして設定をしなおします。
mac の場合はデフォルトではsu が使えないので、以下にそってsu コマンドを使えるようにすればおk。設定が終わったら、再びsu を無効にした方がいいと思います。