So schützen Sie einen Nginx-Server mit Fail2Ban unter Ubuntu 14.04

Einführung

Beim Betrieb eines Webservers ist es wichtig, Sicherheitsmaßnahmen zum Schutz Ihrer Website und der Benutzer zu ergreifen. Der Schutz Ihrer Websites und Anwendungen durch Firewall-Richtlinien und die Einschränkung des Zugriffs auf bestimmte Bereiche durch Kennwortauthentifizierung ist ein guter Ausgangspunkt für die Sicherung Ihres Systems. Es ist jedoch wahrscheinlich, dass jede öffentlich zugängliche Passwortabfrage Brute-Force-Versuche von böswilligen Benutzern und Bots hervorruft.

Das Einrichten vonfail2ban kann zur Behebung dieses Problems beitragen. Wenn Benutzer sich wiederholt nicht bei einem Dienst authentifizieren (oder andere verdächtige Aktivitäten ausführen), kannfail2ban ein vorübergehendes Verbot der betreffenden IP-Adresse verhängen, indem die ausgeführte Firewall-Richtlinie dynamisch geändert wird. Jedes "Gefängnis" vonfail2banüberprüft die von einem Dienst geschriebenen Protokolle auf Muster, die auf fehlgeschlagene Versuche hinweisen. Das Einrichten vonfail2ban zur Überwachung von Nginx-Protokollen ist mit einigen der enthaltenen Konfigurationsfilter und einigen, die wir selbst erstellen, recht einfach.

In diesem Handbuch wird gezeigt, wie Siefail2ban installieren und konfigurieren, um Ihre Nginx-Protokolle auf Eindringversuche zu überwachen. Wir werden einen Ubuntu 14.04 Server verwenden.

Voraussetzungen

Bevor Sie beginnen, sollten Sie einen Ubuntu 14.04-Server mit einem Nicht-Root-Konto einrichten. Dieses Konto sollte mit den Berechtigungen vonsudokonfiguriert sein, um Verwaltungsbefehle ausgeben zu können. Befolgen Sie unsere Anweisungen zuinitial server setup guide for Ubuntu 14.04, um zu erfahren, wie Sie einen Benutzer mit den Berechtigungensudoeinrichten.

Installieren von Nginx und Konfigurieren der Kennwortauthentifizierung

Wenn Sie Ihren Nginx-Server mitfail2ban schützen möchten, ist möglicherweise bereits ein Server eingerichtet und ausgeführt. Wenn nicht, können Sie Nginx mitapt aus den Standard-Repositorys von Ubuntu installieren.

Aktualisieren Sie den lokalen Paketindex und installieren Sie ihn, indem Sie Folgendes eingeben:

sudo apt-get update
sudo apt-get install nginx

Der Dienstfail2banist nützlich, um Login-Einstiegspunkte zu schützen. Damit dies für eine Nginx-Installation nützlich ist, muss die Kennwortauthentifizierung für mindestens eine Teilmenge des Inhalts auf dem Server implementiert werden. Sie könnenthis guide folgen, um den Kennwortschutz für Ihren Nginx-Server zu konfigurieren.

Installieren Sie Fail2Ban

Sobald Ihr Nginx-Server ausgeführt und die Kennwortauthentifizierung aktiviert ist, können Siefail2ban installieren (wir fügen hier einen weiteren Repository-Neuabruf hinzu, falls Sie Nginx bereits in den vorherigen Schritten eingerichtet hatten):

sudo apt-get update
sudo apt-get install fail2ban

Dadurch wird die Software installiert. Standardmäßig istfail2ban so konfiguriert, dass nur fehlgeschlagene SSH-Anmeldeversuche gesperrt werden. Wir müssen einige Regeln aktivieren, die es konfigurieren, um in unseren Nginx-Protokollen nach Mustern zu suchen, die auf böswillige Aktivitäten hinweisen.

Anpassen der allgemeinen Einstellungen in Fail2Ban

Um zu beginnen, müssen wir die Konfigurationsdatei anpassen, diefail2ban verwendet, um zu bestimmen, welche Anwendungsprotokolle überwacht werden sollen und welche Maßnahmen zu ergreifen sind, wenn fehlerhafte Einträge gefunden werden. Die mitgelieferte/etc/fail2ban/jail.conf-Datei ist hierfür die wichtigste bereitgestellte Ressource.

