GNU/Linux >> Tutoriales Linux >  >> Panels >> Webmin

Fail2Ban detrás de un proxy/balanceador de carga

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!


Webmin
  1. Mod_rpaf:extraiga la IP real desde detrás del proxy inverso/equilibrador de carga

  2. Cómo configurar el balanceador de carga HAProxy

  3. Servidor proxy de calamar

  4. Configuración del balanceador de carga HAproxy en Ubuntu 14.04

  5. Ubuntu One detrás de un proxy, ¿cómo hacer que funcione?

Cómo crear un Load Balancer en Azure Cloud

Instalar Pound – Equilibrador de carga de Apache – Ubuntu 14.04 / 15.04 / CentOS 7 / Fedora 22

Docker:cómo configurar Jupyter detrás del proxy Nginx

Cómo configurar HAProxy como Load Balancer para Nginx en CentOS 7

¿Cómo funciona un balanceador de carga? ¿Qué es el equilibrio de carga?

Cómo configurar el balanceador de carga Traefik con Docker en Ubuntu 20.04