So-net無料ブログ作成
検索選択

特定のユーザー(アカウント)に「パスワード無し」でsudoコマンド操作を許したい [小技(Linux)]

 sudoついでに。

 たとえば、サーバのシャットダウンやリブートを、他のユーザーにも実行できる(依頼できる)ようにしたいが、rootのパスワードは渡したくない。というケースを想像してほしい。そのユーザーは十分信頼に値するが、たとえばルール(規約)上rootのパスワードは渡せないケースとかそんな感じだろうか。

 そんな場合にもsudoコマンドを用いれば問題が解決できる。
 実は、/etc/sudoersファイルの中を見てみると、なんとなくソレっぽい記述が有ることに気が付くと思う。
## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now

 「usersグループのメンバーがこのシステムをシャットダウンすることを認める」というようなコメントが記述されているので、コレをアレンジすればいいんじゃないか!?   …みたいな幻想を抱いてしまいがちだ。(笑)現実はそんなに甘くないのだが。(笑)

 「piro791」さんに、sudoコマンドでサーバをシャットダウンする権限を与えてみよう。上記のコメントから推測してアレンジしてみると、こんな風に書いてしまうことだろう。

piro791 localhost=/sbin/shutdown -h now

 これでOK!と思って実際に試してみるとうまくいかないんだコレが。(笑)
[piro791@Welsper ~]$ sudo /sbin/shutdown -h now
パスワード:

 パスワード?
 知らねーYO!

 実際にはrootのパスワードを聞かれている。
 実は、manコマンドで/etc/sudoersの記述方法について読めばちゃんと書いてあるのだが、長い上に判りづらいので、読み飛ばしてしまう人が多数という状態らしいね。(笑)

 パスワードを無しにコマンドを実行させたい場合は、「NOPASSWD:」というキーワードが必要だったりするんだな。つまり、

piro791 localhost=NOPASSWD: /sbin/shutdown -h now

 このように記述する必要があったと。
 で、visudoコマンドでこのように記述して試してみる。
[piro791@Welsper ~]$ sudo /sbin/shutdown -h now
パスワード:

 …。
 嘘つきー!!

 とか怒らないように。(笑)
 実は、manコマンドの記述では特に書いてないのだが、今度は「localhost」と記述した部分がいけないのであった。(笑)実はここ、「uname -n」して表示される名前を書き込む必要があった。(だから、もともとlocalhostと名前が設定されている場合は、上記のままの設定でうまくいってしまう)
 例示しているサーバの名前は「Welsper」なので、つまり…

piro791 Welsper=NOPASSWD: /sbin/shutdown -h now

 と、しなければならないのであった。
 再度試してみよう。
[piro791@Welsper ~]$ sudo /sbin/shutdown -h now

Broadcast message from root (pts/0) (Thu Feb 25 11:09:43 2010):

The system is going down for system halt NOW!
[piro791@Welsper ~]$

 やっとうまくいった。(笑)

 なお、shutdownでなく、「poweroff」とか「reboot」とかを使う人もいると思うが、そちらも許可したいという場合は、

piro791 Welsper=NOPASSWD: /sbin/shutdown, /sbin/poweroff, /sbin/reboot

 という具合に、カンマで区切って列挙すればよい。
 また、バラバラに記述しても構わない。(その場合はそれぞれに「NOPASSWD:」の記述を忘れないように。)

piro791 Welsper=NOPASSWD: /sbin/shutdown
piro791 Welsper=NOPASSWD: /sbin/reboot
piro791 Welsper=NOPASSWD: /sbin/poweroff

 こんな具合。


 さらについでなんで書いておこうかな。

 「rootとして実行したい」のではなく、他のユーザー(アカウント)の権限として実行したい!というケースもあるかもしれない。たとえば、apacheユーザーとして動作しているhttpdから起動されるCGIを、「piro791」権限でパスワード無しで実行したいというケース。

 そんな場合は、「誰の権限が欲しいか」という指定を追加する。(これが無い場合はroot)
 apacheユーザーで実行されるCGIが、Welsperサーバ上の「piro791」ユーザーの権限で、パスワード無し/home/piro791/bin/hogehogeというコマンドを実行したい場合はこんな感じ。

apache Welsper=(piro791) NOPASSWD: /home/piro791/bin/hogehoge

 「(piro791)」という記述が追加されている。これによって、「piro791」アカウントでの実行が許可される。

 sudoコマンドを実行する場合は、「-u piro791」をつけて実行する。

sudo -u piro791 /home/piro791/bin/hogehoge

 ということ。


 さらについでに書いておこう。

 特定のコマンドについていちいち許可を出すのではなく、特定のディレクトリにあるコマンドは全部許可したい場合。たとえば、apacheから呼び出されるCGIは、/home/piro791/binディレクトリの中にあるコマンドはどれでもpiro791権限で実行してもよろしいという場合。
 自宅サーバとか社内のサーバとかで、CGIが次々と追加されていく状況下で、いちいちコマンドを列挙するのが面倒だという向きに向いているとおもう。そのような場合は、コマンド名の替わりにコマンドが置いて有るディレクトリを記述すればよい。

apache Welsper=(piro791) NOPASSWD: /home/piro791/bin/

 このようにすれば、/home/piro791/binディレクトリにある全てのコマンド(や各種スクリプト)についてはapache権限のCGIなどからpiro791権限でパスワードの入力なしで実行することが許される。

nice!(0)  コメント(0)  トラックバック(1) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 1

メッセージを送る