Bloquear IPs reincidentes permanentemente con fail2ban

abril 23, 2014
1 Star2 Stars3 Stars4 Stars5 Stars (1 votos, promedio: 5,00 de 5)
Cargando…

iptables -I fail2ban-<Hay un sistema integrado en fail2ban para comprobar el log predeterminado y luego poner en marcha una prohibición más extensa sobre la base de los intentos registrados. El problema con este enfoque es que los logs giran y en ocaseiones son eliminados. Aunque fail2ban buscará a través de logs archivados es obvio que no se puede buscar a través de los que se han borrado. El otro problema con esta solución es que eses IPs solo se almacenan en iptables lo que significa que cuando el servidor o servicio fail2ban se reinicia la tabla puede haberse quedado vacía. Por supuesto fail2ban volverá a aplicar las reglas iptables si esas direcciones IP se mantienen en los archivos de registro del sistema (siempre y cuando no se hayan eliminado).

La solución que proponemos crea otra cadena específicamente para esas direcciones IP bloqueadas y un archivo para almacenarlas.

Lo primero es lo primero. Debemos cambiar el módo en que fail2ban loguea.

vi /etc/fail2ban/fail2ban.conf

Alrededor de la linea 24:

loglevel = 3

Alrededor de la linea 34:

logtarget = /var/log/fail2ban.log

Ahora tenemos que cambiar el modo en que logrotate maneja estos ficheros.

vi /etc/logrotate.d/fail2ban

Reemplaza todo con:

/var/log/fail2ban.log {
    missingok
    notifempty
    monthly
    rotate 13
    create 0600 root root
    postrotate /usr/bin/fail2ban-client set logtarget /var/log/fail2ban.log 2> /dev/null || true
    endscript
}

Lo que hemos hecho aquí es decir a log rotate rote (valga la redundancia) este log todos los meses y borre los viejos logs a los 13 meses. Esto es porque nuestro tiempo de búsqueda (del que hablaremos posteriormente) está definido a 1 año. Si el tiempo de búsqueda es de 1 año máximo, no hay necesidad de guardar logs más allá de ese periodo de tiempo ya que las IPs se guardarán en una lista de bloqueo.

Ahora tendremos que editar el archivo de configuration de fail2ban.

vi /etc/fail2ban/jail.local

Pon este código al final del archivo:

[repeatoffender]
 
enabled  = true
filter   = repeatoffender
action   = repeatoffender[name=repeatoffender]
           sendmail-whois[name=Repeat-Offender, dest=email@yourdomain.com, sender=fail2ban@yourdomain.com]
logpath  = /var/log/fail2ban.log
maxretry = 10
findtime = 31536000
bantime  = -1

Lo que hemos hecho aquí es crear un nuevo filtro que monitoriza el log que hemos creado en el paso anterior. Lo hemos asignado un filtro y también una nueva acción. Hemos establecido el valor de intentos máximo a 10 veces (puedes cambiar este número si quieres) y hemos establecido también un tiempo de búsqueda a 31536000 que es un año en segundos. Por supuesto puedes cambiar este número a otro que quieras, pero ten en cuenta de que si lo alargas, DEBES cambiar también el periodo de borrado de la rotación log. Por último hemos establecido a -1 el tiempo de baneo, o lo que es lo mismo baneo permanente.

Ahora creamos el filtro:

vi /etc/fail2ban/filter.d/repeatoffender.conf

Pon esto en el archivo:

#Fail2Ban configuration file
#
# Author: TSCADFX
#
# This filter monitors the fail2ban log file, and permanently
# bans the ip addresses of persistent attackers.
#
# As of this version this ban only works with iptables.
#
 
[Definition]
_jailname = repeatoffender
failregex = fail2ban.actions:\s+WARNING\s+\[(?:.*)\]\s+Ban\s+<HOST>
ignoreregex = fail2ban.actions:\s+WARNING\s+\[%(_jailname)s\]\s+Ban\s+<HOST>

Aquí definimos las reglas para capturar las IPs reincidentes.

Ahora debemos crear la acción:

vi /etc/fail2ban/action.d/repeatoffender.conf
# Fail2Ban configuration file
#
# Author: TSCADFX
#
 
[INCLUDES]
 
before = iptables-blocktype.conf
 
 
[Definition]
 
# Option:  actionstart
# Notes.:  command executed once at the start of Fail2Ban.
# Values:  CMD
#
actionstart =	iptables -N fail2ban-<name>
				iptables -A fail2ban-<name> -j RETURN
              	iptables -I <chain> -p <protocol> -j fail2ban-<name>
              	# Establish chain and blocks for saved IPs
              	iptables -N fail2ban-ip-blocklist
              	iptables -A fail2ban-ip-blocklist -j RETURN
              	iptables -I <chain> -p <protocol> -j fail2ban-ip-blocklist
              	cat /etc/fail2ban/ip.blocklist.<name> |grep -v ^\s*
				#|awk '{print $1}' | while read IP; do iptables -I fail2ban-ip-blocklist 1 -s $IP -j REJECT --reject-with icmp-port-unreachable; done

