SSH richtig absichern

Table of Contents

 

Gerade jetzt, in Zeiten von Botnetzen und Ransomware, ist der SSH-Daemon ein beliebtes Angriffsziel, und steht unter ständigem Beschuss. Deshalb ist es von besonderer Wichtigkeit, dass dieser gut abgesichert ist. 

Die Einstellungen werden hauptsächlich in der Konfigurationsdatei /etc/ssh/sshd_config vorgenommen. Einige Einstellungen lassen sich auch komfortabler über grafische Oberflächen/Webpanels, wie Webmin/Virtualmin oder Plesk, einstellen. Aber nur eingeschränkt, für die meisten Punkte muss man direkt in der Konfigurationsdatei arbeiten. Deshalb sollte man diese erstmal mit sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak sichern, um bei Problemen alles rückgängig machen zu können. 

Die aktuell festgelegten Optionen lassen sich mit sudo sshd -T überprüfen.

 

SSH-Login mit Root-User verbieten

Der root-User ist das Hauptangriffsziel bei Brute-Force-Attacken, deshalb sollte man den Zugang grundsätzlich sperren. Zugang erhält man dann über einen bereits vorhandenen oder neu anzulegenden User. Dieser wird dann mit su - zum Root oder, wenn man ihn in die sudo-Gruppe einträgt, auch per sudo. 

 

User anlegen

Einloggen mit ssh root@[server-ip] und adduser [username] zum Anlegen eines neuen Benutzers.  Achte darauf, ein möglichst langes und kompliziertes Passwort zu wählen.  usermod -aG sudo [username] fügt ihn nun der Gruppe sudo hinzu. sudo whoami zeigt nun root. sudo -s macht den User zum root.

 

Root sperren

Konfigurationsdatei mit sudo nano /etc/ssh/sshd_config öffnen. Setze PermitRootLogin auf no: PermitRootLogin no

Starte den SSH-Dienst neu und verbinde dich erneut: sudo service sshd restart

 

Ab jetzt immer mit ssh [username]@[remote-host] einloggen.

 

Login mit SSH-Key, statt Passwort

Viel sicherer ist es völlig auf Passwörter zu verzichten und auf SSH-Keys zu setzen, einem Schlüsselpaar wo der Server dem Client einen öffentlichen Schlüssel sendet und dieser mit einem privaten Schlüssel antwortet. Zugriff bekommt man dann nur von der Maschine, wo diese private Schlüsseldatei vorhanden ist. 

 

SSH-Key auf Client erzeugen

