Problema
Tiene usuarios que desea prohibir/bloquear de sus servidores web mediante Fail2Ban, pero sus servidores web están detrás de un proxy, por lo que todo el tráfico parece provenir de la IP/interfaz del servidor proxy.
Idealmente, debería tener reglas de aprendizaje en su proxy o balanceador de carga donde pueda filtrar/puntuar/tomar acciones automáticamente, pero esto puede no ser siempre el caso.
La mayoría de las personas que se encuentran con este problema llegan a la primera parte de la solución, pero luego se desconciertan cuando usan Fail2Ban y aún así no funciona.
En el resto de esta publicación, me referiré al Proxy/Load Balancer simplemente como LB, principalmente porque esta solución se desarrolló para tres servidores web detrás de un balanceador de carga.
Modifique su LB
Asegúrese de que su LB esté configurado para agregar el encabezado http "X-Forwarded-For".
Cómo habilitar esto dependerá de su LB y está fuera del alcance de esta publicación.
Modifique las configuraciones de su servidor web Apache
Específicamente en torno al registro. Queremos asegurarnos de que Fail2Ban pueda identificar la IP "correcta" para prohibirla con éxito.
Usualmente uso un formato de registro personalizado y agrego los detalles de X-Forwarded-For al final en un bloque fácil de identificar, esto aparece en los registros al final como "[XF www.xxx.yyy.zzz]"
Para ello utilizo las siguientes directivas en la definición de vhost en Apache:
CustomLog /path/to/logs/access_log "%h %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-agent}i\" \"[XF %{X-Forwarded-For}i]\""
A continuación, comenzará a ver los registros de la siguiente manera:
192.168.1.2 - - [29/Sep/2014:10:56:31 +0100] "POST /login.php HTTP/1.1" 200 15 "-" "curl/7.19.7 " "[XF 10.10.1.1]"
Entonces, lo que nos interesa aquí es que la solicitud provenga de la IP externa 10.10.1.1 (sí, sé que es un espacio de direcciones privado, pero para esta publicación no voy a usar direcciones IP "reales")
Cree su receta de filtro Fail2Ban
Hay tres partes de esto, el filtro, la "cárcel" y la acción IPTable personalizada.
Filtro
Crea tu filtro en fail2ban/filter.d en consecuencia:
# Fail2Ban configuration file # # Author: Centos.Tips # # $Revision: 1$ # [Definition] # Option: failregex # Notes.: Regexp to catch Apache brute force login attempts (using X-Forwarded-For) # Values: TEXT # failregex = POST .*/login.php.*\[XF <HOST> # Option: ignoreregex # Notes.: regex to ignore. If this regex matches, the line is ignored. # Values: TEXT # ignoreregex =
Acción
Cree su acción IPTables personalizada en fail2ban/action.d en consecuencia:
# Fail2Ban configuration file # # Author: Centos.Tips # # [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> --dport <port> -j fail2ban-<name> # Option: actionstop # Notes.: command executed once at the end of Fail2Ban # Values: CMD # actionstop = iptables -D <chain> -p <protocol> --dport <port> -j fail2ban-<name> iptables -F fail2ban-<name> iptables -X fail2ban-<name> # 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 = iptables -I fail2ban-<name> 1 -p tcp --dport 80 -m string --algo bm --string 'X-Forwarded-For: <ip>' -j DROP # 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 fail2ban-<name> -p tcp --dport 80 -m string --algo bm --string 'X-Forwarded-For: <ip>' -j DROP [Init] # Default name of the chain # name = default # Option: port # Notes.: specifies port to monitor # Values: [ NUM | STRING ] Default: # port = http # 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
La diferencia entre esto y un IPTables DROP normal es que tenemos que hacer una inspección de paquetes donde buscamos el X-Forwarded-For y la dirección IP relevante en el paquete antes de soltarlo. Por lo general, esto debería funcionar, pero su millaje puede variar.
Cárcel
Ahora puedes mezclar tu receta y pegarla en tu fail2ban/jail.local archivo
[apache-proxy] enabled = true filter = apache-proxy action = iptables-proxy[name = apache-proxy, port = http, protocol = tcp] sendmail-whois[name=LoginDetect, [email protected], [email protected], sendername="Fail2Ban"] port = http logpath = /path/to/your/access_log maxretry = 5 findtime = 60 bantime = 900
Así que aquí permitiremos 5 intentos de inicio de sesión en un minuto, después de eso, estarás bloqueado del servidor durante 15 minutos.
¡Recarga fail2ban y listo!