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
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.
- Öffne die Konfigurationsdatei des SSH-Dienstes
sudo nano /etc/ssh/sshd_config
- Ändere den Port 22 auf einen freien nicht standardisierten Port. Nehme nicht den Port hier im Beispiel!
Port 4883
- 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.
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!
- Installiere das Paket bsd-mailx
sudo apt-get install bsd-mailx
- Bearbeite das neue Script /opt/ssh-login-notify.sh
sudo nano /opt/ssh-login-notify.sh
- Kopiere nun dieses Script in den Nano-Editor
- Öffne die Datei /etc/profile
sudo nano /etc/profile
- Kopiere folgende Zeile ans Ende dieser Datei:
/opt/ssh-login-notify.sh | mailx -s "SSH-Login auf SERVER-NAME" DEINE-EMAIL-ADRESSE@beispiel.de
- Tausche SERVER-NAME mit dem Namen deines Servers aus. Im Idealfall der Hostname oder ein anderer Name mit welchem du deinen Server identifizieren kannst.
- Tausche die E-Mail Adresse mit deiner E-Mail Adresse aus. Dorthin werden die Benachrichtigungen gesendet
- Gebe der Datei /opt/ssh-login-notify.sh die Rechte 755
sudo chmod 755 /opt/ssh-login-notify.sh
- 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.