Tenho msmtp como um cliente nulo conectando-se à minha conta AWS SES para SMTP, entregando alertas como cron, monit e em breve Fail2Ban para meus endereços de e-mail. No entanto, o Fail2Ban não está jogando bola ou, para ser mais preciso, o selinux está impedindo que as coisas aconteçam.
action_mwl funciona bem no modo Permissivo. Recebo e-mails de proibição. No modo Enforcing, Fail2Ban registra um erro e nenhum email é enviado. Foi feita uma tentativa de envio, conforme log do msmtp, mas não deu certo.
Aqui está uma entrada de log Fail2Ban (parte de uma):
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'
relatórios 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
Não é um problema de configuração do msmtp nem um problema de conteúdo do corpo do e-mail, pois posso enviar aquela mensagem Fail2Ban exata da linha de comando para o msmtp (diretamente ou via link simbólico do sendmail) perfeitamente e ele envia lindamente. Credenciais, etc., portanto, estão bem. Também funciona via cron. O que significa que também não é um problema de firewall.
$ 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
Em jail.conf:
mta = sendmail
Sealert não me dá nenhuma dica que eu possa reconhecer ou agir.
Confirmei que fail2ban é executado como root:
$ ps aux | grep fail2ban
Eu adicionei alguns registros adicionais e agora coloco isso em /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.
Onde procurar a seguir? Como posso saber se o SELinux Fail2Ban pode funcionar bem com o msmtp?
Responder1
Depois de adicionar registros mais detalhados, recebi dicas suficientes do sistema (e do @Michael Hampton) para descobrir isso.
yum install setroubleshoot setools
Isso gera muito mais informações em /var/log/messages e oferece ferramentas como:
sealert -a /var/log/audit/audit.log
Também:
ausearch -m avc
Eles lhe darão instruções como:
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
Executando o comando sugerido:
sealert -l 78f05dbd-a953-4196-9f14-afaabb5a4d88
Me dá:
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
Então eu fiz:
$ grep msmtp /var/log/audit/audit.log | audit2allow -M fail2ban_msmtp
Dei uma olhada para ver o que ele criou:
$ vim fail2ban_msmtp.te
E então instalei a política, tornando-a persistente na reinicialização:
$ semodule -i fail2ban_msmtp.pp
Em seguida, bani um IP aleatório para acionar um banimento com e-mail para confirmar e agora finalmente me envia o e-mail desejado via msmtp:
$ fail2ban-client set sshd banip 162.229.158.134
Presto! Tão fácil, essa coisa do SELinux.
PS Outra maneira parece ser (não testada):
$ setsebool -P nis_enabled 1