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?

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.


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


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.


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


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.


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



2

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


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 .


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.


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.


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.


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).



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 :)


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.