前々から気づいていたのだが、誰かがブログにコメントした場合、コメントがあった旨のお知らせメールが送信されないでいた。理由は単純で、SELinuxのセキュリティポリシーのせいだ。httpd(Apache)からmail(sendmail)を起動した場合、ドメイン遷移が行われないようになっているため、httpdがsendmailのリソースにアクセスできないようになっている。
ブログにコメントする人もいないし、コメント自体は問題なく登録できているのでほったらかしにしていた。ところが、昨日、システムのログをチェックしていたところ、だれかコメントをしようとした形跡があった。ブログへのユーザ登録までは終わっていたようだ。登録されたユーザは「保留」になっていた。これは、「登録確認用のメール」が送信されなかったため、登録者は「保留」から「有効」に変更できなかったからだ。これじゃ、コメントのしようもなかったのだろう。申し訳ない。
そこで、SELinuxのセキュリティポリシーを変更し、ブログからメールが送られるようにした。最初は、たいしたことはないと思っていたのだが、ちょっと手間取ってしまった。
httpd(実際は、httpd_sys_script_t)から sendmail のプログラム(sendmail_exec_t)が起動されたとき、ドメインを sendmail_t または system_mail_t に遷移させれば問題ないはずだと思い、以下のようなポリシーを追加した。
domain_auto_trans(httpd_sys_script_t, sendmail_exec_t, sendmail_t)
または
domain_auto_trans(httpd_sys_script_t, sendmail_exec_t, system_mail_t)
ところが、ポリシーのコンパイルでエラーになる。上記以外にも色々試してもだめだった。しかたないので、httpd_sys_script_t に sendmail が使用するリソースへのアクセス許可を追加しようとしたが、これはあまりにも危険すぎると思いあきらめた。
「まぁ、コメントする人も少ないだろうから、やっぱ対策はやめようかな」とあきらめかけていたとき、何気に Apache のポリシー(apache.te)を眺めていたところ、以下のような記述を発見した。
## Allow http daemon to send mail
gen_tunable(httpd_can_sendmail, false)
なんてことだ、メール送信許可用のフラグが用意されているではないか。デフォルト値は“false”なので httpd からメールは送信禁止になっている。
早速、上記コマンド(-Pオプションは、設定内容をファイルに保存)を実行し、httpd にメール送信の許可を与えると、無事コメント時のメールが送られてきた。……めでたし、めでたし。