Hunderte fehlgeschlagene SSH-Anmeldungen

81

Jede Nacht erhalte ich Hunderte, manchmal Tausende von fehlgeschlagenen SSH-Anmeldungen auf meinem RedHat 4-Server. Aus Firewall-Gründen von entfernten Standorten muss ich auf dem Standard-Port laufen. Sollte ich irgendetwas tun, um dies zu blockieren? Ich stelle fest, dass viele von derselben IP-Adresse stammen. Sollte es nicht nach einer Weile aufhören?

MattMcKnight
quelle

Antworten:

67

Sie können iptables verwenden, um die Rate neuer eingehender Verbindungen zum SSH-Port zu begrenzen. Ich müsste Ihre gesamte iptables-Konfiguration anzeigen, um eine schlüsselfertige Lösung zu erhalten, aber im Grunde geht es darum, Regeln wie die folgenden hinzuzufügen:

iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 5 --name SSH --rsource -j DROP 
iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH --rsource -j ACCEPT 

Bei diesen Regeln wird davon ausgegangen, dass Sie zuvor in der Tabelle HERGESTELLTE Verbindungen akzeptieren (sodass nur neue Verbindungen diese Regeln erfüllen). Neue SSH-Verbindungen erfüllen diese Regeln und werden markiert. In 60 Sekunden führen 5 Versuche von einer einzelnen IP-Adresse dazu, dass neue eingehende Verbindungen von dieser IP-Adresse getrennt werden.

Das hat bei mir gut funktioniert.

Edit: Ich bevorzuge diese Methode gegenüber "fail2ban", da keine zusätzliche Software installiert werden muss und dies komplett im Kernel-Modus geschieht. Es verarbeitet keine Parsing-Protokolldateien wie "fail2ban", aber wenn Ihr Problem nur bei SSH liegt, würde ich keinen Benutzermodus verwenden, der eine Softwareinstallation erfordert und komplexer ist.

Evan Anderson
quelle
1
Ich mag diese Lösung und ich plane, sie heute Abend einzuführen, sobald ich die heutigen Feuer gelöscht habe.
MattMcKnight
2
Es verlangsamt Angriffe und ich empfehle es, aber da es verteilte Scan-Botnets gibt, ist es kein Allheilmittel. Botnets, die verteilte Scans gegen Sie durchführen, melden sich weiterhin ungültig an. Es gibt nicht wirklich viel, was Sie dagegen tun können, abgesehen von einer Art "Port-Knocking" -Schema, um den SSH-Port aus der Ferne zu aktivieren, wenn Sie einsteigen möchten.
Evan Anderson,
1
+1 für @ Evans "Port Knocking" -Vorschlag. Einige Infos: linux.die.net/man/1/knockd . Tun Sie dies jedoch nicht auf Manpage-Art (dh Hinzufügen / Löschen von iptables-Regeln), sondern verwenden Sie stattdessen -m conditioniptables match.
Pepoluan
2
Brauchen Sie nicht --dport 22 in diesen Regeln, damit sie nur für SSH-Verkehr angewendet werden?
Clime
2
@Clime - Ja. Kaum zu glauben, dass dies schon 2 1/2 Jahre her ist und niemand es bemerkt hat! Guter Fang.
Evan Anderson
39

fail2ban kann hier Abhilfe schaffen, indem IP-Adressen mit zu vielen fehlgeschlagenen Anmeldeversuchen blockiert werden.

Kyle Brandt
quelle
11
Ich mag
keine
2
@asdmin, ja, vor allem, wenn sie eine so schöne
Erfolgsgeschichte
25

Ich würde empfehlen, einen Nicht-Standard-Port für SSH zu verwenden, wenn Sie können (dh Port 10222), aber da Sie erwähnt haben, dass Sie das nicht können, würde ich empfehlen, etwas wie DenyHosts zu verwenden.

http://denyhosts.sourceforge.net/

Tolles Paket, einfach zu installieren und zu konfigurieren.

KPWINC
quelle
6
Ich weiß nicht, warum die Leute das befürworten. SSH befindet sich an einem Standard-Port 22. Dies bedeutet, dass Sie sich in einem fremden Netzwerk nicht darauf verlassen müssen, dass diese einen nicht standardmäßigen Port über die ausgehende Firewall öffnen. Die wirkliche Lösung für dieses Problem ist oben dokumentiert. Beschränken Sie entweder die Anzahl der wiederholten Verbindungen über Ihre eingehende Firewall oder deaktivieren Sie die Kennwortanmeldungen.
Andrew Taylor
1
OpenSSH 6.7 setzt die Unterstützung von tcpwrappers außer Kraft , was denyhosts nutzt.
Zoredache
15

Es mag zwar schön sein, von beliebigen Orten im Internet aus in Ihr System zu sshen, aber es gibt automatisierte Passwortangriffssysteme, die sich auf einen offenen ssh-Port verriegeln und verschiedene Angriffe von Joe-Konten und -Wörterbüchern auf Ihr System anwenden. Dies kann ärgerlich sein, wenn Sie Ihre nächtliche Protokollzusammenfassung lesen, und ist eine Verschwendung Ihrer Bandbreite.

