DenyHosts ist ein in Python geschriebenes, log-basiertes Intrusion Prevention System für SSH-Server. Es wurde mit der Absicht geschrieben, Brute force-Attacken auf SSH-Server durch das Loggen und Aufspüren ungültiger Logins zu verhindern und die Quell-IP-Adressen zu blockieren.
Denyhosts ist eine einfache, aber effektive Möglichkeit um Hacker davor zu hindern einen Brute Force Attacke zu starten und alle möglichen Passwörter zu probieren, ist aber leider bei den Linux Distributionen nicht vorinstalliert. Nachinstallieren kann man z.B. durch Eingabe von
sudo apt-get install denyhosts
oder eine Installation mittels des Sourcecodes.
Als Service kümmert sich DenyHosts um das Management fehlgeschlagener SSH Loginversuche - probiert eine IP Adresse mehrere male eine falsche Benutzer- und Passwortkombination, dann wird sie für eine bestimmte Zeit gesperrt. Zugriff auf SSH ist von dieser IP Adresse dann einige Zeit nicht mehr möglich. Ein nettes Extra ist auch eine Email mit einer Auswertung aller gesperrten Adressen und Hosts an den Administrator, der so erkennen kann, woher die Bedrohung kommt.
Basierend auf einer Konfigurationsdatei loggt Denyhosts fehlgeschlagene Login Versuche mit. Sollte von einer IP Adresse zu oft ein falscher Login versucht werden, dann wird diese Adresse in die /etc/hosts.deny Datei eingetragen. Allen dort registrierten Adressen wird der Zugriff auf den dort angegebenen Service (in diesem Fall sshd) verweigert. Je nach Konfiguration des Service werden IP Adressen nach einiger Zeit dort auch wieder entfernt.
Konfiguration
Die Konfiguration erfolgt über eine einzelne Konfigurationsdatei - /etc/denyhosts.conf. Diese bearbeitet man am besten mit dem Texteditor:
nano /etc/denyhosts.conf
Man kann die Datei aber auch mit seinem gewohnten Texteditor (z.B. UltraEdit - nicht WordPad!) bearbeiten und dann per SSH hochladen. Dazu bietet sich WinSCP - SCP/FTP/SFTP Client an.
Die Datei ist sehr gut dokumentiert (allerdings englisch) - mit einer falschen Einstellung kann man sich selbst den Zugang zum Server entziehen. Folgende Parameter sind für von Bedeutung und sollten sorgfälltig bearbeitet werden:
- PURGE_DENY
legt fest, nach welcher Zeit eine gesperrte IP Adresse wieder einen Login Versuch unternehmen darf. Standardmäßig ist hier kein Wert festgelegt, weshalb eine gesperrte IP Adresse nie wieder Zugriff bekommt. Es ist ratsam, einen Wert von beispielsweise 1w (für eine Woche) festzulegen. Sollte man sich aussperren kann man dann in 7 Tagen wieder den Login probieren. Nach Ablauf der Zeit wird die gesperrte IP Adresse wieder aus der /etc/hosts.deny Datei entfernt. - DENY_THRESHOLD_INVALID
legt fest, wie oft man mit einem im System nicht vorhandenen Benutzer ein Login versuchen darf (Ausnahme root). Das ist der wichtigste Wert, denn im Normalfall kennt ein Angreifer den Benutzernamen nicht (ausser root) und wird alle möglichen Kombinationen probieren. Ein Wert von 3-5 ist sinnvoll. - DENY_THRESHOLD_VALID
legt fest, wie oft man bei einem im System vorhandenen Benutzer das falsche Passwort eingeben darf. Der Wert ist meist höher eingestellt, da man sich bei Passwörtern gerne vertippen kann. Ist dann noch die Umschalttaste festgestellt, kann man schnell 5 oder mehr Versuche machen bevor man das merkt. Ein Wert von 5-10 macht Sinn. - DENY_THRESHOLD_ROOT
legt fest, wie oft man beim Benutzer root das falsche Passwort probieren darf. Es ist Ratsam den Wert recht niedrig zu setzen. Da ohnehin der root Login deaktiviert sein sollte, ist 1 eine sinnvolle Einstellung. - ADMIN_EMAIL
wer einen Bericht erhalten möchte, kann noch die eigene Email Adresse angeben.
Nach dem Speichern der Datei werden die Änderungen erst nach einem Neustart des Services aktiv. Das erreicht man mit dem folgenden Befehl:
service denyhosts restart
Mit einem geringen Aufwand kann man also den SSH Login mit Denyhosts drastisch sicherer machen. Brute Force Angriffe werden praktisch komplett unterbunden. Probiert ein Angreifer zu oft ein falsches Login, wird er für eine längere Zeit gesperrt und erhält keinen Zugriff mehr auf den SSH Login.