Um Änderungen vorzunehmen, müssen wir diese Datei nach/etc/fail2ban/jail.local kopieren. Dies verhindert, dass unsere Änderungen überschrieben werden, wenn ein Paketupdate eine neue Standarddatei enthält:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Öffnen Sie die neu kopierte Datei, damit wir unsere Nginx-Protokollüberwachung einrichten können:

sudo nano /etc/fail2ban/jail.local

Standardeinstellungen ändern

Wir sollten zunächst die in der Datei festgelegten Standardeinstellungen auswerten, um festzustellen, ob sie unseren Anforderungen entsprechen. Diese finden Sie im Abschnitt[DEFAULT] in der Datei. Diese Elemente legen die allgemeinen Richtlinien fest und können jeweils in bestimmten Gefängnissen überschrieben werden.

Eines der ersten Elemente, die angezeigt werden müssen, ist die Liste der Clients, die nicht den Richtlinien vonfail2banunterliegen. Dies wird durch die Direktiveignoreipfestgelegt. Es ist manchmal eine gute Idee, Ihre eigene IP-Adresse oder Ihr eigenes Netzwerk zur Liste der Ausnahmen hinzuzufügen, um zu vermeiden, dass Sie sich selbst aussperren. Dies ist jedoch bei Webserver-Anmeldungen weniger problematisch, wenn Sie in der Lage sind, den Shell-Zugriff beizubehalten, da Sie das Verbot jederzeit manuell aufheben können. Sie können der vorhandenen Liste weitere IP-Adressen oder Netzwerke hinzufügen, die durch ein Leerzeichen begrenzt sind:

/etc/fail2ban/jail.local

[DEFAULT]

. . .
ignoreip = 127.0.0.1/8 your_home_IP

Ein weiteres Element, das Sie möglicherweise anpassen möchten, istbantime, mit dem gesteuert wird, für wie viele Sekunden ein beleidigendes Mitglied gesperrt wird. Es ist ideal, die Zeit so lange einzustellen, dass die Bemühungen eines böswilligen Schauspielers gestört werden, während sie kurz genug ist, um legitimen Benutzern die Behebung von Fehlern zu ermöglichen. Standardmäßig ist dies auf 600 Sekunden (10 Minuten) eingestellt. Erhöhen oder verringern Sie diesen Wert nach Belieben:

/etc/fail2ban/jail.local

[DEFAULT]

. . .
bantime = 3600

Die nächsten beiden Elemente legen den Umfang der Protokollzeilen fest, mit denen ein fehlerhafter Client ermittelt wird. findtime gibt eine Zeitspanne in Sekunden an, und die Anweisungmaxretry gibt die Anzahl der Versuche an, die innerhalb dieser Zeit toleriert werden sollen. Wenn ein Client mehr alsmaxretry Versuche innerhalb der durchfindtime festgelegten Zeit unternimmt, werden sie gesperrt:

/etc/fail2ban/jail.local

[DEFAULT]

. . .
findtime = 3600   # These lines combine to ban clients that fail
maxretry = 6      # to authenticate 6 times within a half hour.

Einrichten von E-Mail-Benachrichtigungen (optional)

Sie können E-Mail-Benachrichtigungen aktivieren, wenn Sie E-Mails erhalten möchten, sobald ein Verbot vorliegt. Dazu müssen Sie zuerst einen MTA auf Ihrem Server einrichten, damit dieser E-Mails versenden kann. Befolgen Siethis guide, um zu erfahren, wie Sie Postfix für diese Aufgabe verwenden.

Sobald Sie Ihren MTA eingerichtet haben, müssen Sie einige zusätzliche Einstellungen im Abschnitt[DEFAULT] der Datei/etc/fail2ban/jail.local vornehmen. Beginnen Sie mit dem Setzen der Direktivemta. Wenn Sie Postfix eingerichtet haben, wie im obigen Tutorial gezeigt, ändern Sie diesen Wert in "mail":

/etc/fail2ban/jail.local

[DEFAULT]

. . .
mta = mail

Sie müssen die E-Mail-Adresse auswählen, an die Benachrichtigungen gesendet werden sollen. Ändern Sie die Direktivedestemail mit diesem Wert. Mit der Direktivesendernamekann das Feld "Absender" in den Benachrichtigungs-E-Mails geändert werden:

