CGIでのNFSへのパーミッションとSELinuxについて
NFSでつながっている別のマシンのソフトウェアをApacheのCGI経由で動かそうという話。
まず、bashからソフトを動かしてみた。
しかし、パーミッションがなく実行できない。
先輩に聞いてみたところ、グループに登録していなかったかららしい。
$ id
でちゃんとグループに入っていることを確認して動かしてみると、無事に動作した。
が、動かない。
許可がないそうです。
さっきと同じで、ユーザ名やグループ名の問題かなー、と思って/etc/httpd/conf/httpd.confのユーザ名、グループ名を編集。
これで、bashで動かすときと同じ、ユーザ名、グループ名になったはず。
system("id")
を書いて実行時の情報について確認すると正しいユーザ名、グループ名になっていた。
いざ実行してみる。
が、動かない。
もうお手上げだ、と思って適当にググってみると、SELinuxが関わっていることに気づいた。
とりあえず、SELinuxを落として、Webサーバを再起動させて、もう一度実行してみた。
$ getenforce
Enforcing
$ sudo setenforce 0
$ getenforce
Permissive
$ sudo service httpd restart
httpd を停止中: [ OK ]
httpd を起動中: [ OK ]
無事サーバが再起動したところで、実行。
動いた!!!
やはりSELinuxが原因だったようだ。
ということで、きちんと動くようにSELinuxの設定をいじっていく。
redhatのサポートページによると、
・httpdプロセスは、httpd_tドメインで実行されている。
・httpd_tのような制限されたドメイン内で実行されるプロセスが、他のプロセスやシステムとどのように交信するかはSELinuxで定義する必要がある。
・httpdから、NFSやCIFSファイルシステムへのアクセスを許可するためにはBooleanをonする必要がある。
では、Booleanの設定をしていく。
現在のBooleanの設定は、以下のコマンドで調べることができる。
$ sudo getsebool -a
この中で、httpdからnfsへのアクセスに関連するっぽいものを探すと、こんなのがあった。
httpd_use_nfsでググってみると、redhatのサポートページに以下の記述が。
When enabled, this Boolean allows the httpd daemon to access files stored on NFS volumes.
このBooleanをonにするためには、以下のコマンドを使う。
オプションの"-P"は、再起動後も設定を継続するためのものらしい。
getseboolコマンドで確認すると、ちゃんとonになってた。
設定が終わったところで、CGIを動かしてみるとちゃんと動いた。
めでたし、めでたし。