# Option:  actionstop
# Notes.:  command executed once at the end of Fail2Ban
# Values:  CMD
#
actionstop = iptables -D <chain> -p <protocol> -j fail2ban-<name>
             iptables -F fail2ban-<name>
             iptables -X fail2ban-<name>
             # Remove chain and blocks for saved IPs to prevent duplicates on service restart
             iptables -D <chain> -p <protocol> -j fail2ban-ip-blocklist
             iptables -F fail2ban-ip-blocklist
             iptables -X fail2ban-ip-blocklist
 
# Option:  actioncheck
# Notes.:  command executed once before each actionban command
# Values:  CMD
#
actioncheck = iptables -n -L <chain> | grep -q 'fail2ban-<name>[ \t]'
 
# Option:  actionban
# Notes.:  command executed when banning an IP. Take care that the
#          command is executed with Fail2Ban user rights.
# Tags:    See jail.conf(5) man page
# Values:  CMD
#
actionban = VERIFY="<ip>*"
            ADD="<ip>        # fail2ban/$( date '+%%Y-%%m-%%d %%T' ): Perma-Banned"
            FILE=/etc/fail2ban/ip.blocklist.<name>
            grep -q "$VERIFY" "$FILE" || iptables -I fail2ban-<name>  1 -s <ip> -j <blocktype>
            grep -q "$VERIFY" "$FILE" || echo "$ADD" >> "$FILE"
 
# Option:  actionunban
# Notes.:  command executed when unbanning an IP. Take care that the
#          command is executed with Fail2Ban user rights.
# Tags:    See jail.conf(5) man page
# Values:  CMD
#
actionunban = # Do nothing becasuse their IP is in the blocklist file
 
# To manually unban from the ip blocklist file run this command:
# Be warned that if the ip is in log rotated files it must be whitelisted
#
# sed -i '/^<ip>/d' /etc/fail2ban/ip.blocklist.repeatoffender
#
 
[Init]
 
# Default name of the chain
#
name = default

# Option:  protocol
# Notes.:  internally used by config reader for interpolations.
# Values:  [ tcp | udp | icmp | all ] Default: tcp
#
protocol = tcp

# Option:  chain
# Notes    specifies the iptables chain to which the fail2ban rules should be
#          added
# Values:  STRING  Default: INPUT
chain = INPUT

IMPORTANTE!!: Si estás usando DEBIAN reemplaza el comando

iptables -I fail2ban-<name>  1 -s <ip> -j <blocktype>

por

iptables -I fail2ban-<name>  1 -s <ip> -j DROP

De lo contrario nos aparecería este error en fail2ban.log:

fail2ban.actions.action: ERROR VERIFY="199.48.164.137*"
ADD="199.48.164.137 # fail2ban/$( date '+%Y-%m-%d %T' ): Perma-Banned"

Con esto hemos hecho lo siguiente:

En “actionstart” hemos creado la cadena adicional de iptables. De hecho hemos creado dos nuevas cadenas, una será para las IPs recientemente bloqueadas y la otra para las que están guardadas en la lista de bloqueo. También hemos creado el comando para leer de la lista de bloqueo y aplicar esas entradas iptables en la cadena ip-blocklist.

En “actionstop” hemos añadido la cadena ip-blocklist a la cadena original para eliminar la cadena de iptables en el evento de fail2ban reiniciado. Si no hicieramos esto, recibiríamos duplicados.

En “actionban” hemos establecido algunas variables. VERIFY e usa para verificr si la dirección IP ya existe en la lista de direcciones IP bloqueadas. Puede que te preguntes “Bien, si las baneamos para siempre por qué necesitaríamos chequear el fichero para la IP?. Simplemente no tendrían que alcanzar el servidor nunca más”. La respuesta es simple, si se reinicia el servidor o fail2ban estos logs se reescanean. Si se encuentran de nuevo (el número de aciertos existen en los logs no borrados) se ejecuta actionban. Esto normalmente crearía otra entrada en el fichero de listas de bloqueo y se crearía otro bloque en el firewall adicionalmente al bloqueo hecho por el archivo de lista de bloqueos en actionstart. FILE se usa para definir la localización y nombre del fichero donde guardar las ips. Lo utilizamos entonces para hacer un grep y verificar la existencia de la IP en el fichero y escribir a iptables para bloquear la IP. Seguidamente, escribimos la dirección IP a la lista de direcciones para que sea bloqueada.

En “actionunban” Hemos eliminado el comando porque no queremos desbanearlos automáticamente nunca.

También hemos añadido un pequeño comando para eliminar la dirección IP del fichero de listas de bloqueo en caso de que necesites usarlo. Simplemente reemplaza <ip> con la dirección que quieres eliminar.

sed -i '/^<ip>/d' /etc/fail2ban/ip.blocklist.repeatoffender

Ten en cuenta que tendrás que incluir la ip en el whitelist y eliminarla de iptables, de lo contrario no será desbloqueada o será desbloqueada en el próximo reinicio.

Cuando estés listo reinicia el servicio con el siguiente comando:

service fail2ban reload

Fuente: http://tscadfx.com/permanently-ban-repeat-offenders-with-fail2ban/

2 pensamientos en “Bloquear IPs reincidentes permanentemente con fail2ban

  1. QuieroReTruco

    Hola!
    Excelente explicación, acabo de ponerla en práctica, espero haberlo hecho bien….

    Gracias y saludos!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *