Bloquear IPs permanentemente con fail2ban

Actualizado el domingo, 19 junio, 2016

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 es que los logs rotan y en ocasiones son eliminados. El otro problema con esta solución es que esas 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 es crear una cadena específica para esas direcciones IP bloqueadas y un archivo para almacenarlas.

Cambiamos el modo en que fail2ban loguea.

nano /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 log-rotate maneja estos ficheros.

nano /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.
Editamos el archivo de configuración de fail2ban.

nano /etc/fail2ban/jail.local

Pega 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:

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

Coloca 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:

nano /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 un error en fail2ban.log
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 hiciéramos esto, recibiríamos duplicados.

En “actionban” hemos establecido algunas variables. VERIFY e usa para verificar 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 escanean. 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.

Reinicia el servicio con el siguiente comando:

service fail2ban reload

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

 

3 Comentarios

  1. Cristhian
    30/10/2016
  2. sergio
    30/10/2016
  3. Cristhian
    31/10/2016

Agregar comentario