Denyhosts vs fail2ban vs iptables - der beste Weg, um Brute-Force-Anmeldungen zu verhindern?

62

Ich richte einen LAMP-Server ein und muss SSH / FTP / etc. Verhindern. Brute-Force-Anmeldeversuche fehlgeschlagen. Ich habe viele Empfehlungen für Denyhosts und Fail2Ban gesehen, aber nur wenige Vergleiche der beiden. Ich habe auch gelesen, dass eine IPTables-Regel dieselbe Funktion erfüllen kann.

Warum sollte ich eine dieser Methoden einer anderen vorziehen? Wie gehen die Benutzer von serverfault mit diesem Problem um?

spiffytech
quelle

Antworten:

53

IIRC, DenyHosts überwacht nur Ihren SSH-Dienst. Wenn Sie es auch zum Schutz anderer Dienste benötigen, ist Fail2ban definitiv die bessere Wahl. Es ist konfigurierbar, nahezu jeden Dienst zu überwachen, wenn Sie bereit sind, die Konfiguration zu optimieren. Dies sollte jedoch nicht erforderlich sein, da die neueren Versionen von Fail2ban Regelsätze enthalten, die für viele gängige Server-Daemons geeignet sind. Die Verwendung von fail2ban über ein einfaches iptables-Ratenlimit hinaus hat den Vorteil, dass ein Angreifer für einen bestimmten Zeitraum vollständig blockiert wird, anstatt nur zu reduzieren, wie schnell er Ihren Server schlagen kann. Ich habe fail2ban mit großartigen Ergebnissen auf einer Reihe von Produktionsservern verwendet und noch nie einen dieser Server gesehen, der durch einen Brute-Force-Angriff verletzt wurde, seit ich damit angefangen habe.

Ron
quelle
3
Beachten Sie, dass DenyHosts andere Dienste blockiert - der Hauptunterschied besteht darin, dass fail2ban iptables verwendet, während DenyHosts hosts.deny verwendet. Einige Dienste sehen sich Hosts-Dateien wie Apache nicht an.
Jamypeach
Um eine weitere Option auf den Tisch zu werfen, habe ich kürzlich entdeckt, dass der ufw-Firewall-Konfigurator es Ihnen auch ermöglicht, ein (nicht konfigurierbares) Ratenlimit auf jeden TCP- oder UDP-Port anzuwenden. Wenn Sie bereits UFW verwenden, ist dies möglicherweise eine gute Option, anstatt einen zusätzlichen Dämon zu konfigurieren und auszuführen.
Spiffytech
Das erste, was Sie tun müssen, um Bruteforce-Verstöße zu verhindern, ist die Verwendung eines einigermaßen sicheren Kennworts (oder die Deaktivierung der Kennwortauthentifizierung insgesamt :). Die Geschwindigkeitsbegrenzung (allein) ist dafür zu schwach. Ich habe keine Alternativen ausprobiert, aber ich benutze selbst fail2ban und fand es ziemlich nützlich, die Bots für die Passwortprüfung abzuwehren.
Petr Gladkikh
Nach meiner Erfahrung benötigt fail2ban ein bisschen mehr Arbeit, um überhaupt etwas zu bewirken. Im Gegensatz dazu können Sie denyhosts RPM so ziemlich einfach installieren und starten, um Ihren Server zu schützen, während Sie komplexere Optionen ausarbeiten. Ich stimme definitiv zu, dass fail2ban "besser" ist, aber zum leichteren Schutz kann man Denyhosts nicht schlagen.
Ralph Bolton
21

beste Weg, um Brute-Force-Anmeldungen zu verhindern?

Lassen Sie sie erst gar nicht an Ihre Maschine! Es gibt viele Möglichkeiten, Brute-Force-Versuche zu stoppen, bevor sie Ihren Host erreichen, oder sogar auf SSH-Ebene.

Trotzdem ist es eine großartige Idee, Ihr Betriebssystem mit so etwas wie fail2ban zu schützen. Fail2ban unterscheidet sich geringfügig von DenyHosts, obwohl sie im selben Bereich abgespielt werden. Fail2ban verwendet iptables.

http://en.wikipedia.org/wiki/Fail2ban

Fail2ban ähnelt DenyHosts, aber im Gegensatz zu DenyHosts, das sich auf SSH konzentriert, kann fail2ban so konfiguriert werden, dass alle Dienste überwacht werden, die Anmeldeversuche in eine Protokolldatei schreiben, und statt /etc/hosts.deny nur zum Blockieren von IP-Adressen / Hosts verwendet werden , fail2ban kann Netfilter / iptables und TCP Wrapper /etc/hosts.deny verwenden.

Es gibt eine Reihe wichtiger Sicherheitstechniken, die Sie berücksichtigen sollten, um Brute-Force-Anmeldungen zu verhindern:

