ノート
訪問者 2799 最終更新 2013-07-01 (月) 13:09:53
oregano (Fedora 10, SELinux) で、PHPからexecやsystemで別ファイルを実行させると、 実行できないエラー。httpdのエラーログには、permission denied. のメッセージ。
確認のため、もっとも単純なHalloWorldのプログラムをPHPのexecから実行させてみる。 PHPのソースは
<HTML><BODY> <?php $output = exec("/home/yamanouc/src/halloworld"); print("<pre>$output</pre>\n"); ?> </BODY> </HTML>
やはりエラー。
sh: /home/yamanouc/src/halloworld: Permission denied
いろいろチェックしたが、特に他の(SELinuxでない)サーバーでは動くことを確認。 そういえば前にmoodleを導入したときにもsendmailとのリンクでアクセス権限で トラブルを起こした記憶がある。これもその可能性あり。
SELinuxについて少し調べてみる。SELinuxがオンになっているか?
getenforce
でEnforcing と出た。オンになっている。オフにするのも1つの手だが、 せっかくなので何とかセキュリティを保ったまま実行させたい。(この実行自体が かなりセキュリティ的にはヤバイが)。
解決策
参考>>たとえばhttp://www.stackasterisk.jp/tech/systemConstruction/seLinux04_01.jsp(但しFedora5以降で変更があるので注意)
トラブル直後に、
audit2allow -a -l -M myPHPexec
これは、auditdが動いている環境でauditログファイルから(-aオプション) エラーを見つけ、それを修正するためのallowコマンド列を 吐き出すためのコマンドである。
追加すべきコマンド列は
#============= httpd_t ============== allow httpd_t user_home_t:file { read execute execute_no_trans }; allow httpd_t user_tmp_t:file { read execute execute_no_trans };
だったが、それをモジュール(Fedora5以降は、ソースからコンパイルする方式をやめ、 ユーザが追加モジュールとして追加する方法になった)に作る。(-Mオプション)。 作成されたのは、モジュールファイル myPHPexec.pp(=バイナリ)である。
なお、同時にソースファイル(myPHPexec.te)も作成・出力されている。
%less myPHPexec.te module myPHPexec 1.0; require { type user_tmp_t; type httpd_t; type user_home_t; class file { read execute }; } #============= httpd_t ============== allow httpd_t user_home_t:file { read execute execute_no_trans }; allow httpd_t user_tmp_t:file { read execute execute_no_trans };
audit2allowの結果の出力メッセージは
******************** IMPORTANT *********************** To make this policy package active, execute: semodule -i myPHPexec.pp
であったので、このsemodule -i コマンドを実行する。
semodule -i myPHPexec.pp
大分時間がかかったが、完了。
(すべての)モジュールをリストするコマンド
semodule -l
で、インストールされたかどうか確認できる。
後から追加したファイルが、セキュリティのプロパティ(タグ?)が付いていない為に、
SeLinuxにはねられる場合、コマンド restorecon <ファイル名> が効くことがある。
このコマンドは、プロパティをstraightにするらしい。