Wie härtet man einen SSH-Server ab?


128

Welche Maßnahmen kann / sollte ich ergreifen, um sicherzustellen, dass die Sicherheit rund um meinen SSH-Server absolut undurchlässig ist?

Dies wird von Anfang an ein Community-Wiki sein. Lassen Sie uns also sehen, was die Leute tun, um ihre Server zu sichern.


44
Für eine absolute Undurchlässigkeit muss die Box ausgeschaltet werden.
Thorbjørn Ravn Andersen

Was ist, wenn Sie Wake-on-LAN haben?
Rebus

Das Problem wäre der LAN-Teil ... Wake-on-LAN-Pakete werden nicht weitergeleitet, daher müssten Sie Zugriff auf einen Computer im LAN haben, um das WOL-Paket zu senden ...
LassePoulsen

Für die Schlüsselauthentifizierung können Sie die Chiffren auf die wirklich benötigten Chiffren beschränken.

Antworten:


108

Verwenden Sie zur Authentifizierung öffentliche / private Schlüsselpaare anstelle von Kennwörtern.

  1. Generieren Sie einen passphrasengeschützten SSH-Schlüssel für jeden Computer, der auf den Server zugreifen muss:

    ssh-keygen

  2. Zulassen des SSH-Zugriffs mit öffentlichem Schlüssel von den zulässigen Computern aus:

    Kopieren Sie den Inhalt ~/.ssh/id_rsa.pubvon jedem Computer in einzelne Zeilen des ~/.ssh/authorized_keysServers oder führen Sie ihn ssh-copy-id [server IP address]auf jedem Computer aus, auf den Sie Zugriff gewähren (Sie müssen das Serverkennwort an der Eingabeaufforderung eingeben).

  3. Passwort-SSH-Zugang deaktivieren:

    Öffnen /etc/ssh/sshd_configSie die Zeile mit der Aufschrift #PasswordAuthentication yesund ändern Sie sie in PasswordAuthentication no. Starten Sie den SSH-Serverdämon neu, um die Änderung zu übernehmen ( sudo service ssh restart).

Die einzige Möglichkeit, SSH in den Server einzubinden, besteht darin, einen Schlüssel zu verwenden, der mit einem Line-In übereinstimmt ~/.ssh/authorized_keys. Bei dieser Methode interessieren mich Brute-Force-Angriffe nicht, da mein Passwort auch dann abgelehnt wird, wenn es erraten wird. Mit der heutigen Technologie ist es unmöglich, ein öffentliches / privates Schlüsselpaar zu erzwingen .


5
-1: Im Allgemeinen wird der Zugriff nicht auf Computern gewährt. Das Erstellen eines Schlüssels für jeden potenziellen Clientcomputer, der eine Verbindung zum Server herstellt, ist nicht zumutbar. Ihre letzte Aussage ist nach Ihrem Vorschlag nicht korrekt, und weil Sie nicht vorgeschlagen haben, eine Passphrase für die privaten Schlüssel festzulegen, die Zugriff auf eines der Client-Systeme haben oder diese kompromittieren, würde dies automatisch den Zugriff auf den SSH-Server gewähren. Die SSH-Schlüsselauthentifizierung wird empfohlen, die privaten Schlüssel müssen jedoch ordnungsgemäß geschützt sein und sollten einzeln und nicht wie beschrieben verteilt verwendet werden.
João Pinto

7
"Im Allgemeinen wird der Zugriff nicht einzelnen Computern gewährt. Das Erstellen eines Schlüssels für jeden potenziellen Clientcomputer, der eine Verbindung zum Server herstellt, ist unvernünftig." Es gibt viele Optionen, und ich denke, die sichere Übertragung eines privaten Schlüssels an jeden Client ist nicht Gegenstand dieser Frage . Ich präsentiere nicht alle Optionen, nur eine einfache, von der ich denke, dass die Leute sie verstehen können. "... sollte individuell und nicht wie beschrieben verteilt verwendet werden" Dies scheint Ihrer vorherigen Aussage zu widersprechen, und ich habe nichts als verteilt beschrieben.
Asa Ayers

5
"unmöglich" übertreibt es vielleicht ein bisschen.
Thorbjørn Ravn Andersen