SSH:

  • Erlaube root nicht, sich anzumelden
  • Ssh-Passwörter nicht zulassen (Authentifizierung mit privatem Schlüssel verwenden)
  • Hören Sie nicht auf jede Schnittstelle
  • Erstellen Sie eine Netzwerkschnittstelle für SSH (z. B. eth1), die sich von der Schnittstelle unterscheidet, von der Sie Anfragen bearbeiten (z. B. eth0).
  • Verwenden Sie keine gebräuchlichen Benutzernamen
  • Verwenden Sie eine Zulassungsliste und lassen Sie nur Benutzer zu, die SSH-Zugriff benötigen
  • Wenn Sie einen Internetzugang benötigen ... Beschränken Sie den Zugriff auf eine begrenzte Anzahl von IP-Adressen. Eine statische IP-Adresse ist ideal, die Beschränkung auf xx0.0 / 16 ist jedoch besser als 0.0.0.0/0
  • Wenn es möglich ist, eine Verbindung ohne Internetzugang herzustellen, können Sie auf diese Weise den gesamten Internetverkehr für SSH ablehnen (z. B. können Sie mit AWS eine direkte Verbindung herstellen, die das Internet umgeht und als Direct Connect bezeichnet wird).
  • Verwenden Sie Software wie fail2ban, um Brute-Force-Angriffe abzuwehren
  • Stellen Sie sicher, dass das Betriebssystem immer auf dem neuesten Stand ist, insbesondere die Sicherheits- und SSH-Pakete

Anwendung:

  • Stellen Sie sicher, dass Ihre Anwendung immer auf dem neuesten Stand ist, insbesondere bei Sicherheitspaketen
  • Sperren Sie die Administrationsseiten Ihrer Anwendung. Viele der oben genannten Ratschläge gelten auch für den Administratorbereich Ihrer Anwendung.
  • Passwort Schützen Sie Ihren Admin-Bereich. So etwas wie htpasswd für die Webkonsole projiziert alle zugrunde liegenden Schwachstellen der Anwendung und schafft eine zusätzliche Eintrittsbarriere
  • Sperren Sie Dateiberechtigungen. 'Upload folder' sind berüchtigt dafür, Einstiegspunkte für alle möglichen bösen Dinge zu sein.
  • Ziehen Sie in Betracht, Ihre Anwendung hinter ein privates Netzwerk zu stellen und nur Ihren Front-End-Load-Balancer und eine Jumpbox bereitzustellen (dies ist eine typische Einrichtung in AWS unter Verwendung von VPCs).
Drew Khoury
quelle
1
Könnten Sie die Aussage "Es gibt viele Möglichkeiten, Brute-Force-Versuche zu stoppen, bevor sie Ihren Host erreichen oder sogar auf SSH-Ebene." Näher ausführen? Ich bin speziell interessiert, wenn Sie Vorschläge für gehostete Computer haben, auf denen Sie keine Kontrolle über das externe Netzwerk haben. Vielen Dank!
Kevin Keane
7

Ich verwende iptables-Regeln, um neue Verbindungen von derselben IP-Adresse mit einer Rate zu begrenzen (hauptsächlich SSH, aber es würde auch für FTP gut funktionieren). Der Vorteil gegenüber "fail2ban" und anderen Tools dieser Art ist meines Erachtens, dass die iptables-Route vollständig im Kernel-Modus abläuft und keine Tools im Benutzermodus zum Tail / Parsen von Protokolldateien benötigt.

Hunderte fehlgeschlagene SSH-Anmeldungen

In diesem Fall hilft es natürlich auch, die Quelladressen zu beschränken, die auf die betreffenden Protokolle zugreifen können.

Mit SSH sollten Sie wirklich die Zertifikatauthentifizierung verwenden und ohnehin keine Passwörter akzeptieren.

Evan Anderson
quelle
@ mc0e - Ich verfolge nicht.
Evan Anderson
7

Eine weitere gute Möglichkeit, SSH zu schützen (ich habe dies für ein Jahrzehnt oder besser verwendet), besteht darin, die aktuellen Bibliotheken in iptables nativ zu verwenden (abhängig von Ihrer Distribution).
Grundsätzlich kann es als Port-Knocking verwendet werden, das in iptables eingebaut ist. Dies erspart Ihnen viele Kopfschmerzen. Solange Sie eine TCP-Verbindung herstellen können (Telnet ist eine Möglichkeit. Ich habe auch SSH-Clients verwendet und sie auf den Port verwiesen. Alles, was eine TCP-Verbindung zu einer angegebenen Portnummer herstellen kann. Ich schaue Sie an, Putty!) Der Client, der die SSH-Verbindung initiiert, kann verwendet werden.

