Wenn wir einen Server mit Linux gemountet haben und ihn über die SSH-Fernbedienung vom Internet aus verwalten möchten , kann es vorkommen, dass wir Angriffe mit dem Ziel erhalten, in das System einzudringen und es für seine Zwecke steuern zu können. Diese Angriffe werden in der Regel von Computerprogrammen (Bots) ausgeführt, die lange Zeit versuchen, mit brachialer Gewalt auf das System zuzugreifen.
In früheren Beiträgen habe ich darüber gesprochen, wie man den SSH-Dienst konfiguriert, aber einige fortgeschrittene Bots treten nicht in den Dienst ein, sondern können den SSH-Dienst auf dem Server herunterfahren, indem sie den Fernzugriff deaktivieren.
Vollständiges SSH-Handbuch (Secure Shell)
Wir können dies vermeiden, indem wir das fail2ban-Tool verwenden . Es ist sehr praktisch und bietet einen großen Sicherheitsspielraum. Um seine Funktionsweise ein wenig zu erläutern. Kann iptables vor jedem erfolglosen Anmeldeversuch mehr als fünf Mal hintereinander erstellen und jede Art von Verbindung ablehnen, sobald sie gesperrt ist.
Installieren Sie Fail2ban
Die Installation kann direkt von apt aus erfolgen. Zuerst haben wir das System aktualisiert und dann Fail2ban installiert.
apt-get update && apt-get -y upgrade
apt-get install fail2ban
Dies installiert nicht nur das Programm, sondern lässt es auch laufen und startet mit dem System.
Fail2ban konfigurieren
Der Fail2ban-Dienst hat seine Einstellungen im Verzeichnis / etc / fail2ban . Sie haben einige Optionen in der jail.conf vorkonfiguriert. In diesem Fall ist es am besten, die Datei zu kopieren und die Änderungen nicht direkt darin vorzunehmen. Wenn Sie fail2ban aktualisieren, werden diese Dateien überschrieben und Sie können alle zuvor vorgenommenen Änderungen verlieren.
In diesem Fall kopieren wir die Datei und geben den Namen jail.local ein, damit Sie sie finden können.
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Nach dem Kopieren können wir es öffnen und sehen, wie es funktioniert.
vim /etc/fail2ban/jail.local
Innerhalb der Datei haben wir mehrere Parameter, die wir anpassen können. Jeder Parameter, der sich unter dem Tag [DEFAULT] befindet, wird auf alle von Fail2ban aktivierten Dienste wie SSH, NGINX, APACHE angewendet. Diese werden als global bezeichnet. Dann haben wir für jeden Dienst spezifische Abschnitte.
Wir werden beginnen, dem globalen Abschnitt Parameter hinzuzufügen.
ignoreip = 127.0.0.1
Wir fügen unseren localhost auf diese Weise hinzu und ignorieren den gesamten lokalen Datenverkehr. Wir können zusätzliche Adressen hinzufügen, indem wir sie durch ein Leerzeichen trennen.
Bantime = 600
Die Bantime ist der Zeitraum, in dem der Client gesperrt wird, nachdem er gesperrt wurde. Die Einheit ist in Sekunden, 600 Sekunden wären 10 Minuten der Standardwert.
findtime = 600 Maxretry = 3
Dann haben wir Zeit und Maxretry. Sie sind dafür verantwortlich, die Bedingungen festzulegen, unter denen ein Client standardmäßig gesperrt wird. Sie können lesen, dass jeder Benutzer mit mehr als 3 fehlgeschlagenen Versuchen in weniger als 10 Minuten gesperrt wird.
destemail = root @ localhost sendername = Fail2Ban mta = sendmail
Wenn wir Benachrichtigungen für die gesperrten Benutzer erstellen möchten, sind diese 3 Parameter erforderlich. Wir definieren das Ziel, an das die Benachrichtigungsmail gesendet werden soll, wer für das Senden verantwortlich ist, und schließlich die MTA, um zu definieren, welchen Mail-Service wir verwenden werden.
action = $ (action_) s
Hier legen wir fest, welche Maßnahmen zu ergreifen sind, wenn ein Verbot erforderlich ist. Der Wert action_ ist die Standardaktion, die auf der Zurückweisung des Kundenverkehrs bis zum Ablauf der Sperrzeit basiert.
Wenn wir eine Warnung per E-Mail senden möchten, müssen wir den Wert in action_mw ändern. Wenn wir jedoch auch Zeilen des Protokolls in den E-Mail-Text einfügen möchten, verwenden wir action_mwl. Wir müssen sicherstellen, dass die E-Mail-Einstellungen korrekt sind, bevor Sie diesen Wert ändern.
Konfigurationen nach Service
Sobald die globalen Konfigurationen abgeschlossen sind, fügen wir die Parameter hinzu, die ausschließlich auf die angewendet werden
Beim SSH-Dienst haben wir darauf geachtet, die Optionen unter dem Tag [SSH] hinzuzufügen.
enabled = true
Standardmäßig ist der SSH-Dienst aktiviert, wir können ihn jedoch bei Bedarf in dieser Option ändern.
Dieser ganze Abschnitt könnte mit den Werten arbeiten, die ich unten erläutere, aber Sie können ihn ändern, um ihn an Ihre Bedürfnisse anzupassen, oder sie alle standardmäßig belassen.
Eine andere Konfiguration sind die Filter, die angeben, ob die Anmeldung korrekt war oder nicht und für andere Dienste hinzugefügt werden können. Wir haben beispielsweise einen Server mit nginx und ein Teil der Seite ist passwortgeschützt, aber ein Client greift mit brachialer Gewalt an Beenden Sie dies, indem Sie Folgendes unter dem Tag [nginx-http-auth] hinzufügen.
[nginx-http-auth] enabled = true filter = nginx-http-auth port = http, https logpath = /var/log/nginx/error.log
Wenn ein Benutzer mehr als 3 erfolglose Anmeldeversuche hat, wird dies in den Protokollen widergespiegelt und fail2ban wird aktiv und blockiert den gesamten Benutzerverkehr.
Testumgebung
Nachdem wir die Grundlagen verstanden haben, werden wir eine kleine Testumgebung erstellen, in der wir SSH und Nginx durch Fail2ban schützen und eine Richtlinie zum Sperren erstellen, die uns über die gesperrte IP informiert.
Zuerst installieren wir Nginx, falls es nicht installiert ist
Apt-Get installieren Nginx
Wir werden einen Mail-Dienst installieren, über den Benachrichtigungen an sendmail gesendet werden können
apt-get install sendmail
Als letztes möchten wir, dass unsere iptables nach einem Boot persistent sind. Wir können entweder ein rc.0-Skript erstellen oder das iptables-persistent-Paket installieren.
apt-get install iptables-persistent
Es wird installiert.
Einrichtung unserer Firewall
Nach der Installation müssen wir eine Firewall implementieren, damit Sie den Datenverkehr blockieren können. Ich werde in späteren Einträgen eine grundlegende Firewall erstellen, ich werde mehr über die Iptables sprechen.
Wir erlauben bestehende Verbindungen, Serververkehr als Updates und Verkehr für SSH- und Nginx-Ports. Der gesamte verbleibende Datenverkehr wird abgelehnt.
sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED, RELATED -j ACCEPT sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -j DROP
Wir können die Änderungen sehen mit:
iptables -S
Es sollte ein ähnliches Ergebnis geben.
-P EINGABE AKZEPTIEREN -P FORWARD ACCEPT -P AUSGABE AKZEPTIEREN -N fail2ban-ssh - EINGABE - p tcp - m Multiport - Ports 22 - j fail2ban-ssh -A INPUT -i lo -j ACCEPT - EINGABE - M CONNTRACK - CTSTATE RELATED, ESTABLISHED - J ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -EINGABE -p tcp -m tcp --dport 80 -j AKZEPTIEREN -EINGABE -j TROPFEN -A fail2ban-ssh -j RETURN
Anpassen der Fail2Ban-Einstellungen
Jetzt müssen wir die Datei jail.local nach Belieben konfigurieren.
vi /etc/fail2ban/jail.local
Wir können die Zeitspanne, in der ein Benutzer gesperrt ist, um mindestens 30 Minuten verlängern. Denken Sie daran, den Wert in Sekunden anzugeben.
Bantime = 1800
Wir müssen eine Mail konfigurieren, die alle Bail-Warnungen von fail2ban empfängt, in der Datei nach dem Wert destemail suchen und die Mail platzieren.
destemail = [email protected]
Wir können den Absender ändern, der die übliche Benachrichtigung mit dem Namen fail2ban sendet, damit wir besser zwischen allen Protokollen filtern können.
Nachdem wir den Wert der Aktion ändern müssen, haben wir zwei Möglichkeiten:
- action_mw: Sende eine Warnung mit einem ähnlichen Bericht an den whois-Befehl des gesperrten Clients.
- action_mwl: Sendet eine viel detailliertere Warnung, einschließlich eines Protokolls im Hauptteil der Nachricht.
In diesem Fall verwenden wir die zweite Option:
action =% (action_mwl) s
Dann gehen wir zur Sektion [SSH] und wir können die maximale Anzahl von Versuchen vor dem Verbot bearbeiten. Wir lassen es in 5:
Maxretry = 5
Wenn wir den SSH-Dienst in einem anderen Port als 22 haben, was sehr zu empfehlen ist, sollten wir dessen Port erwähnen.
port = 45024
Dann werden wir nach dem Label [nginx-http-auth] suchen und es so belassen, wie es ist.
[nginx-http-auth] enabled = true
Wir haben fertig und können die Datei speichern und schließen.
Neustart des Fail2ban-Dienstes
Ich empfehle, den Dienst zu beenden, damit alle Änderungen übernommen werden.
Service fail2ban zu stoppen
Dann können wir sie wieder starten
service fail2ban start
Dies wird etwas dauern, nach ca. 5 Minuten können wir unsere Regeln wieder mit sehen
iptables -S
-P EINGABE AKZEPTIEREN -P FORWARD ACCEPT -P AUSGABE AKZEPTIEREN -N fail2ban-nginx-http-auth -N fail2ban-ssh -A INPUT -p tcp -m Multiport --dports 80.443 -j fail2ban-nginx-http-auth - EINGABE - p tcp - m Multiport - Ports 22 - j fail2ban-ssh -A INPUT -i lo -j ACCEPT - EINGABE - M CONNTRACK - CTSTATE RELATED, ESTABLISHED - J ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -EINGABE -p tcp -m tcp --dport 80 -j AKZEPTIEREN -EINGABE -j TROPFEN -A fail2ban-nginx-http-auth -j RETURN -A fail2ban-ssh -j RETURN
Wir sehen, wie fail2ban neue Richtlinien hinzugefügt hat, abhängig von der Konfiguration, die Sie in /etc/fail2ban/jail.local definiert haben.