9
Deshalb sage ich "unmöglich". Niemand hat so schnelle Computer, so viele oder so viel Zeit. "Stellen Sie sich einen Computer von der Größe eines Sandkorns vor, mit dem Schlüssel mit einigen verschlüsselten Daten verglichen werden können. Stellen Sie sich auch vor, Sie können einen Schlüssel in der Zeit testen, die für das Überqueren von Licht erforderlich ist. Betrachten Sie dann einen Cluster dieser Computer. So viele, dass, wenn Sie die Erde mit ihnen bedecken würden, sie den gesamten Planeten bis zu einer Höhe von 1 Meter bedecken würden. Der Cluster von Computern würde einen 128-Bit-Schlüssel im Durchschnitt in 1.000 Jahren knacken. "
Asa Ayers

@ ThorbjørnRavnAndersen "Impossible" ist nicht wirklich übertrieben, solange Sie einen starken Schlüssel verwenden. Ich kann im Moment kein Zitat finden, aber mit den aktuellen Schlüssellängen sind Brute-Force-Angriffe unmöglich, "bis Computer aus etwas anderem als Materie bestehen und etwas anderes als Raum einnehmen".
Maximillian Laumeister

72

Ich würde vorschlagen:

  • Verwendung von fail2ban , um Brute-Force-Anmeldeversuche zu verhindern.

  • Deaktivieren der Anmeldung als Root über SSH. Dies bedeutet, dass ein Angreifer sowohl den Benutzernamen als auch das Kennwort ermitteln musste, um einen Angriff zu erschweren.

    Fügen Sie PermitRootLogin noIhrem /etc/ssh/sshd_config.

  • Einschränkung der Benutzer, die SSH auf den Server ausführen können. Entweder nach Gruppe oder nur nach bestimmten Benutzern.

    Fügen Sie hinzu, AllowGroups group1 group2oder AllowUsers user1 user2begrenzen Sie, wer SSH auf dem Server ausführen kann.


2
Die AllowUsers und AllowGroups kein Komma akzeptieren , als Trennzeichen. Stellen Sie sicher, dass Sie dies nicht aus der Ferne versuchen. Ich werde immer wieder von meinem NAS ausgeschlossen, wenn ich das falsch mache.
artless Lärm

4
Überprüfensshd Sie immer, ob Ihre Konfiguration korrekt ist, bevor Sie sshd neu starten, um zu vermeiden, dass Sie sich selbst vom Computer fernhalten. Weitere Informationen finden Sie in diesem Blog. Führen Sie das sshd -TProgramm nach einer Konfigurationsänderung aus, bevor Sie den main neu starten sshd. Lassen Sie auch eine SSH-Sitzung auf dem Computer geöffnet , wenn Sie die Konfigurationsänderung vornehmen, und schließen Sie diese nicht, bis Sie die Konfiguration wie erwähnt validiert und möglicherweise eine SSH-Testanmeldung durchgeführt haben.
RichVel

24

Andere Antworten bieten Sicherheit, aber eines können Sie tun, um Ihre Protokolle leiser zu machen und die Wahrscheinlichkeit zu verringern, dass Sie von Ihrem Konto ausgeschlossen werden:

Verschieben Sie den Server von Port 22 auf einen anderen. Entweder an Ihrem Gateway oder auf dem Server.

Dies erhöht nicht die Sicherheit, bedeutet jedoch, dass alle zufälligen Internet-Scanner Ihre Protokolldateien nicht überladen.


1
Für diejenigen, die an Sicherheit durch Unbekanntheit glauben ( en.wikipedia.org/wiki/Security_through_obscurity ), ist es sehr sinnvoll, einen anderen Port zu verwenden. Ich glaube nicht ..
LassePoulsen

32
Es geht nicht um Sicherheit durch Dunkelheit (obwohl die Dunkelheit einen geringfügig positiven Effekt haben kann). Es geht darum, die Hintergrundgeräusche endloser Brute-Force-Versuche zu reduzieren. Sie können Ihre Zugriffsfehlerprotokolle nicht sinnvoll überwachen, wenn sie voll von automatisierten Angriffen sind. fail2ban reduziert die Lautstärke nicht genug, da die Anzahl der Angreifer und die Häufigkeit von verteilten (Botnet) und gedrosselten Angriffen zu gering ist. Mit ssh auf einem ungewöhnlichen Port wissen Sie, dass Angriffe, die Sie in den Protokollen sehen, von einem echten Angreifer ausgehen, der an Ihrer Box interessiert ist. Ich kann es nur empfehlen.
Bobince

Da Sie Internetdienste wie shodan nach webbasierten SSH-Servern abfragen oder nmap und Banner Capture verwenden können, ist das Ändern des Standardports so gut wie sinnlos. Ich würde davon abraten.
Verlangsamen Sie Loris

