
Tengo openSMPTD
ejecutando un servidor de correo. Parece que actualmente estoy siendo atacado por fuerza bruta, aunque dudo que entren. Dicho esto, me gustaría aliviar la carga en mi servidor con los constantes intentos de inicio de sesión. Me estoy configurando fail2ban
para prohibir a los infractores. Sin embargo, no puedo obtener la expresión regular correcta y ¡me está volviendo loco! Yo vieste enlace en el foro de freeBSDsobre la fail2ban
expresión regular para atraparlo. Sin embargo, incluso esa expresión regular no parecía capturar el texto de ejemplo que proporcionaron. Edité su expresión regular sin éxito. Espero que alguien pueda darme algunos consejos ya que soy muy débil en expresiones regulares.
Mis archivos de registro se ven así:
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
"
Entonces, analicemos esto: la línea que muestra que son fuerza bruta es:
f7fa148a43b34578 smtp failed-command command="AUTH LOGIN (password)" result="535 Authentication failed"
Donde vemos que la autenticación falló. Sin embargo, curiosamente, openSMTPD no incluye su dirección IP a prohibir en esa línea: tenemos que buscar un número de variable encima para:
f7fa148a43b34578 smtp connected address=193.169.254.42 host=<unknown>
Donde podremos ver la dirección ip del infractor. Bien, es justo. La expresión regular actual que tengo que selecciona todo el texto es:
^.*smtp connected address=\w[1-9.]* host=[a-z<>]*\n*[a-zA-Z0-9_.-\s\]\[:=<>"()]*
aunque fail2ban
quiere uno de grano más fino. No estoy seguro de tener una forma clara de obtener la dirección IP adecuada para prohibir, ya que es posible que dos personas se conecten a la vez y luego se seleccione la línea incorrecta para prohibir.
¿Alguna sugerencia?
Respuesta1
La forma más nueva y limpia de utilizar una expresión regular de varias líneas sería utilizar las <F-...>
etiquetas que se introdujeron en la 0.10.0
versión y que lamentablemente todavía no están bien 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>
Explicación
La expresión regular del prefiltro se utiliza para preprocesar cada línea y capturar la identificación de la sesión, que supongo que es la f7fa148a43b34578
parte, e identificar la misma sesión que abarca varias líneas. El texto interior <F-CONTENT>
es la parte que nos interesa y que será procesada por failregex.
En la expresión fallida, elprimerouno coincide con la línea con la dirección IP, que será necesaria si se va a emitir una prohibición, y está encerrado en las <F-NOFAIL>
etiquetas para indicar que la línea no se considera una falla. Elsegundoregex es el error de autenticación real, que si coincide, fail2ban bloqueará la dirección IP capturada previamente. Elúltimouno está rodeado por la <F-MLFFORGET>
directiva, para indicar que es hora de eliminar el ID de conexión capturado (ya que el usuario se ha desconectado), y también está encerrado entre <F-NOFAIL>
etiquetas porque esa línea por sí sola tampoco es un error.
Puede utilizar la fail2ban-regex
herramienta para probar esto.
Puedo ver por qué la expresión regular de la publicación vinculada del foro no funcionó para ti; La cuerda es diferente en más de una parte. Entonces, obviamente, necesitarás cambiar la segunda expresión de error de arriba si deseas hacer coincidir casos más genéricos (no estoy usando opensmtpd, así que no puedo ayudarte con eso).