GNU/Linux >> LINUX-Kenntnisse >  >> Panels >> Webmin

Fail2Ban hinter einem Proxy/Load Balancer

Problem

Sie haben Benutzer, die Sie mit Fail2Ban von Ihren Webservern verbieten/blockieren möchten, aber Ihre Webserver befinden sich hinter einem Proxy, sodass der gesamte Datenverkehr von der IP/Schnittstelle des Proxyservers zu kommen scheint.

Idealerweise sollten Sie Lernregeln auf Ihrem Proxy oder Load Balancer haben, wo Sie automatisch filtern/bewerten/Aktionen ergreifen können, aber das ist möglicherweise nicht immer der Fall.

Die meisten Leute, die auf dieses Problem stoßen, kommen bis zum ersten Teil der Lösung, sind dann aber verblüfft, wenn sie Fail2Ban verwenden und es immer noch nicht funktioniert.

Für den Rest dieses Beitrags bezeichne ich den Proxy/Load Balancer einfach als LB, hauptsächlich weil diese Lösung für drei Webserver hinter einem Load Balancer entwickelt wurde.

Ändern Sie Ihr LB

Stellen Sie sicher, dass Ihr LB so eingerichtet ist, dass der HTTP-Header „X-Forwarded-For“ hinzugefügt wird.

Wie Sie dies aktivieren, hängt von Ihrem LB ab und ist nicht Gegenstand dieses Beitrags.

Apache-Konfigurationen Ihres Webservers ändern

Speziell rund um die Protokollierung. Wir möchten sicherstellen, dass Fail2Ban die „richtige“ IP identifizieren kann, um sie erfolgreich zu sperren.

Normalerweise verwende ich ein benutzerdefiniertes Protokollformat und füge die X-Forwarded-For-Details am Ende in einem leicht zu identifizierenden Block hinzu. Dies erscheint in den Protokollen am Ende als “[XF www.xxx.yyy.zzz]“

Dazu verwende ich die folgenden Direktiven in der vhost-Definition in Apache:

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

Anschließend sehen Sie die Protokolle wie folgt:

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

Was uns hier also interessiert, ist, dass die Anfrage von der externen IP 10.10.1.1 kommt (ja, ich weiß, das ist ein privater Adressraum, aber für diesen Beitrag werde ich keine „echten“ IP-Adressen verwenden)

Erstellen Sie Ihr Fail2Ban-Filterrezept

Es gibt drei Teile davon, den Filter, das „Gefängnis“ und die benutzerdefinierte IPTable-Aktion.

Filtern

Erstellen Sie Ihren Filter in fail2ban/filter.d entsprechend:

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

Aktion

Erstellen Sie Ihre benutzerdefinierte IPTables-Aktion in fail2ban/action.d entsprechend:

# 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

Der Unterschied zwischen diesem und einem normalen IPTables-DROP besteht darin, dass wir eine Paketprüfung durchführen müssen, bei der wir nach X-Forwarded-For und der relevanten IP-Adresse im Paket suchen, bevor wir es löschen. Dies sollte im Allgemeinen funktionieren, aber Ihre Laufleistung kann variieren.

Gefängnis

Jetzt können Sie Ihr Rezept zusammenmischen und in Ihre fail2ban/jail.local einfügen Datei

[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

Hier erlauben wir also 5 Anmeldeversuche in einer Minute, danach werden Sie für 15 Minuten vom Server blockiert.

Fail2ban neu laden und fertig!


Webmin
  1. Mod_rpaf:Real-IP hinter dem Reverse-Proxy/Load-Balancer extrahieren

  2. So konfigurieren Sie den HAProxy-Load-Balancer

  3. Squid-Proxy-Server

  4. Konfigurieren des HAproxy-Load-Balancers in Ubuntu 14.04

  5. Wie pinge ich hinter einem Proxy?

So erstellen Sie einen Load Balancer in Azure Cloud

Installieren Sie Pound – Apache Load Balancer – Ubuntu 14.04 / 15.04 / CentOS 7 / Fedora 22

Docker – So richten Sie Jupyter hinter dem Nginx-Proxy ein

So richten Sie HAProxy als Load Balancer für Nginx in CentOS 7 ein

Wie funktioniert ein Load Balancer? Was ist Load-Balancing?

So richten Sie Traefik Load Balancer mit Docker in Ubuntu 20.04 ein