Shodan greift nicht auf alle 65k-Ports zu. Wenn Sie also zu einem hohen Port wechseln, wird dieser wahrscheinlich aus den Scans entfernt. Auch wenn Sie zu einem zufällig hohen Port wechseln, muss der Angreifer wahrscheinlich 65.000 TCP-Scans (sehr laut) durchführen, um Ihren Dienst zu finden, um ihn anzugreifen. Beides ist aus Sicherheitsgründen ein Gewinn. Daher ist der Wechsel zu einem hohen Hafen im Allgemeinen ein guter Plan. Ein weiterer ist , dass zu einem hohen Port , indem Sie eine bessere Idee haben kann , dass jemand, der Sie angreift ist Ihre Systeme speziell im Gegensatz Targeting nur allgemeine Hintergrund Internet Lärm
Rоry McCune

23

Aktivieren Sie die Zwei-Faktor-Authentifizierung mit HOTP oder TOTP . Dies ist ab 13.10 Uhr möglich.

Dies schließt die Verwendung der Authentifizierung mit öffentlichem Schlüssel anstelle der Kennwortauthentifizierung wie in einer anderen Antwort hier ein, erfordert jedoch auch den Nachweis, dass der Benutzer sein Zweitfaktorgerät zusätzlich zu seinem privaten Schlüssel besitzt.

Zusammenfassung:

  1. sudo apt-get install libpam-google-authenticator

  2. Lassen Sie jeden Benutzer den google-authenticatorBefehl ausführen , mit dem er ~/.google-authenticatorseine Zweifaktorgeräte (z. B. die Google Authenticator-Android-App) generiert und konfiguriert.

  3. Bearbeiten /etc/ssh/sshd_configund einstellen:

    ChallengeResponseAuthentication yes
    PasswordAuthentication no
    AuthenticationMethods publickey,keyboard-interactive
    
  4. Führen Sie aus sudo service ssh reload, um Ihre Änderungen an zu übernehmen /etc/ssh/sshd_config.

  5. Bearbeiten /etc/pam.d/sshdund ersetzen Sie die Zeile:

    @include common-auth
    

    mit:

    auth required pam_google_authenticator.so
    

Weitere Details zu verschiedenen Konfigurationsoptionen finden Sie in meinem Blogbeitrag vom letzten Jahr: Bessere Zwei-Faktor-SSH-Authentifizierung unter Ubuntu .


21

Stellen Sie sicher, dass die sshd-Block-Client-IPs, die keine korrekten Anmeldeinformationen bereitstellen, " DenyHØsts " diesen Job recht effektiv ausführen können. Ich habe dies auf allen meinen Linux-Boxen installiert, die irgendwie von außen erreichbar sind.

Dies stellt sicher, dass erzwungene Angriffe auf die SSHD nicht effektiv sind. Denken Sie jedoch daran, dass Sie sich auf diese Weise selbst aussperren können, wenn Sie Ihr Passwort vergessen. Dies kann ein Problem auf einem Remoteserver sein, auf den Sie keinen Zugriff haben.


2
Gibt es eine Option wie 10 fehlgeschlagene Anmeldeversuche, bevor die IP-Adresse gesperrt wird?
Sayantankhan

20

Hier ist eine einfache Möglichkeit : Installieren Sie ufw (die "unkomplizierte Firewall") und verwenden Sie sie, um eingehende Verbindungen einzuschränken .

Geben Sie an einer Eingabeaufforderung Folgendes ein:

$ sudo ufw limit OpenSSH 

Wenn ufw nicht installiert ist, führen Sie dies aus und versuchen Sie es erneut:

$ sudo aptitude install ufw 

Viele Angreifer versuchen, mithilfe Ihres SSH-Servers Passwörter zu erzwingen. Dies erlaubt nur 6 Verbindungen alle 30 Sekunden von derselben IP-Adresse.


+1 Verwenden von Limit kann gut sein. Ich sollte jedoch darauf hinweisen, dass bei der Verwendung des integrierten SFTP-Servers Probleme aufgetreten sind, da hierdurch auch die Verbindungen eingeschränkt werden.
Mark Davidson

2
@Mark - ein guter Punkt, aber hört sich das nicht nach einem schlecht geschriebenen SFTP-Client an? Warum würden sie sich immer wieder mit dem SSH-Port verbinden, wenn sie einfach mehr SSH-Kanäle öffnen könnten?
MPONTILLO

12

