Frage Hunderte fehlgeschlagener SSH-Logins


Jede Nacht bekomme ich hunderte, manchmal tausende fehlgeschlagene ssh Logins auf meinem RedHat 4 Server. Aus Firewall-Gründen von entfernten Standorten muss ich auf dem Standard-Port laufen. Was soll ich tun, um das zu verhindern? Ich stelle fest, dass viele von derselben IP-Adresse kommen. Sollte es nicht nach einer Weile aufhören?


76
2018-06-02 16:18


Ursprung




Antworten:


Sie können iptables verwenden, um neue eingehende Verbindungen auf den SSH-Port zu begrenzen. Ich müsste Ihre gesamte iptables-Konfiguration sehen, um Ihnen eine schlüsselfertige Lösung zu geben, aber Sie sprechen im Grunde über das Hinzufügen von Regeln wie:

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 

Diese Regeln setzen voraus, dass Sie ESTABLISHED-Verbindungen früher in der Tabelle akzeptieren (so dass nur neue Verbindungen diese Regeln erfüllen). Neue SSH-Verbindungen treffen 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 fallen gelassen werden.

Das hat für mich gut funktioniert.

Edit: Ich bevorzuge diese Methode zu "fail2ban", weil keine zusätzliche Software installiert werden muss, und geschieht komplett im Kernel-Modus. Es behandelt nicht die Analyse von Protokolldateien wie "fail2ban", aber wenn Ihr Problem nur mit SSH auftritt, würde ich keinen Benutzermodus verwenden, der eine Softwareinstallation erfordert und komplexer ist.


63
2018-06-02 16:25



Ich mag diese Lösung, und ich plane, sie heute Abend zu installieren, sobald ich die heutigen Feuer ausbringe. - MattMcKnight
Es verlangsamt Angriffe und ich empfehle es, aber da es Botnets scannen gibt, ist es kein Allheilmittel. Es wird weiterhin ungültige Anmeldungen von Botnets geben, die verteilte Scans gegen Sie ausführen. Es gibt nicht wirklich viel, was man dagegen tun kann, abgesehen von irgendeinem "Port-Klopf" -System, um den SSH-Port aus der Ferne zu bringen, wenn man hinein will. - Evan Anderson
+1 für @ Evan's "Port Klopfen" Vorschlag. Einige Informationen: linux.die.net/man/1/knockd . Aber tue es nicht den man-Seitenweg (d. H. Das Hinzufügen / Löschen von iptables-Regeln), sondern benutze stattdessen -m condition Iptables passen stattdessen zusammen. - pepoluan
brauchst du --dport 22 in diesen Regeln, so dass sie nur für ssh-Traffic gelten? - clime
@ clime - Ja. Kaum zu glauben, dass das hier 2 1/2 Jahre her ist und niemand es bemerkt hat! Guter Fang. - Evan Anderson


fail2ban kann dabei helfen, IP-Adressen mit zu vielen fehlgeschlagenen Anmeldeversuchen zu blockieren.


38
2018-06-02 16:20



Ich mag nicht Tools / Skripte Protokolle lesen und Befehle im Namen des Benutzers sysadmin ausgeben - asdmin
@asdmin, ja, besonders wenn sie habe so eine schöne Erfolgsbilanz ... - maxschlepzig


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 tun können, würde ich etwas wie DenyHosts empfehlen.

http://denyhosts.sourceforge.net/

Tolles Paket, einfach zu installieren und zu konfigurieren.


25
2018-06-02 17:16



Ich weiß nicht, warum die Leute das auffrischen; SSH befindet sich auf einem Standard-Port 22. Das bedeutet, dass Sie sich in einem fremden Netzwerk nicht darauf verlassen, dass sie einen nicht standardmäßigen Port über die ausgehende Firewall geöffnet haben. Die tatsächliche Lösung für dieses Problem ist oben dokumentiert. Beschränken Sie die Anzahl der Wiederholungsverbindungen über Ihre eingehende Firewall oder deaktivieren Sie die Kennwortanmeldung. - Andrew Taylor
OpenSSH 6.7 fällt ab tcpwrappers Unterstützung, das ist, was denyhosts benutzt. - Zoredache


Während es nett sein kann, von beliebigen Orten im Internet aus in Ihr System zu gelangen, gibt es automatische Passwort-Angriffssysteme, die auf einen offenen SSH-Port zugreifen und verschiedene Joe- Account- und Wörterbuch-Angriffe auf Ihr System anwenden. Dies kann dazu führen, dass Sie Ihre nächtliche Protokollübersicht einlesen und Ihre Bandbreite verschwendet wird.

Wenn Sie einen Web-Server auf demselben System haben, können Sie php- und tcp-Wrapper verwenden, um eingehenden ssh-Datenverkehr auf bekannte Systeme einzuschränken und Ihnen einen Hintertür-Schlüssel zu geben, mit dem Sie von beliebigen Systemen im Internet aus zugreifen können.

Hier ist, wie Sie es tun:

Verweiße alle SSH-Verbindungen in /etc/hosts.deny:

# /etc/hosts.deny fragment
sshd:  all

