GNU/Linux >> Tutoriels Linux >  >> Panels >> Webmin

Fail2Ban derrière un proxy/équilibreur de charge

Problème

Vous avez des utilisateurs que vous souhaitez bannir/bloquer de vos serveurs Web à l'aide de Fail2Ban, mais vos serveurs Web sont derrière un proxy, de sorte que tout le trafic semble provenir de l'IP/de l'interface du serveur proxy.

Idéalement, vous devriez avoir des règles d'apprentissage sur votre proxy ou votre équilibreur de charge où vous pouvez automatiquement filtrer/noter/entreprendre des actions, mais ce n'est pas toujours le cas.

La plupart des gens qui rencontrent ce problème vont jusqu'à la première partie de la solution, mais sont ensuite déconcertés lorsqu'ils utilisent Fail2Ban et cela ne fonctionne toujours pas.

Pour le reste de cet article, je ferai référence au Proxy/Load Balancer simplement en tant que LB, principalement car cette solution a été développée pour trois serveurs Web derrière un équilibreur de charge.

Modifier votre LB

Assurez-vous que votre LB est configuré pour ajouter l'en-tête http "X-Forwarded-For".

La façon dont vous activez cela dépendra de votre LB et n'entre pas dans le cadre de cet article.

Modifier les configurations Apache de votre serveur Web

Plus précisément autour de la journalisation. Nous voulons nous assurer que Fail2Ban peut identifier la "bonne" IP afin de l'interdire avec succès.

J'utilise généralement un format de journal personnalisé et j'ajoute les détails X-Forwarded-For à la fin dans un bloc facile à identifier, cela apparaît dans les journaux à la fin sous la forme "[XF www.xxx.yyy.zzz]"

Pour ce faire, j'utilise les directives suivantes dans la définition de vhost dans Apache :

CustomLog /path/to/logs/access_log "%h %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-agent}i\" \"[XF %{X-Forwarded-For}i]\""

Vous commencerez alors à voir les journaux comme suit :

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]"

Donc, ce qui nous intéresse ici, c'est que la requête provient de l'adresse IP externe 10.10.1.1 (oui, je sais que c'est un espace d'adressage privé, mais pour ce message, je ne vais pas utiliser de "vraies" adresses IP)

Créez votre recette de filtre Fail2Ban

Il y a trois parties, le filtre, la "prison" et l'action IPTable personnalisée.

Filtrer

Créez votre filtre dans fail2ban/filter.d en conséquence :

# 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 =

Action

Créez votre action IPTables personnalisée dans fail2ban/action.d en conséquence :

# 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 différence entre cela et un IPTables DROP normal est que nous devons effectuer une inspection des paquets où nous recherchons le X-Forwarded-For et l'adresse IP pertinente dans le paquet avant de le supprimer. Cela devrait généralement fonctionner, mais votre kilométrage peut varier.

Prison

Vous pouvez maintenant mélanger votre recette et la coller dans votre fail2ban/jail.local fichier

[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

Donc, ici, nous autoriserons 5 tentatives de connexion en une minute, après quoi vous serez bloqué du serveur pendant 15 minutes.

Rechargez fail2ban et vous avez terminé !


Webmin
  1. Mod_rpaf :Extraire l'adresse IP réelle derrière le proxy inverse/l'équilibreur de charge

  2. Comment configurer l'équilibreur de charge HAProxy

  3. Serveur proxy Squid

  4. Configuration de l'équilibreur de charge HAproxy dans Ubuntu 14.04

  5. Ubuntu One derrière un proxy, comment le faire fonctionner ?

Comment créer un équilibreur de charge dans Azure Cloud

Installer Pound – Equilibreur de charge Apache – Ubuntu 14.04 / 15.04 / CentOS 7 / Fedora 22

Docker - Comment configurer Jupyter derrière le proxy Nginx

Comment configurer HAProxy comme équilibreur de charge pour Nginx dans CentOS 7

Comment fonctionne un équilibreur de charge ? Qu'est-ce que l'équilibrage de charge ?

Comment configurer l'équilibreur de charge Traefik avec Docker dans Ubuntu 20.04