Não consigo obter um Regex para o Fail2Ban funcionar com o Opensmtpd? Posso fazer uma verificação de sanidade?

Não consigo obter um Regex para o Fail2Ban funcionar com o Opensmtpd? Posso fazer uma verificação de sanidade?

Eu estou openSMPTDexecutando 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 fail2banpara 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 fail2banregex 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 fail2banqueira 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.0versã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 f7fa148a43b34578parte, 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-regexferramenta 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).

informação relacionada