Debian 9 : Apache mit mod_qos und fail2ban absichern
Es kommt immer wieder vor das die Webserver unter Volllast geraten da jemand unsere API exzessiv anfragt. Da hier alle anderen Anfragen auch mit betroffen sind ist hier ein möglicher Weg einen Apache dagegen abzusichern. In meinem Fall handelt es sich um ein Debian 9 bei anderen Linux Derivaten sollte es ähnlich funktionieren.
Erstmal installieren wir die benötigten Packete
Quellen :
http://mod-qos.sourceforge.net/#variables
https://de.wikipedia.org/wiki/Slowloris
https://www.fail2ban.org/wiki/index.php/Main_Page
https://sourceforge.net/p/mod-qos/discussion/
http://mod-qos.sourceforge.net/#statusviewer
http://mod-qos.sourceforge.net/glossary.html
http://mod-qos.sourceforge.net/dos.html
Distributor ID: Debian Description: Debian GNU/Linux 9.5 (stretch) Release: 9.5 Codename: stretch
Natürlich kann man die Werte aus diesem Beispiel nicht einfach übernehmen, diese müssen der jeweiligen Anwendung angepasst werden, sie dienen lediglich als Beispiel
Erstmal installieren wir die benötigten Packete
apt install libapache2-mod-qos fail2banDann machen wir die Konfiguration für mod_qos
vi /etc/apache2/conf-available/mod_qos.confdort tragen wir erstmal eine Grundkonfiguration ein
## QoS Settings <IfModule mod_qos.c> # Gleichzeitige Verbindungen von 100000 IP Adressen zulassen QS_ClientEntries 100000 # maximal 20 Verbindungen pro IP Adresse QS_SrvMaxConnPerIP 20 # maximale Anzahl der aktiven TCP Verbindungen hier 256 MaxClients 256 # QS_SrvMaxConnClose <Nummer> [%] definiert die maximale Anzahl der gleichzeitigen TCP-Verbindungen, # bis der Server Keep-Alive für diesen Server deaktiviert (die Verbindung wird nach jeder Anforderung geschlossen. # Sie können die Anzahl der Verbindungen als Prozentsatz von MaxClients angeben, wenn Sie das Suffix hinzufügen '%' auf den angegebenen Wert. QS_SrvMaxConnClose 70% # minimum request/response speed (https://de.wikipedia.org/wiki/Slowloris Schutz): QS_SrvMinDataRate 150 1200 # QS_SrvMinDataRate <bytes pro seconds> [<max bytes pro second> [<connections>]], definiert den minimalen Upload / Download-Durchsatz # QS_SrvMaxConnExcludeIP <addr> # QS_SrvMaxConnExcludeIP 192.168.x.xxx # # Quelle : https://www.mankier.com/1/mod_qos </IfModule>Jetzt geben wir noch die Statusseite für qos frei damit wir auch sehen was hier so passiert.
<Location /qos> SetHandler qos-viewer Require ip [Eigene IP Adresse oder IP Range (CIDR)] # z.B. Require ip 127.0.0.1 </Location>Jetzt aktivieren wir noch das Modul und die Konfiguration
a2enmod qos a2enconf mod_qosdann der obligatorische Neustart des Apaches
systemctl restart apache2nun kann man den ersten Test durchführen, von einem anderen Rechner die IP Adresse des Servers über das Apache Benchmark Tool einfach mal anfragen mit diesen Werten
ab -n 1500 -c 100 http://[IP des Webservers]/index.htmlim Errorlog des Apaches sollten jetzt solche Meldungen erscheinen
[xxx] [:error] [xxx] mod_qos(034): access denied, QS_SrvMinDataRate rule (in): min=354, this connection=26, c=192.168.x.xxx [xxx] [:error] [xxx] mod_qos(031): access denied, QS_SrvMaxConnPerIP rule: max=50, concurrent connections=51, c=192.168.x.xxxDann machen wir mit fail2ban weiter
vi /etc/fail2ban/jail.d/http-requests.confdort fügen wir diesen Inhalt ein
[http-requests] enabled = true port = http,https filter = http-requests logpath = /var/log/apache2/access.log # maxretry bedeutet wieviele GET / POST wir im Log finden bevor wir die IP sperren maxretry = 30 # findtime ist die Zeitperiode in der wir GET/POST zählen (10 Sekunden) findtime = 10 # Wielange wird die IP gebannt in Sekunden (600 Sekunden = 10 Minuten) bantime = 600 action = iptables[name=HTTP, port=http, protocol=tcp]den Filter dazu erstellen
vi /etc/fail2ban/filter.d/http-requests.confund dort diesen Inhalt rein
# Fail2Ban configuration file # http-requests.conf # [Definition] # failregex = es wird gegen GET/POST im Logfile gematched failregex = ^<HOST> -.*"(GET|POST).* # ignoreregex = ignoreregex =ein neustart von fail2ban aktiviert die Config
systemctl restart fail2banJetzt kann wieder mit dem Apache Benchmark Tool getestet werden, bevor wir allerdings das Benchmark Tool von einem anderen Rechner aus starten öffnen wir lokal das Logfile von fail2ban damit wir sehen was passiert.
tail -f /var/log/fail2ban.logjetzt den Benchmark starten wie oben angegeben. Im Log sollten jetzt solche Meldungen erscheinen
2018-07-20 00:25:27,998 fail2ban.filter [6203]: INFO [http-requests] Found 192.168.x.xxx 2018-07-20 00:25:27,998 fail2ban.filter [6203]: INFO [http-requests] Found 192.168.x.xxx 2018-07-20 00:25:28,096 fail2ban.actions [6203]: NOTICE [http-requests] 192.168.x.xxx already banned 2018-07-20 00:25:29,098 fail2ban.actions [6203]: NOTICE [http-requests] 192.168.x.xxx already bannedIn fail2ban kann man sich jetzt den Status anzeigen lassen
root@ddev-01: fail2ban-client status http-requests Status for the jail: http-requests |- Filter | |- Currently failed: 1 | |- Total failed: 1629 | `- File list: /var/log/apache2/access.log `- Actions |- Currently banned: 1 |- Total banned: 2 `- Banned IP list: 192.168.x.xxxmöchte man die IP wieder entsperren genügt ein
fail2ban-client set http-requests unbanip 192.168.x.xxxwenn eine bestimmte IP oder eine IP Range freigegeben werden muss ist das in der jail.conf zu erledigen
vi /etc/fail2ban/jail.confdort nach ignoreip = suchen und die eigene IP hinzufügen
Quellen :
http://mod-qos.sourceforge.net/#variables
https://de.wikipedia.org/wiki/Slowloris
https://www.fail2ban.org/wiki/index.php/Main_Page
https://sourceforge.net/p/mod-qos/discussion/
http://mod-qos.sourceforge.net/#statusviewer
http://mod-qos.sourceforge.net/glossary.html
http://mod-qos.sourceforge.net/dos.html