Wenn Sie einen Webserver auf demselben System haben, können Sie den eingehenden SSH-Datenverkehr mit PHP- und TCP-Wrappern auf bekannte Systeme beschränken und Ihnen einen Hintertürschlüssel geben, mit dem Sie von beliebigen Systemen aus auf das Internet zugreifen können.

So machst du es:

lehne alle ssh-Verbindungen in /etc/hosts.deny ab:

# /etc/hosts.deny fragment
sshd:  all

Erlaube bekannte Systeme nach IP in /etc/hosts.allow und füge eine Datei für den temporären Zugriff hinzu:

# /etc/hosts.allow fragment
sshd:  10.0.10.2     # some system
sshd:  172.99.99.99  # some other system
sshd:  /etc/hosts.allow.temporary-sshd-access

Erstellen Sie eine PHP-Datei auf Ihrem Webserver und vergeben Sie einen nicht offensichtlichen Namen wie my-sshd-access.php:

<?php
function get_ip()
{
    return getenv("REMOTE_ADDR"); 
}

?>

<?php
$out='/etc/hosts.allow.temporary-sshd-access';
$log='/var/log/sshd-access-addition-log';

print "Was:";
readfile($out);
print "<br>";
$ip=get_ip();
$fp=fopen($out,"w");
fputs($fp,$ip);
fclose($fp);

$lfp=fopen($log,"a");
fputs($lfp,$ip);
fputs($lfp,"n");
fclose($lfp);

print "Wrote: ";
readfile($out);
?>

Verzeihen Sie den PHP-Code - ich habe ihn von einem anderen Ort geklaut, damit er wahrscheinlich aufgeräumt werden kann. Es wird lediglich die IP-Adresse des Systems hinzugefügt, das auf die Datei /etc/hosts.allow.temporary-sshd-access zugreift, die von sshd (aufgrund der Einbeziehung von /etc/hosts.allow) zum Zeitpunkt der Verbindung gelesen wird .

Wenn Sie sich an einem beliebigen System im Web befinden und auf dieses System zugreifen möchten, verwenden Sie zunächst einen Webbrowser und klicken Sie auf diese Datei (oder verwenden Sie wget oder equivilent):

$ wget http://your.system.name/my-sshd-access.php

Jetzt sollten Sie in der Lage sein, sich in Ihr System einzuschalten. Wenn Sie wahrscheinlich von hier aus häufig auf diese Website zugreifen, ist es trivial, den Inhalt der Datei /etc/hosts.allow.temporary-sshd-access zu lesen und die IP-Adresse dauerhaft zu / etc / hosts hinzuzufügen. ermöglichen.

David Mackintosh
quelle
Um dies sicherer zu machen, führen Sie diese Seite unter https aus.
Robert Munteanu
Wenn Sie das Skript so ändern, dass es den Inhalt der Datei "Erlaubte temporäre IP-Adresse" nicht ausgibt, kann ein angehender Sniffer nichts riechen. Dann können Sie es auf http anstelle von https ausführen.
Barry Brown
Die "erlaubte temporäre IP-Adresse" ist immer die des Anforderers (dh Ihre). Ich denke nicht, dass es so oder so wichtig ist. Https bedeutet, dass die angeforderte URL verschlüsselt ist, was bedeutet, dass es nicht trivial ist, sie von der Leitung zu schnüffeln.
David Mackintosh
Dies funktioniert nicht, wenn Sie sich in einem Netzwerk befinden, das HTTP-Verbindungen vermittelt, Ihr direkter Zugang zum Internet jedoch über einen anderen Ausgang erfolgt.
Andrew Taylor
In OpenSSH 6.7 wird die Unterstützung von tcpwrappers eingestellt. Dies wird in Ihrer Antwort verwendet.
Zoredache
8

Tun Sie sich selbst einen Gefallen und deaktivieren Sie die Passwortanmeldung. Verwenden Sie ausschließlich Authentifizierungsschlüssel (z. B. google ssh-keygen - Beispiel: http://www.puddingonline.com/~dave/publications/SSH-with-Keys-HOWTO/document/html/SSH-with-Keys-HOWTO-4 .html ) Ihr Server ist sicherer, Sie stellen eine bequemere Verbindung her (überprüfen Sie ssh-agent, ssh-add, keychain) und Sie sind nicht mehr Opfer von ssh-Brute-Force-Angriffen.

Manu
quelle
2

eine andere lösung ist, ssh einfach auf einen anderen port zu verschieben. Diese Würmer sind ziemlich dumm.

Disserman
quelle
3
Auf dem Originalposter stand, dass er auf dem Standardport laufen musste.
kbyrd
1
Entschuldigung, ich muss die Fragen genauer lesen :)
Disserman
1
Ich muss zustimmen ... Ich habe mein SSH auf "alternativen" Ports laufen und es macht einen WELTWEITEN Unterschied in den Protokollen. Die Würmer sind so schlau wie ein Ziegelstein, daher funktioniert es gut gegen dumme Automatisierungsskripte. nicht so gut gegen menschliche Angreifer. Dennoch haben die Protokolle den gesegneten Klang der Stille in sich ...
Avery Payne
..es ist nicht, dass die Bots "dumm" sind, es ist, dass sie für niedrig hängende Früchte suchen. Das Verschieben des SSH-Ports erfolgt also wie folgt: Halten Sie Ihre Früchte vom Boden fern.
Elrobis
2

