4b42 Logo

Wissensdatenbank

Benutzerbild
13 August 2015
2.481

Nginx Request Angriffe mit fail2ban blockieren

Vorwort

Im Internet gibt es viele Tools wie zum Beispiel Apache Benchmark, mit diesen Tools ist es möglich, ohne grossen Aufwand Webseiten bzw. Webserver mit geringer Leistung in die Knie zu zwingen. Ich beschreibe hier wie ich mich gegen die mit bekannten Angriffe schütze.

Voraussetzung

- Linux mit Nginx Webserver

Installation

Der Grundbaustein für alles ist Fail2Ban, dieses Tool sollte eigentlich jeder kennen oder wenigstens einmal gehört haben.
apt-get install fail2ban


Konfiguration


nginx


Öffnen Sie die Konfigurationsdatei des Nginx Webservers mit einem Editor und fügen Sie folgende Zeilen im Bereich http { ... } ein:
nano /usr/local/nginx/conf/nginx.conf
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_req_status 444;

Passen Sie nun die Konfiguration Ihrer Webseite an, bei mir gibt es für jedes Projekt eine eigene Konfigurationsdatei:
nano /usr/local/nginx/conf/sites/4b42.com
Fügen Sie die folgende Zeile im location ~ \.php$ { ... } Block ein:
limit_req zone=one burst=5;

Starten Sie nun den Webserver neu:
/etc/init.d/nginx restart
[ ok ] Restarting nginx (via systemctl): nginx.service.


Zum Testen verwenden Sie am besten ein anderes System und installieren die Apache2 Tools:
apt-get install apache2-utils

Nach der Installation können Sie den Test durchführen:
ab -n 100 -c 10 http://fbi.gov/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd
Licensed to The Apache Software Foundation

Benchmarking fbi.gov (be patient).....done


Server Software: Nginx
Server Hostname: fbi.gov
Server Port: 80

Document Path: /
Document Length: 283 bytes

Concurrency Level: 10
Time taken for tests: 5.011 seconds
Complete requests: 100
Failed requests: 60
(Connect: 0, Receive: 0, Length: 60, Exceptions: 0)
Write errors: 0
Non-2xx responses: 100
Total transferred: 469119 bytes
HTML transferred: 449409 bytes
Requests per second: 19.96 [#/sec] (mean)
Time per request: 501.064 [ms] (mean)
Time per request: 50.106 [ms] (mean, across all concurrent requests)
Transfer rate: 91.43 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 0 151 731.8 1 5010
Waiting: 0 151 731.6 1 5009
Total: 1 151 731.8 1 5011

Percentage of the requests served within a certain time (ms)
50% 1
66% 1
75% 1
80% 1
90% 1
95% 1010
98% 4010
99% 5011
100% 5011 (longest request)



fail2ban


Öffnen Sie die Konfigurationsdatei mit einem Editor und passen Sie die folgenden Einträge an:
nano /etc/fail2ban/jail.conf
destemail = ihre.email@4b42.com
sender = fail2ban@hostname.4b42.net

Erstellen Sie eine neue Konfigurationsdatei:
nano /etc/fail2ban/filter.d/nginx-http-requests.conf
# Fail2Ban configuration file
#
# List of bad requests
#
# Server: Nginx
# Author: Kevin Bühl
#

[Definition]

# Option: failregex
# Notes : Detection of 444 requests.
# Values: TEXT
#
failregex = ^<HOST> - .* "(GET|POST|HEAD).*HTTP.*" 444 0 ".+" ".+"$

# Option: ignoreregex
# Notes : Regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =

Öffnen Sie nun die Konfigurationsdatei von fail2ban:
nano /etc/fail2ban/jail.conf
[nginx-http-requests]
# if any ip requesting more than 240 pages in 60 seconds is suspicious Block for two days
enabled = true
port = http,https
filter = nginx-http-requests
logpath = /var/log/nginx/access.log
findtime = 60
bantime = 172800
maxretry = 240