
Eu estou openSMPTD
executando um servidor de e-mail. Parece que estou recebendo ataques de força bruta atualmente, embora duvide que eles entrem. Dito isso, gostaria de aliviar a carga do meu servidor com as constantes tentativas de login. Estou configurando fail2ban
para banir os infratores. No entanto, não consigo obter o regex correto e isso está me deixando louco! Eu vieste link no fórum do freeBSDsobre o fail2ban
regex para capturá-lo. No entanto, mesmo esse regex não pareceu capturar o texto de exemplo fornecido. Editei seu regex sem sucesso. Espero que alguém possa me dar algumas dicas, pois sou muito fraco em regexs.
Meus arquivos de log se parecem com:
Dec 25 20:03:29 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp connected address=193.169.254.42 host=<unknown>
Dec 25 20:03:30 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp tls ciphers=TLSv1.2:ECDHE-RSA-AES128-SHA256:128
Dec 25 20:03:30 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp authentication user=info result=permfail
Dec 25 20:03:30 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp failed-command command="AUTH LOGIN (password)" result="535 Authentication failed"
Dec 25 20:03:30 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp disconnected reason=quit
"
Então, vamos detalhar: a linha que mostra que eles são de força bruta é:
f7fa148a43b34578 smtp failed-command command="AUTH LOGIN (password)" result="535 Authentication failed"
Onde vemos falha na autenticação. No entanto, estranhamente, o openSMTPD não inclui o endereço IP para banir nessa linha: Temos que procurar um número variável acima dele para:
f7fa148a43b34578 smtp connected address=193.169.254.42 host=<unknown>
Onde podemos ver o endereço IP do infrator. Ok, é justo. A regex atual que tenho que seleciona todo o texto é:
^.*smtp connected address=\w[1-9.]* host=[a-z<>]*\n*[a-zA-Z0-9_.-\s\]\[:=<>"()]*
embora fail2ban
queira um mais refinado. Não tenho certeza se tenho uma maneira limpa de banir o endereço IP apropriado, pois é possível que duas pessoas se conectem ao mesmo tempo e, em seguida, a linha errada seja escolhida para banir.
Alguma sugestão?
Responder1
A maneira mais nova e mais limpa de usar um regex multilinha seria usar as <F-...>
tags que foram introduzidas na 0.10.0
versão e, infelizmente, ainda não estão bem documentadas.
[Definition]
prefregex = <F-MLFID>: \w{16} </F-MLFID><F-CONTENT>.+</F-CONTENT>$
failregex = <F-NOFAIL>smtp connected address=(?:<IP6>|<IP4>)</F-NOFAIL>
smtp failed-command command="AUTH LOGIN \(password\)" result="535 Authentication failed"
<F-NOFAIL><F-MLFFORGET>smtp disconnected</F-MLFFORGET></F-NOFAIL>
Explicação
O regex de pré-filtro é usado para pré-processar cada linha e capturar o ID da sessão, que presumo ser a f7fa148a43b34578
parte, e identificar a mesma sessão abrangendo várias linhas. O texto dentro <F-CONTENT>
é a parte que nos interessa e que será processada pelo failregex.
No failregex, oprimeiroum corresponde à linha com o endereço IP, que será necessário se um banimento for emitido, e é colocado entre as <F-NOFAIL>
tags para indicar que a linha não é considerada uma falha. Osegundoregex é a falha de autenticação real, que se correspondida, o fail2ban bloqueará o endereço IP capturado anteriormente. Odurarum deles é cercado pela <F-MLFFORGET>
diretiva, para sinalizar que é hora de descartar o ID de conexão capturado (já que o usuário se desconectou), e também é colocado entre <F-NOFAIL>
tags porque essa linha por si só também não é uma falha.
Você pode usar a fail2ban-regex
ferramenta para testar isso.
Posso ver por que o regex da postagem do fórum vinculada não funcionou para você; a string é diferente em mais de uma parte. Então, obviamente, você precisará alterar o segundo failregex acima se quiser corresponder a casos mais genéricos (não estou usando o opensmtpd, então não posso ajudá-lo com isso).