¡Expulsa a todos los que intentan acceder sin autorización a tu servidor con fail2ban!

9 min

language: ja bn en es hi pt ru zh-cn zh-tw

Hola, soy un inútil. En el artículo anterior https://soulminingrig.com/blog/what\-country\-is\-the\-person\-trying\-to\-gain\-unauthorized\-access\-to\-my\-server\-via\-ssh/ pude confirmar que había demasiados intentos de acceso desde muchas IPs en solo un día. Aunque lo he estado ejecutando sin preocupaciones hasta ahora y nunca he sido realmente atacado, debería tomar medidas.
Además, la acumulación de archivos de registro se está volviendo demasiado grande y difícil de leer, lo cual es un poco molesto. Por lo tanto, he decidido implementar Fail2Ban, que me interesó cuando se instaló como dependencia al instalar iRedMail hace mucho tiempo.

¿Qué es esto?

Es posible bloquear IPs cuando hay un número configurado de intentos detectados por la auditoría de registros.
Además, es posible hacer que los paquetes de los intentos se pierdan a través de iptables. [Instalación

Como estoy conectado como root esta vez, no usaré sudo. Cuando busqué con `pkg search`, apareció el siguiente paquete, así que lo instalaré.

pkg install py311-fail2ban-1.1.0  
  

Básicamente, no se recomienda modificar el archivo de configuración fail2ban.conf directamente, sino crear y escribir en jail.conf. Por lo tanto, esta vez,
SSH, Postfix, Dovecot
Los intentos de inicio de sesión relacionados con estos tres son muy molestos, así que los configuraré.
Además, al ver varios sitios, parece que se puede configurar no solo en segundos, sino también con '1w' (una semana) y '1d' (un día), así que lo configuraré de forma espectacular. Bloquearé sin piedad durante una semana.

~ # cat /usr/local/etc/fail2ban/jail.local  
[sshd]  
enabled = true  
port    = ssh  
logpath = /var/log/auth.log  
bantime = 1w  
findtime = 1d  
maxretry = 5  
  
[postfix]  
enabled = true  
port    = smtp,ssmtp,submission  
logpath = /var/log/maillog  
bantime = 1w  
findtime = 1d  
maxretry = 10  
action = block-drop[name=postfix, port=smtp, protocol=tcp]  
  
[dovecot]  
enabled = true  
port    = pop3,pop3s,imap,imaps,submission  
logpath = /var/log/maillog  
bantime = 1w  
findtime = 1d  
maxretry = 10  
action = block-drop[name=dovecot, port=imap, protocol=tcp]  
  

Parece que es mejor crear una sección [default], pero por ahora, solo lo haré para estos tres y agregaré más si es necesario. Por cierto, las razones por las que lo configuré para una semana son:

  • En primer lugar, ahora accedo mediante autenticación de clave, así que no hay forma de que me equivoque.

  • Una vez que accedo al servidor de correo, la autenticación de inicio de sesión se mantiene por un tiempo, por lo que rara vez intento iniciar sesión manualmente.

  • Una vez que se bloquea, quiero que los paquetes se descarten por completo.

  • Más de 5 errores de inicio de sesión en un día es, en primer lugar, extraño.

Así que, ¿es bastante estricto o laxo? No me gusta que un período de bloqueo corto consuma recursos, así que lo hice así. Por cierto, parece que también se pueden bloquear los métodos GET en servidores HTTP. https://hana-shin.hatenablog.com/entry/2023/05/24/210949 No lo he implementado todavía porque solo uso este servidor como un servidor intermedio, pero si parece necesario, podría considerarlo. Y, además, he añadido action = block-drop, cuya configuración es la siguiente.

# cat /usr/local/etc/fail2ban/action.d/block-drop.conf  
[Definition]  
  
actionstart = iptables -N f2b-&LTname>  
              iptables -A f2b-&LTname> -j DROP  
              iptables -I INPUT -p all -j f2b-&LTname>  
              iptables -I FORWARD -p all -j f2b-&LTname>  
  
actionstop = iptables -D INPUT -p all -j f2b-&LTname>  
             iptables -D FORWARD -p all -j f2b-&LTname>  
             iptables -F f2b-&LTname>  
             iptables -X f2b-&LTname>  
  
actioncheck = iptables -n -L INPUT | grep -q 'f2b-&LTname>[     ]'  
  
actionban = iptables -I f2b-&LTname> -s &LTip> -j DROP  
  
actionunban = iptables -D f2b-&LTname> -s &LTip> -j DROP  
  

Básicamente, cuando se bloquea, hago que los paquetes se descarten por completo (Drop). Pensé que también existía 'Reject' y al revisar https://serverfault.com/questions/157375/reject-vs-drop-when-using-iptables, resultó que 'Reject' debería usarse cuando se quiere que la otra parte sepa que ha sido rechazada. Por lo tanto, como se trata de un bloqueo, decidí enviar los paquetes a la oscuridad sin piedad.

Inicio y verificación de funcionamiento

Como es FreeBSD, se inicia con esto.

service fail2ban start  
  

Si aparece 'Server ready', está bien. Revisaré los registros para confirmar que está funcionando correctamente.

# tail /var/log/fail2ban.log  
2024-07-24 13:34:05,654 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:34:05  
2024-07-24 13:34:05,755 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:34:05  
2024-07-24 13:34:05,884 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:34:05  
2024-07-24 13:34:06,000 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:34:05  
2024-07-24 13:34:06,317 fail2ban.actions        [39963]: WARNING [sshd]  already banned  
2024-07-24 13:34:06,731 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:34:06  
2024-07-24 13:37:14,327 fail2ban.filter         [39963]: INFO    [sshd] Found - 2024-07-24 13:37:14  
2024-07-24 13:42:12,266 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:42:12  
2024-07-24 13:42:17,389 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:42:17  
2024-07-24 13:42:23,357 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:42:23  
  

Normalmente se mostrarían las direcciones IP, pero esta vez las he ocultado correctamente. ¡Ya han sido bloqueados! ¡Te tengo, mocoso! grito en mi corazón.
(De todos modos, son bots y máquinas, ¿qué estoy pensando?) Dejando de lado esa inútil celebración, añadiré lo siguiente a /etc/rc.conf para que se inicie automáticamente.

fail2ban_enable="YES"  
  

Con esto, el proceso se iniciará automáticamente incluso después de reiniciar el servidor.


Así que, eso es todo por hoy. Por cierto, también pensé que sería interesante mostrar en un gráfico qué nombres de usuario se intentaron usar para iniciar sesión en los registros recibidos hasta ahora. Hasta la próxima.

Related Posts