2015年4月16日木曜日

sudoまとめ

rootにsuしなくても特権コマンドを実行できるようにするsudoの設定方法や小ネタまとめ。

設定方法

例えば、sudogroupというグループを作って、以下の様な条件で設定を行うことにする。
  • sudogroupグループに属するグループのみsudo許可
  • su以外の全てのコマンドをsudo可能にする。suを除外する理由は、suで別ユーザーにスイッチできてしまうことを防ぐため
それでは、以下で設定を実施していく。

①まずはsudoできるグループとして適当にsudogroupという名前でグループを作成する。普通のコマンドで作成すれば良い。

 groupadd sudogroup

②適当にユーザーも作っておく。

 useradd -g sudogroup testuser

③visudoにて以下の2行を最後に追加。なお、sudoの設定ファイルは/etc/sudoersとなるが、visudoコマンドで編集することが推奨される(sudoersファイルのパーミッション変更や保存時の構文チェック機能がある)。

 Cmnd_Alias SU = /bin/su
 %sudogroup ALL = (ALL) ALL, !SU

※ちなみに構文にエラーがあると、:wqでvisudoを閉じた後にエラーが表示される。以下はCmnd Aliasで指定されていないエイリアス名"SU"を指定した際のエラー例
 visudo: Warning: Host_Alias `SU' referenced but not defined
 visudo: Warning: Cmnd_Alias `SU' referenced but not defined

④visudoの変更を保存して閉じた時点で設定が反映されるので、試しにsudo使って/root配下にlsできることを確認してみる。

 $ ls /root/
 ls: cannot open directory /root/: 許可がありません

 $ sudo ls /root/
 [sudo] password for testuser:   ←★自身のパスワードを入力
 httpd-2.2.15-9.el6.x86_64.rpm
 httpd-tools-2.2.15-9.el6.x86_64.rpm
 install.log
 install.log.syslog

またsudo suも実行できない。

 $ sudo su
 [sudo] password for testuser:   ←★自身のパスワードを入力
 Sorry, user testuser is not allowed to execute '/bin/su' as root on RHEL6_HOST.

ちなみに、このままだと普通にsu("sudo su"ではなく"su"単体での利用)は使えるので、/etc/pam.d/suで一般ユーザーがsuできないよう設定しておくと良い。

 # vi /etc/pam.d/su
 auth            required        pam_wheel.so group=wheel


初回sudo時に表示されるエラーについて

初回sudoを実行すると、以下メッセージが表示される。
<原文>
We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

<適当な日本語訳>
あなたがシステム管理者から通常のレクチャーを受けていると信じている。要約すると次の3点になる。

#1 他人のプライバシーを尊重せよ
#2 コマンドを打つ前に考えよ
#3 大きな力を持つことは大きな責任を持つということ
これは別に設定をミスっているというものでは無く、sudoデフォルトの注意事項のようで、sudoやるときは特権コマンドを実行できるから、責任の重さを噛み締めよ、ということらしい。

sudoしたコマンドの結果をリダイレクトしても書き込めない問題

sudoしてもリダイレクト処理はrootではなくもとのユーザーの権限になってしまうので、リダイレクト先のディレクトリに書き込み権限が無いとエラーになる。例えば、以下の様なコマンドは書き込みに失敗する。

 $ sudo ls /root > /root/ls_root.txt

回避するには以下のようにすれば良い。

 bash -c "<実行コマンド文字列>"
  例:sudo bash -c "ls /root > /root/ls_root.txt"

bashの-cオプションは、実行するコマンドをその後の文字列から読み込むという処理を表す。