Wie schützt man Ubuntu-Server vor Bruteforce-SSH-Angriffen?

21

Ich habe meine Passwörter gesichert, aber ich hörte Leute, die sich über die Leistung eines Servers beschwerten, der drastisch ausfällt, wenn ein Bruteforce-Angriff stattfindet. Wie kann ich meinen Ubuntu 10.10-Server vor solchen Angriffen schützen? Gibt es dafür ein Apparmor-Profil? Oder auf eine andere Art und Weise?

Dziamid
quelle

Antworten:

19

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 iptablesdie 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
Pedram
quelle
Wie melde ich mich bei einem Server mit deaktivierter Kennwortauthentifizierung an, wenn ich dann den öffentlichen Schlüssel verliere? (Ich habe keinen physischen Zugang zu einem Server, es ist ein VPS)
Dziamid
Der öffentliche Schlüssel kann überall veröffentlicht werden. Machen Sie sich keine Sorgen. Sie können ihn an einem Ort ablegen, an dem Sie sicher sind, dass Sie ihn auch an öffentlichen Orten nicht vergessen.
Pedram
Lesen Sie hier mehr: en.wikipedia.org/wiki/Public-key_cryptography
Pedram
Gibt es eine Möglichkeit, den Server so einzurichten, dass sein öffentlicher Schlüssel angezeigt wird, wenn Sie dazu aufgefordert werden?
Dziamid
1
Mit ssh glaube ich nicht. Wenn Sie einen Webserver wie Apache installiert haben, können Sie den Schlüssel über das Web freigeben.
Pedram
8

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.

DrSAR
quelle
1
Mein /var/log/auth.log ist in letzter Zeit erheblich gewachsen. Weist ein Eintrag wie dieser 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=rootauf einen Angriff hin?
Dziamid
1
Das bedeutet, dass jemand unter IP 218.15.136.38 versucht hat, sich als root anzumelden. Das hättest du sein können, aber wahrscheinlich nicht, weil ich mithilfe von tools.whois.net/whoisbyip sehe, dass diese IP in China registriert ist, was ziemlich weit von Minsk entfernt ist ;-) Also, ja, das scheint eine Vermutung deines Passworts zu sein . Moral: Deaktivieren Sie die Root-Anmeldung über ssh (PermitRootLogin no in / etc / ssh / sshd_config), da es keinen guten Grund gibt, dies zu belassen. Und dann denyhosts oder fail2ban in Betracht ziehen. Stellen Sie außerdem sicher, dass Sie eine Firewall haben, die nur den erforderlichen Zugriff über Port 22 und alle anderen benötigten
Komponenten
6
  1. Ändern Sie den sshd-Port in einen nicht standardmäßigen Port
  2. Wird knockdzur Implementierung eines Port-Knocking- Systems verwendet
  3. Verwenden Sie iptables ' recentund hashlimitÜbereinstimmungen, um aufeinanderfolgende SSH-Versuche zu begrenzen
  4. Verwenden Sie keine Passwörter, sondern stattdessen SSH-Schlüssel
pepoluan
quelle
3
-1 für den ersten Rat, kompliziert die Dinge für eigentlich keine echte Sicherheitserhöhung
steabert
Wenn Sie ssh-Schlüssel verwenden und die Kennwortauthentifizierung über ssh deaktivieren, benötige ich dann wirklich 1,2,3?
Dziamid
4
@steabert, es hilft gegen Script-Kiddies, die nur versuchen, sich durch Port 22 zu quälen. Das ist meine Erfahrung: Immer wieder wird ein mit dem Internet in Verbindung stehender Server bei der Einrichtung brachialisiert, und das System sendet mir Warnungen nach Warnungen. Ich habe den Hafen verlegt und die Warnungen sind abgeklungen.
Pepoluan
@Dziamid ssh-Schlüssel verhindern, dass jemand in Ihr System eindringt. Aber es hindert sie nicht daran, eine Verbindung zu Port 22
herzustellen
3
@ Dziamid Nein, nicht korrekt. Andere Authentifizierungsmethoden (RSAAuthentication, PubkeyAuthentication, #KerberosAuthentication usw.) stellen weiterhin eine Verbindung über Port 22 her.
DrSAR,
3

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

ddeimeke
quelle
Wie verbinde ich mich mit einem Server, wenn ich seinen öffentlichen Schlüssel verliere?
Dziamid
1
Nur über Konsole oder Direktzugriff. Ich bin mir ziemlich sicher, dass Sie Ihren Schlüssel nicht verlieren werden, wenn Sie einen Server verwalten können.
Ddeimeke
0

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.

bitwelder
quelle
0

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:

  • Sie müssen CSF als Firewall verwenden, damit LFD seine Aufgabe erfüllt. Wenn Sie also eine vorhandene Firewall haben, müssen Sie diese durch CSF ersetzen und Ihre Konfiguration übertragen.
  • Es ist nicht für Ubuntu gepackt. Sie müssen den automatischen Updates von configserver.com vertrauen oder die automatischen Updates deaktivieren.
  • Ich habe gehört, es ist sehr beliebt, so dass intelligente Eindringlinge wahrscheinlich wissen, wie sie die Eindringlingserkennung deaktivieren können, bevor sie erkannt werden!
joeytwiddle
quelle
0

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.

  1. Stellen Sie in / etc / ssh / sshd_config sicher, dass Sie nur mit einem SSH-Schlüssel eine Root-Anmeldung zulassen.

In meinen Systemen habe ich diese Einstellung

PermitRootLogin without-password

aber ich merke, in neueren Ubuntu haben sie

PermitRootLogin prohibit-password

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!

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

ALL: 127.0.0.1
sshd: 111.222.65.
sshdfwd-X11: 111.222.65.

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.

  1. Andere Posts hier schlugen vor, den öffentlichen SSH-Schlüssel nur für Ihre Benutzer zu verwenden. Das wird sicherlich helfen, zum Preis von Komplexität und Frustration für Ihre Benutzer. In unserem Labor gibt es 15 Computer. Benutzer wechseln zwischen Computern. Das Erfordernis der SSH-Schlüsselauthentifizierung würde einen großen Aufwand verursachen, da die Benutzer von einem Computer zum nächsten wechseln.

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)

  1. Wenn Sie den Server von der großen Welt aus für SSH offen lassen müssen, sollten Sie auf jeden Fall eine Zurückweisungsroutine verwenden, um Standorte zu blockieren, die häufig versuchen, sich einzuloggen. Es gibt dafür zwei nette Programme, die wir verwendet haben: denyhosts und fail2ban . Diese Programme verfügen über Einstellungen, mit denen Sie Täter für eine von Ihnen gewünschte Dauer sperren können.

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

pauljohn32
quelle