Im Folgenden finden Sie ein Beispiel, bei dem iptables den Port 22 für Ihren Host geöffnet hat, wenn Sie von Ihrem Host aus mit dem Server über Port 4103 telneten. Anschließend können Sie den Port 4102 oder 4104 mit einem Telnet schließen, um das Öffnen zu beenden. Der Grund für 4102 und 4104 ist, dass ein einfacher TCP-Scan nicht geöffnet werden kann. Nur eine TCP-Verbindung (Telnet) zu Port 4103 ermöglicht den Zugriff.

Genießen!

Oh und ich bevorzuge Fail2Ban. Mehr Flexibilität und ich mag, dass das Verbot eher in iptables als in tcpwrappern geschieht.

SSH PORTKNOCKING

iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -m recent --rcheck --name SSH -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 4102 -m recent --name SSH --remove -j DROP
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 4103 -m recent --name SSH --set -j DROP
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 4104 -m recent --name SSH --remove -j DROP
Jeff Moore
quelle
6

Ein weiterer Unterschied zwischen Fail2ban und Denyhosts besteht darin, dass Denyhosts die Sperrliste für andere Denyhosts-Benutzer freigeben kann. Mit Fail2ban können Sie nur IP-Adressen blockieren, die Ihr Server zuvor gesehen hat. Mit Denyhosts gelangt ein Brute-Force-Versuch möglicherweise nie auf Ihren Server, wenn ihn jemand anderes gesehen hat, und die Blockierungsliste wird vor dem Angreifer auf Ihren Server heruntergeladen gelangt zu Ihrem Computer.

Ein weiterer Unterschied ist, dass Fail2ban iptables verwendet, während Denyhosts tcpwrapper verwendet. Andere haben diesen Unterschied bereits erwähnt, aber es gibt ein paar erwähnenswerte Randbemerkungen.

iptables ist darauf beschränkt, wie viele IP-Adressen Sie effizient blockieren können. Dies ist wahrscheinlich einer der Gründe, warum Fail2ban keinen Mechanismus zum Freigeben von Sperrlisten hat.

Ein weiterer Effekt ist, dass Fail2ban möglicherweise nicht mehr funktioniert oder neu geschrieben werden muss, wenn iptables durch nftables ersetzt wird. Denyhosts werden wahrscheinlich weiterarbeiten.

Beide haben also Vor- und Nachteile. Ich mag beides; Für mich selbst verwende ich Denyhosts, weil ich normalerweise nur SSH schützen möchte und die Sperrliste gerne freigebe.

Kevin Keane
quelle
5

Eine Sache, die Sie bei Fail2Ban beachten sollten, ist, dass es anscheinend etwa 10 MB mehr Speicher benötigt als DenyHosts. Wenn Sie also ein 128-MB-VPS verwenden, sollten Sie sich das genauer ansehen. Out-of-the-Box-Fail2Ban wird nur für SSH eingerichtet, was bedeutet, dass DenyHosts ohne Änderungen an der Konfiguration dasselbe in weniger Arbeitsspeicher ausführt.

Xeoncross
quelle
2
Fügen Sie "ulimit -s 256" an / etc / default / fail2ban an. 10 MB auf meinem System gesenkt.
pkoch
3

denyhosts ist für ssh. fail2ban ist umfassender (HTTP, FTP usw.). Beide verwenden iptables hinter den Kulissen.

Ignacio Vazquez-Abrams
quelle
Sowohl "denyhosts" als auch "fail2ban" verwenden iptables, um ihr "Blocking" -Verhalten zu erreichen, aber sie verwenden iptables nicht, um die Rate zu begrenzen. Sie analysieren Protokolle im "Benutzerland" und reagieren auf Protokolleinträge.
Evan Anderson
10
@Evan, denyhosts verwendet standardmäßig keine iptables. Es verwendet TCP-Wrapper und aktualisiert Ihre Datei /etc/hosts.deny, wenn ein System gesperrt werden soll.
Zoredache
@Zoredache: Ich stehe korrigiert. Nachdem ich "denyhosts" schon einmal verwendet habe, habe ich eine falsche Annahme darüber getroffen, wie es seine "Blocking" -Funktionalität aufruft. Da ich ein Userland-Tool zum Analysieren und Reagieren von Protokollen bin, würde ich es vorziehen, eine streng iptables-basierte Lösung zu verwenden, um "denyhosts" zu entziehen.
Evan Anderson
1

