cyber security

Honeypot Fail2ban

CUIDADO. Si no adaptas los puertos del script generador de reglas de IPTABLES puedes acabar bloqueandote el acceso a tí mismo con este fail2ban con honeypot.

Hace ya unos 15 años que vengo usando fail2ban en algunos equipos expuestos a Internet, aunque personalmente procuro no exponer más que los servicios necesarios. Estos días he migrado la web a otro servidor y he aprovechado para dar una vuelta a la política de seguridad con respecto a los puertos.

He decidido no solo bloquear en función de accesos sospechosos en los logs del servidor web, etc. Quiero ser más proactivo y banear a todo el que esté husmeando en puertos, a la primera conexión. Un honeypot que haga saltar el fail2ban.

Para ello, vamos a utilizar un script de Python y el propio fail2ban.

Instalar fail2ban

La instalación de fail2ban la hacemos con el conocido

apt install fail2ban

El siguiente paso importante es añadir la IP desde donde nos conectamos a administrar el servidor a la lista de IPs permitidas e ignoradas. Esto lo tenemos en /etc/fail2ban/jail.conf. Se trata de un parámetro de configuración llamado ignoreip que permite ips específicas, CIDR y FQDN separados por espacios o comas.

ignoreip = 127.0.0.1/8 ::1 tu.fqdn.de.ddns.net 

Configurar un filtro personalizado para el honeypot

Ahora vamos a crear un nuevo filtro en /etc/fail2ban/filter.d/honeypot.conf. Este filtro nos permitirá filtrar los mensajes de iptables que tengan el prefijo [iptables honeypot] y nos generará unas variables de protocolo y puerto para luego poder escribir esta información en un log separado.

[INCLUDES]

# Read common prefixes. If any customizations available -- read them from
# common.local
before = common.conf

[Definition]

_daemon = fail2ban\.actions

# The name of the jail that this filter is used for. In jail.local
_jailname = honeypot

failregex = \[iptables honeypot\].* SRC=<HOST>.*PROTO=<F-PROTO>\S+</F-PROTO>.*DPT=<F-PORT>\d+</F-PORT>

Crear la entrada de Jail para el honeypot fail2ban

El siguiente paso es añadir en /etc/fail2ban/jail.d/default-debian.conf

[honeypot]
enabled   = true
filter    = honeypot
logpath   = /var/log/messages
banaction = honeypot
bantime   = 7200
maxretry  = 1

Generar la acción que escriba el log de los baneos

Ahora vamos a crear una nueva accion (la he copiado de iptables-allports) en /etc/fail2ban/action.d/honeypot.conf. Esta acción difiere en que escribe en /var/log/honeypot.log todos los baneos que vamos teniendo en un formato parseable.

# Fail2Ban configuration file
#
# Author: Cyril Jaquier
# Modified: Yaroslav O. Halchenko <debian@onerussian.com>
# 			made active on all ports from original iptables.conf
#
#

[INCLUDES]

before = iptables-common.conf


[Definition]

# Option:  actionstart
# Notes.:  command executed on demand at the first ban (or at the start of Fail2Ban if actionstart_on_demand is set to false).
# Values:  CMD
#
actionstart = <iptables> -N f2b-<name>
              <iptables> -A f2b-<name> -j <returntype>
              <iptables> -I <chain> -p <protocol> -j f2b-<name>

# Option:  actionstop
# Notes.:  command executed at the stop of jail (or at the end of Fail2Ban)
# Values:  CMD
#
actionstop = <iptables> -D <chain> -p <protocol> -j f2b-<name>
             <actionflush>
             <iptables> -X f2b-<name>

# Option:  actioncheck
# Notes.:  command executed once before each actionban command
# Values:  CMD
#
actioncheck = <iptables> -n -L <chain> | grep -q 'f2b-<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 = echo "[BAN] - $(date)|<ip>|<F-PROTO>|<F-PORT>" >> /var/log/honeypot.log && <iptables> -I f2b-<name> 1 -s <ip> -j <blocktype>

# 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 = <iptables> -D f2b-<name> -s <ip> -j <blocktype>

[Init]

Generar reglas iptables para el honeypot fail2ban

Ahora, usando el generador de reglas que hemos bajado del repositorio, generamos las reglas que escribirán en el log que monitoriza fail2ban.

REPITO. Tal y como viene la lista de puertos incluye el puerto SSH. Asegúrate de tener tu IP en ignoreip dentro de /etc/fail2ban/jail.conf. CUIDADO

[2021-09-22 09:34:27 javi@casa.casa:~/git/personal/iptables-gen]$ python3 gen.py 

# Generated by yet another iptables generator
/usr/sbin/iptables -N HONEYPOT 
/usr/sbin/iptables -A HONEYPOT -j LOG --log-prefix "[iptables honeypot] " --log-level 6 
/usr/sbin/iptables -A HONEYPOT -j DROP 
/usr/sbin/iptables -A INPUT -p tcp --match multiport --dports 20,21,22,23,25,53,81,110,111,123,135,139,143,389,445 --tcp-flags FIN,SYN,RST,ACK SYN -j HONEYPOT
/usr/sbin/iptables -A INPUT -p tcp --match multiport --dports 465,587,1024,1025,1026,1027,1028,1050,1433,1723,2121,2222,2323,3128,3306 --tcp-flags FIN,SYN,RST,ACK SYN -j HONEYPOT
/usr/sbin/iptables -A INPUT -p tcp --match multiport --dports 3389,4444,4567,5000,5060,5432,5800,5840,5900,6379,7547,7676,8000,8080,8081 --tcp-flags FIN,SYN,RST,ACK SYN -j HONEYPOT
/usr/sbin/iptables -A INPUT -p tcp --match multiport --dports 8082,10000,10050,10051,27017 --tcp-flags FIN,SYN,RST,ACK SYN -j HONEYPOT

Eso lo pondremos en un script de inicio del equipo, en un cron con @reboot delante (juntando los comandos con &&), o como cada uno prefiera. Todo intento de conexión a esos puertos de nuestro honeypot fail2ban resultará en un bloqueo inmediato a esa IP.

Ultimos pasos tras configurar el honeypot fail2ban

Por último, recuerda añadir a tu rotado de logs el archivo /var/log/honeypot.log