私は、AWS SES アカウントに SMTP 用に接続するヌル クライアントとして msmtp を持っており、cron、monit、そして近いうちに Fail2Ban などのアラートを自分の電子メール アドレスに配信します。しかし、Fail2Ban はうまく機能していません。もっと正確に言うと、selinux が物事を阻止しています。
action_mwl は Permissive モードでは問題なく動作します。禁止メールが届きます。Enforcing モードでは、Fail2Ban がエラーを記録し、メールは送信されません。msmtp ログによると、送信が試みられていますが、送信されません。
以下は、Fail2Ban ログ エントリ (の一部) です。
2015-09-29 12:25:12,543 fail2ban.actions [31113]: ERROR Failed to execute ban jail 'wordpress' action 'sendmail-whois-lines' info 'CallingMap({'ipjailmatches': <function <lambda> at 0x2c5ac08>, 'matches': u'
msmtp レポート:
Sep 29 12:25:12 host=email-smtp.eu-west-1.amazonaws.com tls=on auth=on user=12345 [email protected] [email protected] errormsg='cannot connect to email-smtp.eu-west-1.amazonaws.com, port 587: Permission denied' exitcode=EX_TEMPFAIL
これは、msmtp 構成の問題でも、電子メール本文の内容の問題でもありません。コマンド ライン パイプから msmtp に (直接、または sendmail シンボリック リンク経由で) 正確に Fail2Ban メッセージを送信でき、問題なく送信されます。資格情報なども問題ありません。cron 経由でも動作します。つまり、これはファイアウォールの問題でもありません。
$ sudo ls -lZ /usr/bin/msmtp
-rwxr-xr-x. root root system_u:object_r:bin_t:s0 /usr/bin/msmtp
$ sudo ls -lZ /usr/bin/sendmail
lrwxrwxrwx. root root unconfined_u:object_r:bin_t:s0 /usr/bin/sendmail -> /usr/bin/msmtp
jail.conf の場合:
mta = sendmail
sealert は、私が認識したりアクションを実行したりできるヒントを何も提供しません。
fail2ban が root として実行されることを確認しました:
$ ps aux | grep fail2ban
追加のログを追加したところ、/var/log/messagesに次のログが出力されました。
Sep 29 16:11:15 ip-172-31-6-51 setroubleshoot: SELinux is preventing /usr/bin/msmtp from name_connect access on the tcp_socket port 587. For complete SELinux messages. run sealert -l 78f05dbd-a953-4196-9f14-afaabb5a4d88
Sep 29 16:11:15 ip-172-31-6-51 python: SELinux is preventing /usr/bin/msmtp from name_connect access on the tcp_socket port 587.
次にどこを確認すればよいでしょうか? SELinux Fail2Ban が msmtp と適切に連携できることをどのように確認できますか?
答え1
より詳細なログを追加した後、システム (および @Michael Hampton) から、これを理解するのに十分なヒントが得られました。
yum install setroubleshoot setools
これにより、/var/log/messages にさらに多くの情報が生成され、次のようなツールが提供されます。
sealert -a /var/log/audit/audit.log
また:
ausearch -m avc
次のような指示が表示されます:
Sep 29 16:11:15 ip-172-31-6-51 setroubleshoot: SELinux is preventing /usr/bin/msmtp from name_connect access on the tcp_socket port 587. For complete SELinux messages. run sealert -l 78f05dbd-a953-4196-9f14-afaabb5a4d88
提案されたコマンドを実行します:
sealert -l 78f05dbd-a953-4196-9f14-afaabb5a4d88
以下が得られます:
If you believe that msmtp should be allowed name_connect access on the port 587 tcp_socket by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# grep msmtp /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp
そこで私はこうしました:
$ grep msmtp /var/log/audit/audit.log | audit2allow -M fail2ban_msmtp
何が作成されたか見てみました:
$ vim fail2ban_msmtp.te
次に、ポリシーをインストールし、再起動後もポリシーが維持されるようにします。
$ semodule -i fail2ban_msmtp.pp
次に、ランダムな IP を禁止して、電子メールによる禁止をトリガーし、最終的に msmtp 経由で目的の電子メールが送信されることを確認しました。
$ fail2ban-client set sshd banip 162.229.158.134
あっという間に!SELinux はとても簡単になりました。
PS 別の方法は次のとおりです (テストされていません):
$ setsebool -P nis_enabled 1