SSH Brute-Force Analyse auf Ubuntu Servern
Ein Ubuntu-Server der öffentlich erreichbar ist wird früher oder später mit SSH-Brute-Force-Angriffen konfrontiert. In diesem Post zeige ich wie man die Lage analysiert und was man dagegen tun kann.
1. Überblick: Wie groß ist das Problem?
echo "=== Failed Login Attempts ===" && grep -c "Failed password" /var/log/auth.log
echo "=== Accepted Logins ===" && grep -c "Accepted" /var/log/auth.log
echo "=== Unique Angreifer-IPs ===" && grep "Failed password" /var/log/auth.log | grep -oP '(?<=from )\d+\.\d+\.\d+\.\d+' | sort -u | wc -l
2. Top Angreifer-IPs
grep "Failed password" /var/log/auth.log | \
grep -oP '(?<=from )\d+\.\d+\.\d+\.\d+' | \
sort | uniq -c | sort -rn | head -20
3. Welche Usernamen werden probiert?
Hinweis: Das klassische Lookbehind-Pattern funktioniert mit GNU grep nicht bei variabler Länge. Stattdessen mit sed lösen:grep "Failed password" /var/log/auth.log | \
sed 's/.*for invalid user //; s/.*for //' | \
awk '{print $1}' | \
sort | uniq -c | sort -rn | head -20
4. Zeitliche Verteilung der Angriffe
grep "Failed password" /var/log/auth.log | \
awk '{print $1, $2}' | uniq -c | sort -rn | head -20
5. Erfolgreiche Logins prüfen (das Wichtigste!)
grep "Accepted" /var/log/auth.log | tail -20
6. Gegensteuern: Passwort-Auth deaktivieren
Da SSH-Brute-Force immer auf Passwörter zielt, ist die effektivste Maßnahme Passwort-Auth komplett abzuschalten. Voraussetzung: Public-Key-Login funktioniert bereits.
sudo nano /etc/ssh/sshd_config
Folgende Werte setzen:
PasswordAuthentication no
PermitRootLogin prohibit-password
UsePAM yes
Wichtig:UsePAMaufyeslassen! Sonst kann es passieren dass selbst der Public-Key-Login nicht mehr funktioniert.
Danach SSH neu starten – auf Ubuntu heißt der Service ssh, nicht sshd:
sudo systemctl restart ssh
7. Logs aufräumen
Laufende Logfiles niemals löschen – immer mit truncate leeren, da Prozesse den File-Descriptor offen halten:
# Aktive Logs leeren
sudo truncate -s 0 /var/log/auth.log
sudo truncate -s 0 /var/log/syslog
sudo truncate -s 0 /var/log/btmp
# Komprimierte Altlogs löschen (sicher)
sudo find /var/log -name "*.gz" -delete
sudo find /var/log -name "*.log.[0-9]*" -not -name "*.gz" -delete
Systemd Journal begrenzen:
# Auf 200 MB begrenzen
journalctl --vacuum-size=200M
# Oder alles älter als 2 Wochen löschen
journalctl --vacuum-time=2weeks
Fazit
Mit PasswordAuthentication no ist der Großteil der Brute-Force-Angriffe wirkungslos. Der Auth-Log-Lärm bleibt zwar bestehen, aber kein Angreifer kommt ohne den passenden Private Key rein. Für zusätzlichen Schutz (und weniger Log-Spam) lohnt sich ergänzend fail2ban.