2013年1月13日日曜日

Postfix + SELinux 環境でroot宛メールを何とかする #SELinux


最近、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」に送って、メール飛ばさないようにしてる・・・(-_-|||)ガックリ


個人で運用程度なら、もちろんこれでもいいんでしょうけど。

一応原因を追って、解決法を見出したいので、上記処置を取りました。

まとめ


  • Postfixlocalプロセスが、/rootに書き込み拒否をSELinuxに受けていた
  • Maildirを作成
  • SELinuxに許可ポリシーを適用


こんな感じです。

お役に立てば〜

Zenback