httpd_sys_content_t だったのに、restorecon -vv -RF /home/xxx を何回かやっていたら、
いつの間にか、変わっていた。
いつのまにか、
/home/user-id/www/ 以下は、 httpd_user_content_t
/home/user-id/www/cgi-bin/ 以下は、 httpd_user_script_exec_t になっていました。
なぜこうなるのか、どのタイミングでなるのか、これへの対策は、どうすれば元に戻せるのか、Googleで検索してみましたが、わかりません。
もちろん、/etc/selinux/targeted/contents/files/file_contexts.homedirs には、その様になるように記述されていますが、これは、インストール直後から同じなので、これが不思議です。
/etc/selinux/targeted/contents/files/file_contexts.homedirs には、最初からその記述があるようだ。
一番不思議なのは、#semanage fcontext -l で、file_contexts.homedirs の記述が見えない事です。見えないが、此の定義で、ラベリングされる様です。
CentOS5.x は、Selinux が Targeted の場合では、/home/user-id/www/ は、httpd_sys_content_t になるよと、誰かが書き込んでいたのを見ましたが。
CentOS5.x も /etc/selinux/targeted/contents/files/file_contexts.homedirs には同じ記述があったが、ここの定義通りにはラベリングされなかったと思う。
こうなると、cgi-bin/ 以下で、cgiから書き込みをするディレクトリーは、アクセスできなくなります。
これへの対策は、
1) /home/user-id/www/cgi-bin/ 下のデータ用ディレクトリーだけを、個別に、httpd_user_content_t にリラベルするか、
2) /home/user-id/www/cgi-bin/ 以下を、全て、 httpd_user_content_t にリラベルするか、
3) /home/user-id/www/ 以下を、 httpd_sys_content_t にリラベルするか のどれかです。
結局のところ、/home/user-id/www/ 以下を全て、 httpd_sys_content_t か、httpd_uesr_content_t にするかの違いですが、どちらも、 apache は、httpd_sys_script_t のドメインで実行されるのみたいなので、おんちゃんは、どちらでも良いような気がしますが?
一番の問題は、データ用として使いたいディレクトリーが、httpd_user_script_exec_t か、httpd_sys_script_exec_t のラベルになると、そのディレクトリーへは、通常 cgiから書き込みが禁止されてしまうと言う点です。これは、これで正しいのだが。
cgi-bin/ 以下が全て httpd_xxx_script_exec_t 一辺倒になる記述は、余りに戴けない。 せめて、パーミッションが 777 or 707 だったら、httpd_xxx_cnontent_t にする、方法は無いものか?
1) /home/user-id/www/cgi-bin/ 下のデータ用ディレクトリーだけを、個別に、httpd_user_content_t にリラベルするのが、本来の対応でしょうが、
レンタルサーバーなどでは、個々のユザーが、直接 ファイルタイプを変更出来ないといけないので、これは現実的では無いでしょう。
または、ディレクトリーの命名ルールを決めて、データ用フォルダーは、かならず dxxxx 等にして、正規表現でhttpd_user_content_t で、自動でラベリングするのは、できそうです。
そう言う意味では、 *.cgi のファイルなら、httpd_xxx_script_exec_t にする正規表現が近道かも。
と言うことで、*.cgi のみ httpd_user_script_exec_t にする方法は、 こちらの設定が安心できそうです。
もちろん、オリジナルのポリーシーモジュールを追加して、httpd_sys_script_t が、
httpd_sys_script_exec_t へ書き込むようにするのは、できますが?それは、止めた方がよいと思います。コッホ!!
apache から書き込みをされたくないファイル、ディレクトリーは、 httpd_sys_script_exec_t httpd_user_script_exec_t で守るのが目的だ...。