Erlaube bekannten Systemen per 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 geben Sie ihr 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 woanders geklaut, also könnte er wahrscheinlich einen ganzen Haufen sauber machen. Es fügt nur die IP-Adresse des Systems hinzu, das auf die Datei /etc/hosts.allow.temporary-sshd-access zugreift, die von sshd (aufgrund seiner Aufnahme durch /etc/hosts.allow) zur Verbindungszeit gelesen wird .

Wenn Sie jetzt an einem beliebigen System im Web arbeiten und SSH an dieses System senden möchten, verwenden Sie zuerst 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, in Ihr System einzusteigen. Wenn Sie sich an einer Stelle befinden, von der aus Sie wahrscheinlich häufig ssh-in sind, wäre 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.


15
2018-06-02 17:07



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, gibt es nichts, was ein potenzieller Sniffer ausspionieren könnte. 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 (deins). Ich denke nicht, dass es auf die eine oder andere Weise 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 bereitstellt, aber Ihre direkte Verbindung zum Internet über einen anderen Ausgang besteht. - Andrew Taylor
OpenSSH 6.7 fällt ab tcpwrappers Unterstützung, was in deiner Antwort verwendet wird. - Zoredache


Vielleicht möchten Sie sich das ansehen denyhosts auch.

Zu Ihrer Information: OpenSSH 6.7 fällt ab tcpwrappers UnterstützungDas bedeutet, dass denyhosts wahrscheinlich nicht die Lösung für neue Installationen ist.


9
2018-06-02 16:23





Tun Sie sich einen Gefallen und deaktivieren Sie die Passwortanmeldung. Verwenden Sie ausschließlich Authentifizierungsschlüssel (google ssh-keygen zum Beispiel - Beispiel: http://www.puddingonline.com/~dave/publications/SSH-with-Keys-HOWTO/document/html/SSH-with-Keys-HOWTO-4.html ) Ihr Server wird sicherer sein, Sie werden sich komfortabler mit ihm verbinden (überprüfen Sie ssh-agent, ssh-add, keychain) und Sie werden nicht mehr Opfer von SSH-Brute-Force-Angriffen sein.


8
2017-08-17 22:08





Eine andere Lösung ist einfach ssh zu einem anderen Port zu bewegen. diese Würmer sind ziemlich dumm.


2
2018-06-02 16:28



Das ursprüngliche Poster sagte, er müsse auf dem Standard-Port laufen. - kbyrd
Entschuldigung, ich muss die Fragen genauer lesen :) - disserman
Ich muss zustimmen ... Ich habe meine SSH auf "alternative" Ports laufen und es macht eine Welt der Unterschied in den Protokollen. Die Würmer sind ungefähr so ​​schlau wie ein Stein, also funktioniert es gut gegen dumme Automatisierungsskripte; nicht so gut gegen menschliche Angreifer. Dennoch haben die Logs das gesegnete Geräusch von Stille in ihnen... - Avery Payne


Eine andere Option könnte sein, zu verlangen, dass alle ssh-Verbindungen durch ein Zertifikat verifiziert werden und Passwörter vollständig wegfallen.

Ich benutze Denyhosts, aber ich stellte fest, dass ich nur von einer Handvoll von Orten aus regelmäßig eine Verbindung herstellte, also blockierte ich alle Port-22-Verbindungen, außer von irgendwo anders, und benutze Port-Klopfen, um mich von überall aus mit meinem Laptop verbinden zu können .


2
2018-06-03 00:51





Jede Lösung, bei der IPs nach mehreren Ausfällen automatisch blockiert werden, führt zu einem Risiko von Denial-of-Service-Angriffen. Solange es eine gute Passwortrichtlinie gibt, um die Effektivität von Brute-Force-Angriffen oder Wörterbuchangriffen zu reduzieren, würde ich mir nicht allzu viele Sorgen um sie machen.

Wenn Sie die Benutzer / Gruppen nur auf diejenigen beschränken, denen es erlaubt ist, sich zuerst anzumelden, und die Anmeldung als root deaktivieren, sollten Sie mehr als sicher genug sein. Und wenn das nicht ausreicht, gibt es immer eine schlüsselbasierte Authentifizierung.


1
2018-06-02 17:03





Ehrlich gesagt, wenn Sie SSH (und Port 22) ausführen müssen, können Sie diese nicht vermeiden. Wenn Sie Passwörter akzeptieren müssen, sind Sie in noch schlechterer Verfassung.

Am besten konfigurieren Sie Ihre Log-Analysesoftware, um die SSH-Protokolle auszuschließen. Führen Sie dann eine separate Instanz aus, um nur SSH-Protokolle anzuzeigen, und verwenden Sie procmail, um die fehlgeschlagenen Versuche herauszufiltern. Sie können sogar Skripts schreiben, um nach erfolgreichen Versuchen mit mehreren erfolglosen Anmeldungen nach IP-Adressen zu suchen.

Es gibt keine Möglichkeit, Menschen daran zu hindern, Ihren SSH-Server zu untersuchen. Denyhosts, fail2ban und das iptables-Beispiel funktionieren bis zu einem gewissen Punkt, allerdings mit der zusätzlichen Gefahr, dass legitime Benutzer versehentlich blockiert werden. Die beste Methode besteht darin, den Prozess zu protokollieren und den Protokollanalyseprozess zu automatisieren, um die Zeit zu reduzieren, die Sie darüber nachdenken müssen.


1
2017-08-17 22:51