我將 msmtp 作為空白客戶端連接到我的 AWS SES 帳戶以進行 SMTP,將 cron、monit 等警報發送到我的電子郵件地址,希望很快能將 Fail2Ban 發送到我的電子郵件地址。然而,Fail2Ban 並沒有發揮作用,或者更準確地說,selinux 正在阻止事情的發生。
action_mwl 在寬容模式下運作得很好。我收到禁止電子郵件。在強制模式下,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 設定問題,也不是電子郵件正文內容問題,因為我可以從命令列管道將確切的 Fail2Ban 訊息發送到 msmtp(直接或透過 sendmail 符號連結),而且發送效果很好。因此,憑證等都很好。也可以透過 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