最近、SELinuxと闘い続けている @snicker_jp です。
きっかけ
「そ~いえば、root宛メール来てないね~」で始まった、トラブル調査
maillogを見てみるとJan 10 16:16:01 hogehoge postfix/sendmail[20416]: warning: the Postfix sendmail command has set-uid root file permissions Jan 10 16:16:01 hogehoge postfix/sendmail[20416]: warning: or the command is run from a set-uid root process Jan 10 16:16:01 hogehoge postfix/sendmail[20416]: warning: the Postfix sendmail command must be installed without set-uid root file permissions
てログがちらほら・・・(´・ω・`)
ん?やっぱりトラブルなんじゃない?
ということで、検索してみました。
the command is run from a set-uid root process - Google 検索
それで、以下のフォーラムが引っかかったんですが、
[CentOS] Postfix will not start due to permission errors on CentOS 6.2 x86
http://lists.centos.org/pipermail/centos/2012-May/126073.html
restorecon (or just relabel the whole filesystem). http://wiki.centos.org/HowTos/SELinux
もしかして、どうやらSELinuxが原因じゃないかな説・・・
ということで、上に指示されているサイトに行ってみる!
HowTos/SELinux - CentOS Wiki
http://wiki.centos.org/HowTos/SELinux#head-02c04b0b030dd3c3d58bb7acbbcff033505dd3af
で、ずーっと英語なんですけど・・・
ただ、この「HowTos/SELinux - CentOS Wiki」ものすごいTipsのカタマリでめちゃくちゃ、目からウロコでした。(要、はてブです!)
解決手順
sealert -b Those not running an X server may generate human-readable reports from the command line: sealert -a /var/log/audit/audit.log > /path/to/mylogfile.txt
と記載がありました。
ただ、「sealert 」ってコマンドないし・・・
なので、以下のコマンドでインストール
sudo yum install setroubleshoot
「sealert -b」しようとしてもXwindows入れてないし・・・
sealert -a /var/log/audit/audit.log > test.txt
を実行して、ファイル確認
found 6 alerts in /var/log/audit/audit.log -------------------------------------------------------------------------------- SELinux is preventing /usr/libexec/postfix/local from write access on the ディレクトリ /root. ***** プラグイン catchall (100. confidence) が提案しています *************************** もし、local に、 root directory の write アクセスがデフォルトで許可されるべきです。 そして、これをバグをして報告すべきです。 このアクセスを許可するために、ローカルポリシーモジュールを生成することができます。 行ってください このアクセスを一時的に許可するには、以下を実行してください。: # grep local /var/log/audit/audit.log | audit2allow -M mypol # semodule -i mypol.pp
これを実行しろ。と書いてあるので、いったん実行
Rootで
grep local /var/log/audit/audit.log | audit2allow -M mypol
ファイルが「mypol.pp」、「mypol.te」と出来る
いきなり適用するわけにも行かないので、中を見てみた。
「mypol.pp」
こっちは、バイナリファイルでした。「mypol.te」
module mypol 1.0; require { type admin_home_t; type postfix_local_t; class dir write; } #============= postfix_local_t ============== #!!!! The source type 'postfix_local_t' can write to a 'dir' of the following types: # dovecot_spool_t, user_home_dir_t, mail_spool_t, mailman_data_t, tmp_t, mail_spool_t, postfix_local_tmp_t, user_home_t, var_run_t, mail_home_rw_t, nfs_t, mail_spool_t allow postfix_local_t admin_home_t:dir write;
要はこれをSELinuxで適用する形になっているんでしょうね。
なるほど。
いったん白紙w
ただ、実はさっきの「mypol.pp」これを適用しなかったんです・・・。(/>_<)/# Maildir方式を利用しているので作成 mkdir -p /root/Maildir/{cur,new,tmp} # contextを確認 semanage fcontext -l|grep Maildir /root/Maildir(/.*)? all files system_u:object_r:mail_home_rw_t:s0 # chconする chcon -R -t mail_home_rw_t /root/Maildir
これで、配送ができるようになりました。
きっと、これで大丈夫だと思います。
一応エンジニアとして
あと、検索しているうちにPHPのテクメモ » Blog Archive » crontabの影響でmaillogにエラーここが、検索で最初に日本語が来たので、読んでみたら。
http://php.tekmemo.net/?p=1810
コマンドの最期に「> /dev/null 2>&1」をつけるのを忘れていた。
あ、「/dev/null」に送って、メール飛ばさないようにしてる・・・(-_-|||)ガックリ
個人で運用程度なら、もちろんこれでもいいんでしょうけど。
一応原因を追って、解決法を見出したいので、上記処置を取りました。
まとめ
- Postfixのlocalプロセスが、/rootに書き込み拒否をSELinuxに受けていた
- Maildirを作成
- SELinuxに許可ポリシーを適用
こんな感じです。
お役に立てば〜