Eine andere Möglichkeit könnte sein, dass alle SSH-Verbindungen durch ein Zertifikat überprüft werden müssen und Passwörter ganz wegfallen.

Früher habe ich Denyhosts verwendet, aber ich habe festgestellt, dass ich nur eine Handvoll von Orten aus regelmäßig eine Verbindung hergestellt habe. Daher habe ich alle Verbindungen von Port 22 blockiert, außer von einem anderen Ort, und Port-Knocking verwendet, damit ich mich von überall mit meinem Laptop verbinden kann, wenn ich muss .

Evan
quelle
1

Jede Lösung, bei der IP-Adressen nach mehreren Ausfällen automatisch blockiert werden, birgt das Risiko von Denial-of-Service-Angriffen. Solange es eine gute Passwortrichtlinie gibt, um die Effektivität von Brute-Force- oder Wörterbuchangriffen zu verringern, würde ich mir keine allzu großen Sorgen machen.

Wenn Sie die Benutzer / Gruppen auf diejenigen beschränken, denen das Anmelden als erstes gestattet werden soll, und die Anmeldung als Root deaktivieren, sollten Sie mehr als sicher sein. Und wenn das nicht ausreicht, gibt es immer eine schlüsselbasierte Authentifizierung.

goldPseudo
quelle
1

Ehrlich gesagt, wenn Sie SSH (und auf Port 22) ausführen müssen, können Sie diese nicht vermeiden. Wenn Sie Passwörter akzeptieren müssen, geht es Ihnen noch schlechter.

Am besten konfigurieren Sie Ihre Protokollanalyse-Software so, dass die SSH-Protokolle ausgeschlossen werden. Führen Sie dann eine separate Instanz aus, um nur SSH-Protokolle anzuzeigen, und verwenden Sie procmail, um die erfolglosen Versuche herauszufiltern. Sie können sogar Skripts schreiben, um nach erfolgreichen Anmeldungen von IP-Adressen mit mehreren erfolglosen Versuchen zu suchen.

Es gibt keine Möglichkeit, andere daran zu hindern, Ihren SSH-Server zu untersuchen. Denyhosts, fail2ban und das Beispiel iptables funktionieren bis zu einem gewissen Punkt, jedoch mit der zusätzlichen Gefahr, dass legitime Benutzer versehentlich blockiert werden. Am besten saugen Sie es auf und versuchen, den Protokollanalyseprozess zu automatisieren, um die Zeit zu verkürzen, die Sie zum Nachdenken benötigen.


quelle
0

Wenn Sie sagen, dass Sie Fehler beim Anmelden auf Ihrem Red Hat-Server haben, welche Art von Firewall befindet sich dahinter und wie viele Personen müssen sich einloggen? Ich schlage vor, wenn Sie können, die Anzahl der Firewall-Versuche zu begrenzen, bevor sie in die Nähe Ihres eigentlichen Servers gelangen.

Wenn Sie den Bereich der IP-Adressen einschränken können, die zu Recht Zugriff benötigen, sollten Sie in der Lage sein, eine Zugriffsliste an der Firewall einzurichten. Wenn Sie den Datenverkehr an der Firewall einschränken können, sollten Sie sich ein Netzwerk-Intrusion-System ansehen, da der Eindruck entsteht, dass Ihr Server von etwas angegriffen wird.


quelle
0

Die meisten Webhosts verwenden APF + BFD , um fehlgeschlagene SSH-Anmeldungen zu blockieren. Heutzutage gibt es CSF (Configserver Firewall), das ein Tool namens LFD enthält, das das Gleiche tut, und vieles mehr, einschließlich der Blockierung von IPs aus bestimmten Ländern, auf die Sie keinen Zugriff haben möchten (z. B. Korea, China usw., wo 99% meiner SSH-Tests ausgeführt werden scheinen zu stammen von).

gbjbaanb
quelle
0

Ive, das mit fail2ban und es hat viel mir geholfen werden.

tehjay
quelle
0

Wenn Sie dieses Problem auf mehreren Hosts beheben müssen, lesen Sie möglicherweise OSSEC: http://www.ossec.net/main/ossec-architecture

Auf diese Weise können Sie mehrere Agenten an einem zentralen Ort konfigurieren, um automatisch auf Brute-Force-Angriffe zu reagieren (zusammen mit allen anderen Mustern, die Sie aus Protokollen extrahieren können).

Sehr schönes Stück Software :)


quelle