msmtp는 SMTP용 AWS SES 계정에 연결하는 null 클라이언트로 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로(직접 또는 sendmail 심볼릭 링크를 통해) 정확한 Fail2Ban 메시지를 보낼 수 있고 아름답게 보내기 때문에 msmtp 구성 문제나 이메일 본문 콘텐츠 문제가 아닙니다. 따라서 자격 증명 등은 괜찮습니다. 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이 루트로 실행되는 것을 확인했습니다.
$ 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