Wenn ich zusätzliche Sicherheit haben oder tief in einem Unternehmensnetzwerk auf SSH-Server zugreifen möchte, richte ich mithilfe der Anonymisierungssoftware Tor einen versteckten Dienst ein .

  1. Installieren Sie Tor und richten Sie den SSH-Server selbst ein.
  2. Stellen Sie sicher, dass sshd nur zuhört localhost.
  3. Öffnen /etc/tor/torrc. Stellen Sie HiddenServiceDir /var/lib/tor/sshund ein HiddenServicePort 22 127.0.0.1:22.
  4. Schau mal var/lib/tor/ssh/hostname. Es gibt einen Namen wie d6frsudqtx123vxf.onion. Dies ist die Adresse des versteckten Dienstes.
  5. Öffne $HOME/.ssh/configund füge einige Zeilen hinzu:

    Host myhost
    HostName d6frsudqtx123vxf.onion
    ProxyCommand socat STDIO SOCKS4A:127.0.0.1:%h:%p,socksport=9050
    

Außerdem brauche ich Tor auf meinem lokalen Host. Wenn es installiert ist, kann ich eingeben ssh myhostund SSH öffnet eine Verbindung über Tor. Der SSH-Server auf der anderen Seite öffnet seinen Port nur auf localhost. Somit kann es niemand über "normales Internet" verbinden.


10
Sicherheit durch fortgeschrittene Dunkelheit, aber sehr interessant.
Johannes

8

Es gibt einen Debian-Administrationsartikel zu diesem Thema. Es behandelt die grundlegende SSH-Serverkonfiguration sowie Firewall-Regeln. Dies könnte auch für gehärtete SSH-Server von Interesse sein.

Siehe dort Artikel: Sicherer SSH-Zugriff .


3
Etwas verspätet, aber bitte kopieren Sie bei der Beantwortung von Fragen die wichtigen Teile eines Links, damit die Informationen nach dem Verfall des Links immer noch hier sind.
Umop Aplsdn

1
Gute Idee. Obwohl ich in einer Zeit bin, in der es viel weniger Zeit für die Teilnahme gibt. Meine Antwort ist ein "Community-Wiki". Wenn Sie Zeit haben, können Sie die Link-Informationen hinzufügen.
Huygens

6

Mein Ansatz zur SSH-Härtung ist ... komplex. Die folgenden Punkte beziehen sich darauf, wie ich es mache, vom äußersten Rand meines Netzwerks (meiner Netzwerke) bis zu den Servern selbst.

  1. Grenzüberschreitendes Filtern des Datenverkehrs über IDS / IPS mit bekannten Dienstscannern und Signaturen in der Sperrliste. Ich erreiche dies mit Snort über meine Border-Firewall (dies ist mein Ansatz, eine pfSense-Appliance). Manchmal kann ich das jedoch nicht, wie bei meinen VPS.

  2. Firewall / Netzwerkfilterung der SSH-Ports. Ich erlaube ausdrücklich nur bestimmten Systemen, auf meine SSH-Server zuzugreifen. Dies geschieht entweder über eine pfSense-Firewall an der Grenze meines Netzwerks oder über die explizit konfigurierten Firewalls auf jedem Server. Es gibt Fälle, in denen dies nicht möglich ist (was fast nie der Fall ist, außer in privaten Test- oder Sicherheitstestlabors, in denen Firewalls nicht helfen, Dinge zu testen).

  3. In Verbindung mit meinem pfSense oder einer Border-Firewall, die das interne Netzwerk nutzt und vom Internet und den Systemen trennt, VPN-Only-Zugriff auf Server . Ich muss ein VPN in mein Netzwerk, um zu den Servern zu gelangen, da es keine mit dem Internet verbundenen Ports als solche gibt. Dies funktioniert definitiv nicht für alle meine VPS, aber in Verbindung mit # 2 kann ein VPS das "Gateway" sein, indem es in diesen Server ein VPN sendet und dann seine IPs für die anderen Boxen zulässt. Auf diese Weise weiß ich genau, was SSH kann oder nicht - meine einzige Box ist das VPN. (Oder in meinem Heimnetzwerk hinter pfSense meine VPN-Verbindung, und ich bin der einzige mit VPN-Zugang).

  4. Wo # 3 nicht machbar ist, ist fail2ban, das so konfiguriert ist, dass es nach 4 fehlgeschlagenen Versuchen blockiert und die IPs für eine Stunde oder länger blockiert, ein angemessener Schutz gegen Menschen, die ständig mit Bruteforcing angreifen - blockieren Sie sie an der Firewall automatisch mit fail2ban und meh. Die Konfiguration von fail2ban ist allerdings ein Problem ...

  5. Portverschleierung durch Ändern des SSH-Ports. Dies ist jedoch KEINE gute Idee, auch auf zusätzliche Sicherheitsmaßnahmen zu verzichten - das Mantra "Sicherheit durch Dunkelheit" wurde bereits in vielen Fällen widerlegt und umstritten. Ich habe dies in Verbindung mit IDS / IPS und Netzwerkfilterung getan, aber es ist immer noch eine SEHR schlechte Sache für sich.

  6. OBLIGATORISCHE Zwei-Faktor-Authentifizierung über die Zwei-Faktor-Authentifizierungslösungen von Duo Security . Auf jedem meiner SSH-Server ist Duo so konfiguriert, dass, um überhaupt einzusteigen, 2FA-Eingabeaufforderungen angezeigt werden und ich jeden Zugriff bestätigen muss. (Dies ist die ultimative hilfreiche Funktion. Selbst wenn jemand meine Passphrase hat oder einbricht, kommt er nicht an den Duo PAM-Plugins vorbei.) Dies ist einer der größten Schutzmechanismen auf meinen SSH-Servern vor unbefugtem Zugriff. Jede Benutzeranmeldung MUSS an einen konfigurierten Benutzer in Duo gebunden werden. Da ich einen restriktiven Satz habe, können keine neuen Benutzer im System registriert werden.