Mit ssh-keygen generieren wir zunächste einen Key auf dem Client System (von dem aus auf dem Server zugegriffen werden soll. Das Standard-Verzeichnis für SSH-Keys unter Linux, sowie Windows, ist der Unterordner .ssh im Home-Verzeichnis. 

Ein Key-Paar besteht aus einem privaten Schlüssel, der nur bei Dir verbleiben und nicht weitergegeben darf, und aus einem öffentlichen Schlüssel, der auf dem Server hinterlegt wird und an der Dateiendung .pub (für public) gut erkennbar ist (unter Windows: id_rsa & id_rsa.pub).

 

SSH-Key auf Server kopieren

Das eben generierte File mit der .pub-Endung muss nun auf den Server kopiert werden.

 

1. Möglichkeit – die einfachste: ssh-copy-id

ssh-copy-id [username]@[remote-host] 

Fertig.

 

 

2. Möglichkeit: SecureCopy

Mit der folgenen Eingabe laden Sie von einem Linux, oder MacOS X Rechner die öffentliche Schlüsseldatei (id_dsa.pub) unter neuem Dateinamen authorized_keys in das Verzeichnis .ssh/ des neuen Nutzers:

scp ~/.ssh/id_dsa.pub [username]@[remote-host]:.ssh/authorized_keys
Dazu ist es nötig, dass auf dem Zielserver das Verzeichnis ~/.ssh/ bereits existiert.
 
 
3. Möglichkeit: Kopieren des öffentlichen Schlüssels mit SSH

 

				
					cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && chmod -R go= ~/.ssh && cat >> ~/.ssh/authorized_keys"
				
			
 

Server konfigurieren

Um die Authentifizierung mit Schlüsseln zuzulassen und gleichzeitig Passwort-Logins zu unterbinden, 
sucht man nun in der /etc/ssh/sshd_config die Punkte heraus und setzt sie jeweils wie folgt.

PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no

 

Den Server nun mit sudo systemctl reload sshd oder /etc/init.d/ssh reload (Debian/Ubuntu) oder /etc/init.d/sshd reload (SUSE) neu starten, damit die neuen Einstellungen greifen.

 

Authentifizierungsversuche begrenzen

Als Nächstes können Sie die maximale Anzahl der Authentifizierungsversuche für eine bestimmte Anmeldesitzung begrenzen.

MaxAuthTries 3

Für die meisten Einstellungen ist ein Standardwert von 3 akzeptabel. Sie können diesen jedoch je nach Ihrer eigenen Risikoschwelle höher oder niedriger festlegen.

 

 

SSH-Port ändern

Die meisten Brute-Force Angreifer gehen davon aus, dass der SSH-Dienst auf dem Standard-Port 22 läuft. Durch die Änderung dieses Ports, lassen sich schon mal einige Angreifer aussperren.

  1. Öffne die Konfigurationsdatei des SSH-Dienstes
    sudo nano /etc/ssh/sshd_config
  2. Ändere den Port 22 auf einen freien nicht standardisierten Port. Nehme nicht den Port hier im Beispiel!
    Port 4883
  3. Starte den SSH-Dienst neu, damit deine Änderungen wirksam werden
    sudo service sshd restart

Security-Check des SSH-Servers

Um nun die Sicherheitseinstellungen des SSH-Servers auf Herz und Nieren zu testen, ist ssh-audit, ein einfacher, quelloffener und sehr fixer SSH Security-Scanner, zu empfehlen. Die Ausgabe des ssh-audit-Findings sollte keine roten Zeilen und besser auch keine orangenen Zeilen ausspucken.

# Die aktuellste ssh-audit-Version herunterladen
pip3 install ssh-audit
# SSH-Security-Scan auf den SSH-Server abfeuern
ssh-audit localhost:22

Das Tool prüft u.a. die verwendeten key exchange algorithms, host-key algorithms, encryption algorithms (ciphers) usw. und gibt Auskunft, was besser entfernt werden sollte, weil veraltet und unsicher. Bei mir war dann leider viel rot und oranges dabei. Weiter unten unten beschreibe ich, wie die Unannehmlichkeiten schnell und einfach behoben werden können.

Außerdem bietet sich noch der Online-Checker auf der Website sshaudit.com an, den sollte man auf jeden Fall auch nochmal zusätzlich ausführen. Gut ist auch noch sshcheck.com.

 

 

 

Anzeige der unterstützten SSH-Server Cipher-Methoden

 

Hier zwei Methoden, um die von dem SSH-Server unterstützen Cipher-Methoden anzuzeigen.

				
					# Methode 1
nmap -p22 -n -sV --script ssh2-enum-algos localhost

# Methode 2
ssh -Q cipher
ssh -Q cipher-auth
ssh -Q mac
ssh -Q kex
ssh -Q key
				
			

SSH Hardening – Veraltete Verschlüsselung rausschmeißen


Die bei den vorhin ausgeführten Securitychecks gefundenen Probleme mit veralteten Verschlüsselungsalgorithmen usw. beheben wir nun im Folgenden. 

 

Genaue Anleitungen, wie man unter den verschiedenen Linux-Systemen das SSH abhärtet, findet man auf sshaudit.com/hardening_guides.html.

 

 

Hier im folgenden für

Ubuntu 20.04 LTS Server.

 
Hinweis: Alle Befehle müssen als Root-User ausgeführt werden.

 

 

1. RSA- und ED25519-Schlüssel neu generieren

				
					rm /etc/ssh/ssh_host_*
ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key -N ""
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
				
			

2. Kleine Diffie-Hellman-Module entfernen

				
					awk '$5 >= 3071' /etc/ssh/moduli > /etc/ssh/moduli.safe
mv /etc/ssh/moduli.safe /etc/ssh/moduli
				
			

3. DSA und ECDSA host keys deaktivieren

DSA und ECDSA HostKey-Direktiven in der Datei /etc/ssh/sshd_config auskommentieren:

				
					sed -i 's/^HostKey \/etc\/ssh\/ssh_host_\(dsa\|ecdsa\)_key$/\#HostKey \/etc\/ssh\/ssh_host_\1_key/g' /etc/ssh/sshd_config
				
			

4. Unterstützte Schlüsselaustausch- (key exchange), Chiffrier- (cipher) und MAC-Algorithmen beschränken

				
					echo -e "\n# Restrict key exchange, cipher, and MAC algorithms, as per sshaudit.com\n# hardening guide.\nKexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha256\nCiphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr\nMACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,umac-128-etm@openssh.com\nHostKeyAlgorithms ssh-ed25519,ssh-ed25519-cert-v01@openssh.com" >> /etc/ssh/sshd_config
				
			

5. OpenSSH-Server neu starten

				
					service ssh restart
				
			

E-Mail bei SSH-Login

Wenn du eine E-Mail erhälst, wenn sich jemand via SSH anmeldet, kannst du den Überblick behalten, wer in deinem System ein und aus geht.


Wichtig! Für diese Funktion benötigst du einen fertig eingerichteten E-Mail Server!

 

  1. Installiere das Paket bsd-mailx
    sudo apt-get install bsd-mailx
  2. Bearbeite das neue Script /opt/ssh-login-notify.sh
    sudo nano /opt/ssh-login-notify.sh
  3. Kopiere nun dieses Script in den Nano-Editor
  4. Öffne die Datei /etc/profile
    sudo nano /etc/profile
  5. Kopiere folgende Zeile ans Ende dieser Datei:
    /opt/ssh-login-notify.sh | mailx -s "SSH-Login auf SERVER-NAME" DEINE-EMAIL-ADRESSE@beispiel.de
  6. Tausche SERVER-NAME mit dem Namen deines Servers aus. Im Idealfall der Hostname oder ein anderer Name mit welchem du deinen Server identifizieren kannst.
  7. Tausche die E-Mail Adresse mit deiner E-Mail Adresse aus. Dorthin werden die Benachrichtigungen gesendet
  8. Gebe der Datei /opt/ssh-login-notify.sh die Rechte 755
    sudo chmod 755 /opt/ssh-login-notify.sh
  9. Fertig! Trenne die SSH-Verbindung um die Benachrichtigung zu testen.

 

 

Brute-Force Attacken verhindern

Automatisierte Angriffe per Wörterbuchattacken auf den SSH-Port des Servers prallen nach diesen ersten Maßnahmen schon zuverlässig ab. Bei mehreren Hundert gescheiterten Verbindungsversuchen täglich wird das Access-Logfile aber unübersichtlich. Diese Tools helfen.

 

SSH Guard

SSH Guard ist ein Wächterdienst, der wiederholt gescheiterte Anmeldeversuche anhand deren ausgehender IP-Adresse abblockt und dabei auch IPv6 unterstützt. SSH Guard erkennt nicht nur Attaken gehen OpenSSH, sondern auch gegen Sendmail, Exim, Dovecot, Postfix, proftpd u.a. und sperrt Angreifer gleich über die Firewall.

In Ubuntu, Debian und Raspbian ist der Dienst mit

sudo apt-get install sshguard  

eingerichtet und sofort aktiv.

 

Fail2Ban

Gleiches macht auch Fail2Ban. Dieses hat den Vorteil, das es Standardmäßig bereits in der Virtualmin-Installation vorhanden ist und somit über das Pabel administrierbar ist.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Vielleicht gefällt dir auch folgendes?

.user.ini auf NGINX ausblenden

Die “.user.ini”-Datei, die Wordfence erstellt, kann vertrauliche Informationen enthalten, und der öffentliche Zugriff darauf sollte eingeschränkt werden. Wenn NGINX genutzt ist, muss man das selber

Mehr lesen »

php-fpm Optimierung

Ich nutze php-fpm und mir sind starke Performance-Probleme bei der Verwendung von WordPress aufgefallen. Die Oberfläche reagierte träge, oft gab es lange Wartezeiten. Zur php-fpm

Mehr lesen »
WordPress Cookie Plugin von Real Cookie Banner