/etc/fail2ban/jail.local

[DEFAULT]

. . .
destemail = [email protected]
sendername = Fail2BanAlerts

Infail2banist eine "Aktion" die Prozedur, die befolgt wird, wenn ein Client die Authentifizierung zu oft nicht besteht. Die Standardaktion (action_ genannt) besteht darin, die IP-Adresse einfach von dem betreffenden Port zu sperren. Es gibt jedoch zwei weitere vorgefertigte Aktionen, die verwendet werden können, wenn Sie Mail eingerichtet haben.

Mit der Aktionaction_mwkönnen Sie den Client sperren und eine E-Mail-Benachrichtigung an Ihr konfiguriertes Konto mit einem "whois" -Report über die betreffende Adresse senden. Sie können auch die Aktionaction_mwlverwenden, die dasselbe tut, aber auch die fehlerhaften Protokollzeilen enthält, die das Verbot ausgelöst haben:

/etc/fail2ban/jail.local

[DEFAULT]

. . .
action = %(action_mwl)s

Konfigurieren von Fail2Ban zur Überwachung von Nginx-Protokollen

Nachdem Sie einige der allgemeinenfail2ban-Einstellungen vorgenommen haben, können wir uns darauf konzentrieren, einige Nginx-spezifische Jails zu aktivieren, die unsere Webserver-Protokolle auf bestimmte Verhaltensmuster überwachen.

Jedes Gefängnis in der Konfigurationsdatei ist durch eine Kopfzeile gekennzeichnet, die den Namen des Gefängnisses in eckigen Klammern enthält (jeder Abschnitt außer dem Abschnitt[DEFAULT]gibt die Konfiguration eines bestimmten Gefängnisses an). Standardmäßig ist nur das Gefängnis von[ssh]aktiviert.

Um die Protokollüberwachung für Nginx-Anmeldeversuche zu aktivieren, aktivieren wir das Gefängnis[nginx-http-auth]. Bearbeiten Sie die Direktiveenabled in diesem Abschnitt so, dass sie "true" lautet:

/etc/fail2ban/jail.local

[nginx-http-auth]

enabled  = true
filter   = nginx-http-auth
port     = http,https
logpath  = /var/log/nginx/error.log
. . .

Dies ist das einzige Nginx-spezifische Gefängnis, das im Ubuntu-Paketfail2banenthalten ist. Wir können jedoch eigene Jails erstellen, um zusätzliche Funktionen hinzuzufügen. Die Inspiration für und einige der Implementierungsdetails dieser zusätzlichen Gefängnisse stammten vonhere undhere.

Wir können ein[nginx-noscript]-Gefängnis erstellen, um Clients zu verbieten, die auf der Website nach Skripten suchen, die ausgeführt und ausgenutzt werden sollen. Wenn Sie in Verbindung mit Ihrem Webserver kein PHP oder keine andere Sprache verwenden, können Sie dieses Gefängnis hinzufügen, um diejenigen zu sperren, die diese Arten von Ressourcen anfordern:

/etc/fail2ban/jail.local

[nginx-noscript]

enabled  = true
port     = http,https
filter   = nginx-noscript
logpath  = /var/log/nginx/access.log
maxretry = 6
. . .

Wir können einen Abschnitt namens[nginx-badbots] hinzufügen, um einige bekannte bösartige Bot-Anforderungsmuster zu stoppen:

/etc/fail2ban/jail.local

[nginx-badbots]

enabled  = true
port     = http,https
filter   = nginx-badbots
logpath  = /var/log/nginx/access.log
maxretry = 2

Wenn Sie Nginx nicht verwenden, um Zugriff auf Webinhalte in den Home-Verzeichnissen der Benutzer zu gewähren, können Sie Benutzer, die diese Ressourcen anfordern, sperren, indem Sie das Gefängnis[nginx-nohome]hinzufügen:

/etc/fail2ban/jail.local

[nginx-nohome]

enabled  = true
port     = http,https
filter   = nginx-nohome
logpath  = /var/log/nginx/access.log
maxretry = 2

