Es gibt verschiedene Lösungen. Die beste Methode ist die Verwendung der RSA-Authentifizierung, bei der Benutzer mit öffentlichen / privaten Schlüsseln authentifiziert werden.
In diesem Handbuch finden Sie verschiedene Ansätze (einschließlich RSA-Authentifizierung): http://www.la-samhna.de/library/brutessh.html
Ich verwende die dritte Lösung auf meinem Server, weil ich es meinen nicht-technischen Benutzern nicht erschweren möchte: indem ich iptables
die Anzahl der Verbindungen pro Minute beschränke, die Bruteforce-Angriffe ineffizient und ineffektiv machen.
Hier ist die Lösung, die ich verwende:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j LOG --log-prefix "SSH_brute_force "
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP
Wie hier erwähnt : Damit können innerhalb von 60 Sekunden drei Port 22-Verbindungen von einer bestimmten IP-Adresse hergestellt werden. Es sind 60 Sekunden ohne weitere Verbindungsversuche erforderlich, bevor erneut Verbindungen zugelassen werden. Die Option --rttl berücksichtigt auch die TTL des Datagramms, wenn Pakete abgeglichen werden, um zu versuchen, gegen gefälschte Quelladressen vorzugehen.
Wie im erwähnten Handbuch angegeben, ist es besser, eine Whitelist zu verwenden, um vertrauenswürdige Benutzer von diesen Regeln zu trennen:
iptables -N SSH_WHITELIST
Fügen Sie dann vertrauenswürdige Hosts hinzu:
iptables -A SSH_WHITELIST -s $TRUSTED_HOST -m recent --remove --name SSH -j ACCEPT
und danach die Regeln machen:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j SSH_WHITELIST
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j ULOG --ulog-prefix SSH_brute_force
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP
Ich bekomme Brute-Force-SSH-Angriffe auf meine Server mit einer Rate von 1 bis 2 pro Tag. Ich habe denyhosts installiert (Ubuntu-Paket: denyhosts). Zu diesem Zweck ist es ein sehr einfaches, aber effektives Tool: Im Wesentlichen werden Ihre Protokolle regelmäßig auf Brute-Force-Angriffe überprüft und IP-Adressen, von denen diese Angriffe ausgehen, in Ihre Datei /etc/hosts.deny kopiert. Sie werden nicht mehr von ihnen hören und Ihre Belastung sollte erheblich reduziert werden. Es ist über die Konfigurationsdatei /etc/denyhosts.conf sehr konfigurierbar, um Probleme wie die Anzahl der falschen Versuche, die einen Angriff auslösen, usw. zu optimieren.
Aufgrund seiner transparenten Funktionsweise können Sie leicht sehen, was gerade passiert (E-Mail-Benachrichtigung: "Aha, ein weiterer verhängnisvoller Angriff wurde vereitelt!") Und Fehler rückgängig machen, wenn Ihre Benutzer ihre Passwörter wiederholt falsch eingeben.
Natürlich gilt alles, was zuvor über den Wechsel zu anderen Authentifizierungsmethoden gesagt wurde, aber manchmal stimmen Ihre Anforderungen nicht mit denen Ihrer Benutzer überein.
Außerdem ist die Beschränkung der neuen Verbindungsrate in iptables möglicherweise die bessere Wahl, als den Zugriff über hosts.deny zu verweigern. Schauen Sie sich also auch fail2ban an. Wenn Sie jedoch wissen, dass ssh brute-force Ihr Hauptanliegen ist (schauen Sie manuell in /var/log/auth.log nach, um dies zu ermitteln), wählen Sie dieses sehr einfache und wirkungsarme Tool.
quelle
Mar 27 10:28:43 smartfood sshd[17017]: Failed password for root from 218.15.136.38 port 33119 ssh2 Mar 27 10:28:47 smartfood sshd[17019]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=218.15.136.38 user=root
auf einen Angriff hin?knockd
zur Implementierung eines Port-Knocking- Systems verwendetrecent
undhashlimit
Übereinstimmungen, um aufeinanderfolgende SSH-Versuche zu begrenzenquelle
Zunächst sollten Sie überlegen, keine Passwörter zu verwenden und stattdessen Schlüssel zu verwenden. Es ist nicht erforderlich, ein Passwort zu verwenden. Wenn dies für Sie funktioniert, können Sie den OpenSSH-Server so konfigurieren, dass er nicht auf Kennwortanmeldungen reagiert.
https://help.ubuntu.com/10.04/serverguide/C/openssh-server.html
Die Verwendung von fail2ban könnte ebenfalls eine Option sein.
https://help.ubuntu.com/community/Fail2ban
quelle
Wie weit ist der Server im Netzwerk ausgesetzt? Vielleicht können Sie mit dem Netzwerkadministrator sprechen und prüfen, ob der Netzwerkzugriff auf den Server überwacht und eingeschränkt werden kann. Selbst wenn die Kontoanmeldungen sicher sind, könnte der Server unter einfachen DoS / DDoS-Angriffen leiden.
quelle
Eine Alternative zu fail2ban ist CSF: ConfigServer Security & Firewall .
Es wird mit LFD geliefert: einem Login Failure Daemon, der mehrere fehlgeschlagene Anmeldeversuche für verschiedene Dienste erkennt und die anstößige IP-Adresse (vorübergehend oder dauerhaft) blockiert.
Es gibt einige andere Optionen, die gegen Flutangriffe helfen und möglicherweise Einbrüche erkennen können.
Nachteile:
quelle
Beabsichtigen Sie, der Welt den SSH-Dienst zu erlauben? Oder nur um Teammitglieder an bestimmten Orten? Meine Antwort hängt ein wenig von der Schwere Ihrer Herausforderung ab.
In beiden Fällen sollten Sie sicherstellen, dass der SSH-Server keine Kennwortanmeldungen für den Root-Benutzer zulässt.
In meinen Systemen habe ich diese Einstellung
aber ich merke, in neueren Ubuntu haben sie
Wenn Sie "man sshd_config" lesen, dann bedeutet dies, dass dieses neuere "prohibit-password" dasselbe bedeutet und seine Bedeutung sicherlich offensichtlicher ist. Das ist auf einigen Linux-Systemen NICHT die Standardeinstellung, sollte es aber wahrscheinlich sein.
Nun zu deinem Problem. Unterstützt Ihr System Server nur einige Benutzer an bestimmten Orten? Mach das!
editiere /etc/hosts.deny und füge ein
ALLES ALLES
Bearbeiten Sie dann /etc/hosts.allow und listen Sie die IP-Nummern oder einen Bereich auf, der die Verwendung von SSH zulassen soll. Die Notation dort ist etwas verwirrend, denn wenn Sie alle Systeme mit IP-Nummern wie 111.222.65.101 bis 111.222.65.255 zulassen möchten, fügen Sie einen Eintrag wie diesen in hosts.allow ein
Das ist eine schlagkräftige Lösung. Wenn Ihre Benutzer nach IP-Bereich aufgelistet werden können, tun Sie es!
Diese Lösung gab es vor der Erstellung von IP-Tabellen, sie ist (meiner Meinung nach) viel einfacher zu verwalten, aber nicht so gut wie eine IP-Tabellen-Lösung, da IP-Tabellen-Routinen Feinde früher erkennen als die von hosts.allow und hosts gesteuerten Programme .verweigern. Dies ist jedoch eine sichere und einfache Möglichkeit, viele Probleme zu beseitigen, nicht nur bei SSH.
Beachten Sie das Problem, das Sie selbst erstellen. Wenn Sie einen FTP-Server, einen Webserver oder etwas anderes eröffnen möchten, müssen Sie Einträge in Hosts zulassen.
Sie können denselben grundlegenden Zweck erreichen, indem Sie mit iptables und der Firewall spielen. In gewisser Hinsicht ist dies eine bevorzugte Lösung, da Sie Gegner an der Außengrenze blockieren. Ubuntu hat "ufw" (unkomplizierte Firewall) und "man ufw" hat viele Beispiele. Ich hätte lieber eine nette Benutzeroberfläche, um das durchzuarbeiten, ich muss das nicht die ganze Zeit tun. Vielleicht können uns andere sagen, ob es jetzt eine gibt.
Eine weitere Quelle der Frustration tritt auf, wenn einige Benutzer unterschiedliche SSH-Schlüssel für verschiedene Server sammeln. Da ich SSH-Schlüssel für ungefähr 12 verschiedene Projekte habe, schlägt ssh jetzt fehl, weil ich zu viele öffentliche Schlüssel habe (entweder "ssh -o PubkeyAuthentication = false" oder die Erstellung eines Eintrags in der .ssh / config-Datei erforderlich. Es ist eine PITA)
In unseren Centos Linux-Systemen ist mir aufgefallen, dass sie das Denyhosts-Paket verworfen haben und nur Fail2Ban anbieten. Ich mochte Denyhosts, weil es eine Liste von problematischen Benutzern / IP-Bereichen aufbaute und diese Liste dann in hosts.deny notiert wurde. Wir haben stattdessen fail2ban installiert und es ist OK. Ich verstehe, dass Sie diese schlechten Benutzer lieber am äußeren Rand des Servers blockieren möchten, daher sind die IP-Tabellen-basierten Blocker wie fail2ban tatsächlich besser. Denyhosts arbeitet auf der sekundären Ebene, nachdem die Gegner die Iptables überschritten haben, werden sie vom sshd-Daemon zurückgewiesen.
In beiden Programmen ist es etwas mühsam, Benutzer aus dem Gefängnis zu holen, wenn sie ihr Passwort vergessen und sich ein paar Mal anzumelden. Es ist etwas schwierig, die Benutzer wieder einzuladen, wenn sie Anmeldefehler machen. Sie hätten gedacht, es gäbe eine Point-and-Click-Benutzeroberfläche, auf der Sie einfach zeigen und die Leute wieder hereinlassen könnten, aber das ist nicht der Fall. Ich muss das nur alle paar Monate machen und zwischenzeitlich vergessen, also habe ich Anweisungen für mich auf meiner Webseite http://pj.freefaculty.org/blog/?p=301 geschrieben
quelle