himetani's blog

備忘録など。

CGIでのNFSへのパーミッションとSELinuxについて

NFSでつながっている別のマシンのソフトウェアをApacheCGI経由で動かそうという話。

まず、bashからソフトを動かしてみた。

しかし、パーミッションがなく実行できない。

先輩に聞いてみたところ、グループに登録していなかったかららしい。

$ id

でちゃんとグループに入っていることを確認して動かしてみると、無事に動作した。

続いて、ApacheからCGI経由で動かす。

が、動かない。

許可がないそうです。

さっきと同じで、ユーザ名やグループ名の問題かなー、と思って/etc/httpd/conf/httpd.confのユーザ名、グループ名を編集。

これで、bashで動かすときと同じ、ユーザ名、グループ名になったはず。

Rubyスクリプト内で、

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 --> off

httpd_use_nfsでググってみると、redhatのサポートページに以下の記述が。

When enabled, this Boolean allows the httpd daemon to access files stored on NFS volumes.

このBooleanをonにするためには、以下のコマンドを使う。

$ sudo setsebool -P httpd_use_nfs on

オプションの"-P"は、再起動後も設定を継続するためのものらしい。

getseboolコマンドで確認すると、ちゃんとonになってた。

設定が終わったところで、CGIを動かしてみるとちゃんと動いた。

めでたし、めでたし。