Wir sollten Clients verbieten, die versuchen, unseren Nginx-Server als offenen Proxy zu verwenden. Wir können ein[nginx-noproxy]Gefängnis hinzufügen, um diesen Anforderungen zu entsprechen:

/etc/fail2ban/jail.local

[nginx-noproxy]

enabled  = true
port     = http,https
filter   = nginx-noproxy
logpath  = /var/log/nginx/access.log
maxretry = 2

Wenn Sie mit den gewünschten Änderungen fertig sind, speichern und schließen Sie die Datei. Wir müssen jetzt die Filter für die von uns erstellten Jails hinzufügen.

Hinzufügen der Filter für zusätzliche Nginx-Gefängnisse

Wir haben die/etc/fail2ban/jail.local-Datei mit einigen zusätzlichen Gefängnisspezifikationen aktualisiert, um einem größeren Bereich von schlechtem Verhalten zu entsprechen und dieses zu verbieten. Wir müssen die Filterdateien für die von uns erstellten Jails erstellen. Diese Filterdateien geben die Muster an, nach denen in den Nginx-Protokollen gesucht werden soll.

Wechseln Sie zunächst in das Filterverzeichnis:

cd /etc/fail2ban/filter.d

Zunächst möchten wir den im Lieferumfang enthaltenen Nginx-Authentifizierungsfilter so anpassen, dass er mit einem zusätzlichen Muster für fehlgeschlagene Anmeldungsprotokolle übereinstimmt. Öffnen Sie die Datei zum Bearbeiten:

sudo nano nginx-http-auth.conf

Fügen Sie unterhalb derfailregex-Spezifikation ein zusätzliches Muster hinzu. Dies stimmt mit Zeilen überein, in denen der Benutzer keinen Benutzernamen oder kein Passwort eingegeben hat:

/etc/fail2ban/filter.d/nginx-http-auth.conf

[Definition]


failregex = ^ \[error\] \d+#\d+: \*\d+ user "\S+":? (password mismatch|was not found in ".*"), client: , server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$
            ^ \[error\] \d+#\d+: \*\d+ no user/password was provided for basic authentication, client: , server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$

ignoreregex =

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Als nächstes können wir dieapache-badbots.conf-Datei kopieren, um sie mit Nginx zu verwenden. Wir können diese Datei unverändert verwenden, werden sie jedoch aus Gründen der Übersichtlichkeit unter einem neuen Namen kopieren. Dies stimmt überein, wie wir den Filter in der Gefängniskonfiguration referenziert haben:

sudo cp apache-badbots.conf nginx-badbots.conf

Als Nächstes erstellen wir einen Filter für das Gefängnis von[nginx-noscript]:

sudo nano nginx-noscript.conf

Fügen Sie die folgende Definition ein. Sie können die Skriptsuffixe anpassen, um Sprachdateien zu entfernen, die Ihr Server zu Recht verwendet, oder um zusätzliche Suffixe hinzuzufügen:

/etc/fail2ban/filter.d/nginx-noscript.conf

[Definition]

failregex = ^ -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi)

ignoreregex =

Speichern und schließen Sie die Datei.

Erstellen Sie als Nächstes einen Filter für das Gefängnis von[nginx-nohome]:

sudo nano nginx-nohome.conf

Fügen Sie die folgenden Filterinformationen in die Datei ein:

/etc/fail2ban/filter.d/nginx-nohome.conf

[Definition]

failregex = ^ -.*GET .*/~.*

ignoreregex =

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Schließlich können wir den Filter für das Gefängnis von[nginx-noproxy]erstellen:

sudo nano nginx-noproxy.conf

Diese Filterdefinition entspricht den Versuchen, Ihren Server als Proxy zu verwenden:

/etc/fail2ban/filter.d/nginx-noproxy.conf

[Definition]

failregex = ^ -.*GET http.*

ignoreregex =

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Aktivieren Sie Ihre Nginx Jails

Um Ihre Konfigurationsänderungen zu implementieren, müssen Sie den Dienstfail2banneu starten. Sie können dies tun, indem Sie Folgendes eingeben:

sudo service fail2ban restart

Der Dienst sollte neu gestartet werden und die verschiedenen von Ihnen konfigurierten Sperrrichtlinien implementieren.

Informationen zu aktivierten Jails abrufen

Sie können alle aktivierten Jails mit dem Befehlfail2ban-client anzeigen:

