2010年7月11日日曜日

Apache PHP から sudo する方法

※以下の説明は PHP が Apache ユーザで実行されている場合です。

PHP から shell を実行して sudo したい場合は Apache から sudo が
実行できるように設定しておく必要があります。

sudo の設定は visudo というコマンドで行います。
使用方法としては、 vi と変わりません。


[root]# visudo

# ↓この一行を追加すると、apache から shutdown -h now が実行可能になります
apache localhost=NOPASSWD: /sbin/shutdown -h now


でまぁ、これを PHP から実行してみます。
例えば次のようなコードで


$out = "";
$out = shell_exec("/sbin/shutdown -h now 2>&1");

echo "$out\n";


実行結果

sudo: sorry, you must have a tty to run sudo


なにやらエラーが出ました。
これは、端末がないユーザからの sudo の実行が禁止されているというメッセージです。

なので、visudo で apache ユーザに対して 端末なしでも実行できるように
設定を変更してやります。


# ↓この行でデフォルトオプション指定により、sudu 実行には
# 端末が要求されるようになっています。
Defaults requiretty


でこれをコメントしてやればいいのですが、
(多くのサイトではこれをコメントすればよいとかいてあるが…)
なんかセキュリティが弱くなりそうなので、apache ユーザのみこの
設定を外すことにします。(まぁ sudo の勉強も兼ねて)

次のように設定します。


# ↓ apache を エイリアスとして設定
User_Alias NOTTYUSERS = apache

Defaults requiretty
# ↓ NOTTYUSERS に対し、 requiretty フラグをオフ
Defaults:NOTTYUSERS !requiretty


これで、PHP から sudo が実行できるようになりました。