Warum sollte nicht die offene Community die ganze Arbeit für Sie erledigen und stattdessen CSF / LFD verwenden, anstatt sich mit langwierigen iptables oder fail2ban config herumzuschlagen? Ich kann es vor allen anderen genannten Optionen nur wärmstens empfehlen. Informationen zu den Funktionen für Ihre Server finden Sie unter http://configserver.com/cp/csf.html . CSF benötigt kein Control-Panel, sondern bietet eine einfache Benutzeroberfläche für diejenigen, die dies nicht per Shell tun möchten. Und es ist eine Menge stabiler, zuverlässiger Perl-Skripte für Nichtresidente.

Ben
quelle
8
Dies klingt eher wie eine Werbung und beschönigt die eigentliche Frage.
Drew Khoury
Naja nein, ich habe die eigentliche Frage nicht beschönigt. Ich gab Ihnen eine Alternative, die Sie daran hindern würde, sich überhaupt mit dieser Frage zu beschäftigen. Im Ernst, CSF / LFD ist nicht nur ein weiteres Firewall-Kontrollsystem, sondern hat sich genau aus den Problemen entwickelt, mit denen sich hier befasst haben. Warum sollte sich jemand NICHT weiterentwickeln wollen? Das spart Ihnen viel Zeit, weil andere es bereits gelöst haben. Deshalb gibt es CSF.
Ben
Für jemanden, der die Verdienstmöglichkeiten meiner Zeit schätzt und der den richtigen Preis hat, hätte ich lieber eine "Plug-and-Play" -Lösung für diese Art von Dingen, auch wenn sie ein paar Dollar kosten. Auf diese Weise muss ich keine Zeit mit dem Erlernen von Dingen verschwenden, die mir wirklich egal sind, aber die Wichtigkeit des Schutzes erkennen.
David
1

fail2ban scheint keinen Mechanismus zu haben, um eine erfolgreiche SSH-Anmeldung zu erkennen und die Anzahl der Fehler zurückzusetzen.

Der Standardfilter für sshd (zumindest bei meiner Debian-Installation) taktet eine Fehleranzahl für jeden ssh-Schlüssel, den der Client vorlegt und den der Server ablehnt. Einige Benutzer zeigen bei jedem Login viele Schlüssel an und werden regelmäßig gesperrt, obwohl ihre Anmeldung erfolgreich war, nachdem einige Schlüssel durchlaufen wurden.

Infolgedessen denke ich derzeit über eine Abkehr von fail2ban nach. Zumindest in dieser Hinsicht ist Denyhosts besser. Es ist jedoch anscheinend keine gute Option mehr und wird in neueren Versionen von Debian nicht mehr unterstützt (einige Diskussionen unter https://www.chrissearle.org/2015/06/16/replacing-denyhosts-with-fail2ban-for- debian / )

Ich habe hier keine gute Lösung.

mc0e
quelle
Bei Verwendung der LDAP-Authentifizierung tritt ein ähnliches Problem auf. Bei zu vielen erfolgreichen Anmeldungen werden Sie gesperrt: bugs.launchpad.net/ubuntu/+source/libpam-ldap/+bug/562388
Mike
Zeigen Sie Ihren Benutzern, wie sie den Schlüssel angeben, der in ihrer ~ / .ssh / config-Datei verwendet werden soll, um zu verhindern, dass alle Schlüssel angezeigt werden.
BillThor
0

Eigentlich denke ich, dass DenyHost in der Lage ist, viele andere Dienste außer dem SSHD-Dienst zu unterbinden. In der Konfigurationsdatei - /etc/denyhosts.confstehen folgende Codezeilen:

# BLOCK_SERVICE: the service name that should be blocked in HOSTS_DENY
#
# man 5 hosts_access for details
#
# eg.   sshd: 127.0.0.1  # will block sshd logins from 127.0.0.1
#
# To block all services for the offending host:  
BLOCK_SERVICE = ALL
# To block only sshd:
# BLOCK_SERVICE  = sshd

Wenn wir also die BLOCK_SERVICEVariable ALLwie oben einstellen , können wir unseren ssh-Dienst beobachten.

MathNoob
quelle
0

Denyhosts Version 3.0: Jedes Mal, wenn eine IP-Adresse in einer Protokolldatei angezeigt wird, öffnet Denyhosts die Datei hosts.deny und liest das Ganze so, dass es mit der Adresse übereinstimmt. Jedes Mal. Im Speicher ist nichts zwischengespeichert. Wenn Sie eine große hosts.deny-Datei haben und vielen Tests (vielen Protokolldateieinträgen) unterliegen, wird Denyhosts zu einem CPU-Hog, der die hosts.deny-Datei für jede angezeigte IP-Adresse liest und erneut liest. Nicht gut.

Wenn Sie die iptables-Unterstützung aktivieren, erstellt Denyhosts große, langsame Listen blockierter IP-Adressen. Denyhosts verwendet weder ipset noch nftables, um effiziente IP-Maps zu erstellen.

Ian D. Allen
quelle