Meine zwei Cent für die Sicherung von SSH. Oder zumindest meine Gedanken zur Annäherung.


1

Möglicherweise möchten Sie die FreeOTP-App von RedHat auschecken, anstatt Google Authenticator zu verwenden. Manchmal werden Sie beim Aktualisieren der App gesperrt! ;-)

Wenn Sie andere Hardware-Token wie einen Yubikey oder ein eToken PASS oder NG verwenden möchten oder wenn Sie viele Benutzer oder viele Server haben, möchten Sie möglicherweise ein OpenSource-Backend für die Zwei-Faktor-Authentifizierung verwenden.

In letzter Zeit habe ich ein Howto dazu geschrieben .


0

Ich habe kürzlich ein kleines Tutorial dazu geschrieben. Grundsätzlich müssen Sie PKI verwenden, und mein Tutorial zeigt auch, wie Sie die Zwei-Faktor-Authentifizierung für noch mehr Sicherheit verwenden. Selbst wenn Sie keines dieser Dinge verwenden, gibt es auch einige Kleinigkeiten zum Sichern des Servers durch Entfernen schwacher Chiffresuiten und anderer Grundlagen. https://joscor.com/blog/hardening-openssh-server-ubuntu-14-04/


0

Berücksichtigen Sie bei einer großen Anzahl von Benutzern / Zertifikaten die LDAP-Integration. Große Organisationen verwenden LDAP als Repository für Benutzeranmeldeinformationen und Zertifikate, die auf Ausweisen oder Anhängern gespeichert sind, unabhängig davon, ob die Zertifikate zur Authentifizierung oder zum Signieren von E-Mails verwendet werden. Beispiele hierfür sind openLDAP, openDJ, Active Directory, Oracle Universal Directory, IBM Directory Server, snareWorks ...

Computer und Gruppen können auch in LDAP verwaltet werden, was eine zentrale Verwaltung der Anmeldeinformationen ermöglicht. Auf diese Weise erhalten Helpdesks eine zentrale Anlaufstelle für die Bewältigung großer Bevölkerungsgruppen.

Hier ist ein Link zur centOS-Integration: http://itdavid.blogspot.com/2013/11/howto-configure-openssh-to-fetch-public.html


0

Sie können mit der geoIP-Datenbank auch nach Herkunftsland sperren.

Wenn Sie in den USA leben, gibt es für jemanden in Russland keinen Grund, sich mit Ihrem SSH zu verbinden, sodass er automatisch gesperrt wird.

Das Skript finden Sie hier: https://www.axllent.org/docs/view/ssh-geoip/

Sie können ihm auch iptables-Befehle hinzufügen (ich habe das für meine Droplets getan), um den gesamten Datenverkehr von / zu diesen IPs automatisch zu löschen.


1
Gelegentlich können die GeoIP-Datenbanken falsch sein - ich wurde gefragt, ob ich gestern in Moskau sei ... wie? Nein! :)
Sean
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.