sudo fail2ban-client status

Sie sollten eine Liste aller von Ihnen aktivierten Jails sehen:

OutputStatus
|- Number of jail:      6
`- Jail list:           nginx-noproxy, nginx-noscript, nginx-nohome, nginx-http-auth, nginx-badbots, ssh

Sie können sichiptables ansehen, um festzustellen, dassfail2ban Ihre Firewall-Regeln geändert hat, um ein Framework zum Sperren von Clients zu erstellen. Selbst ohne vorherige Firewall-Regeln wäre jetzt ein Framework aktiviert, mit demfail2ban Clients selektiv sperren können, indem sie zu speziell erstellten Ketten hinzugefügt werden:

sudo iptables -S
Output-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-nginx-badbots
-N fail2ban-nginx-http-auth
-N fail2ban-nginx-nohome
-N fail2ban-nginx-noproxy
-N fail2ban-nginx-noscript
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-noproxy
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-nohome
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-badbots
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-noscript
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A fail2ban-nginx-badbots -j RETURN
-A fail2ban-nginx-http-auth -j RETURN
-A fail2ban-nginx-nohome -j RETURN
-A fail2ban-nginx-noproxy -j RETURN
-A fail2ban-nginx-noscript -j RETURN
-A fail2ban-ssh -j RETURN

Wenn Sie die Details der Verbote sehen möchten, die von einem Gefängnis durchgesetzt werden, ist es wahrscheinlich einfacher, diefail2ban-client erneut zu verwenden:

sudo fail2ban-client status nginx-http-auth
OutputStatus for the jail: nginx-http-auth
|- filter
|  |- File list:        /var/log/nginx/error.log
|  |- Currently failed: 0
|  `- Total failed:     0
`- action
   |- Currently banned: 0
   |  `- IP list:
   `- Total banned:     0

Testen von Fail2Ban-Richtlinien

Es ist wichtig, die Richtlinien Ihresfail2banzu testen, um sicherzustellen, dass sie den Datenverkehr wie erwartet blockieren. Beispielsweise können Sie bei der Nginx-Authentifizierungsaufforderung mehrmals falsche Anmeldeinformationen eingeben. Nachdem Sie das Limit überschritten haben, sollten Sie gesperrt sein und nicht mehr auf die Site zugreifen können. Wenn Sie E-Mail-Benachrichtigungen einrichten, sollten in dem von Ihnen angegebenen E-Mail-Konto Nachrichten zu dem Verbot angezeigt werden.

Wenn Sie den Status mit dem Befehlfail2ban-client anzeigen, wird Ihre IP-Adresse von der Site gesperrt:

sudo fail2ban-client status nginx-http-auth
OutputStatus for the jail: nginx-http-auth
|- filter
|  |- File list:        /var/log/nginx/error.log
|  |- Currently failed: 0
|  `- Total failed:     12
`- action
   |- Currently banned: 1
   |  `- IP list:       111.111.111.111
   `- Total banned:     1

Wenn Sie zufrieden sind, dass Ihre Regeln funktionieren, können Sie Ihre IP-Adresse mitfail2ban-client manuell deaktivieren, indem Sie Folgendes eingeben:

sudo fail2ban-client set nginx-http-auth unbanip 111.111.111.111

Sie sollten jetzt erneut versuchen können, sich zu authentifizieren.

Fazit

Das Einrichten vonfail2ban zum Schutz Ihres Nginx-Servers ist im einfachsten Fall recht einfach. fail2banbietet jedoch ein hohes Maß an Flexibilität beim Erstellen von Richtlinien, die Ihren spezifischen Sicherheitsanforderungen entsprechen. Wenn Sie sich die Variablen und Muster in der Datei/etc/fail2ban/jail.local und die Dateien in den Verzeichnissen/etc/fail2ban/filter.d und/etc/fail2ban/action.dansehen, finden Sie viele Teile, die Sie optimieren und ändern können Bedürfnisse entwickeln sich. Das Erlernen der Grundlagen zum Schutz Ihres Servers mitfail2ban bietet Ihnen mit minimalem Aufwand ein hohes Maß an Sicherheit.

Wenn Sie mehr überfail2banerfahren möchten, klicken Sie auf die folgenden Links: