Fail2Ban이 msmtp를 통해 알림을 이메일로 보내는 것을 방지하는 SELinux

Fail2Ban이 msmtp를 통해 알림을 이메일로 보내는 것을 방지하는 SELinux

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

관련 정보