SSH Port Security & Fail2Ban (Artikel 304)
Kombinierte Strategien zur Absicherung des SSH-Zugangs. Erfahren Sie, wie Sie Fail2Ban für Non-Standard Ports konfigurieren und mittels SSH-Match-Blöcken granulare Sicherheitsregeln erzwingen.
# SSH Port & IPS Synergy: Angreifer ins Leere laufen lassen
TL;DR / Management Summary Ein offener Port 22 zieht Bots magisch an. In diesem Modul kombinieren wir zwei mächtige Abwehrmechanismen: Wir verschieben SSH auf einen Non-Standard Port, um 99% des “Hintergrundrauschens” zu eliminieren, und wir konfigurieren Fail2Ban so, dass es diesen neuen Port schützt. Ein Senior Admin nutzt zudem Match-Blöcke in der SSH-Config, um z.B. Root-Logins nur aus dem lokalen VPN-Netz zu erlauben, während für den Rest der Welt strikte Regeln gelten.
# 1. Einführung & Architektur
Die duale Verteidigung.
- Port-Changing: Versteckt den Dienst vor blinden Massen-Scannern.
- Fail2Ban: Erkennt gezielte Angriffe und blockiert diese auf IP-Ebene.
# Der Security-Flow (Mermaid)
graph TD
A[Attacker Bot] -->|Scan Port 22| B{Firewall}
B -->|Closed| C[Ignore]
D[Attacker Pro] -->|Scan Port 2222| B
B -->|Open| E[sshd: Log failed attempt]
E --> F[Fail2Ban Monitor]
F -->|Count 3 Fails| G[Action: iptables DROP IP]
G --> B
H[Admin User] -->|Verified IP / Key| B
B -->|Allow| I[Successful Login]
# 2. Fail2Ban für Custom Ports konfigurieren
Dem Türsteher den neuen Weg zeigen.
Standardmäßig schaut Fail2Ban oft nur auf Port 22. Wenn Sie Ihren Port in der sshd_config geändert haben (Artikel 301), müssen Sie Fail2Ban informieren.
# Konfiguration (/etc/fail2ban/jail.local)
[sshd]
enabled = true
# WICHTIG: Hier den neuen Port eintragen!
port = 2222
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 3
bantime = 1d
Danach: sudo systemctl restart fail2ban.
# 3. SSH Match-Blöcke: Granulare Kontrolle
Regeln nach Maß.
Mit Match können Sie globale Einstellungen für spezifische Kontexte überschreiben.
# Beispiel: Root-Login nur aus dem Firmen-VPN
In /etc/ssh/sshd_config:
# Globaler Schutz
PermitRootLogin no
# Ausnahme für das VPN-Netz
Match Address 10.50.0.0/24
PermitRootLogin prohibit-password
# (Erlaubt Root nur via Key, nicht via PW)
# 4. Day-2 Operations: Monitoring & Whitelisting
Nicht den eigenen Ast absägen.
# Den eigenen Zugriff sichern
Tragen Sie Ihre Admin-Workstation immer in die Whitelist ein, um nicht versehentlich durch einen Tippfehler gebannt zu werden.
In jail.local:
[DEFAULT]
ignoreip = 127.0.0.1/8 192.168.1.50
# 5. Troubleshooting & “War Stories”
Wenn die Firewall den Admin aussperrt.
# Story 1: “Der SElinux-Port-Konflikt”
Symptom: Der Admin ändert den SSH-Port auf 2222, aber der Dienst startet nicht mehr (bind() failed: Permission denied). Die Firewall ist offen.
Ursache: SELinux erlaubt sshd_t nur das Binden an bekannte SSH-Ports.
Lösung: Labeln Sie den Port in SELinux neu:
sudo semanage port -a -t ssh_port_t -p tcp 2222.
# Story 2: “Fail2Ban ignoriert das Journal”
Symptom: Angriffe werden im Log angezeigt, aber Fail2Ban geblockt niemanden.
Ursache: Auf modernen Systemen (Arch/RHEL) nutzt Fail2Ban oft den systemd Backend-Treiber. Wenn dieser falsch konfiguriert ist, liest er die Logs nicht in Echtzeit.
Lösung: Stellen Sie sicher, dass backend = systemd in der jail.local steht und das Paket python3-systemd installiert ist.
# 6. Fazit & Empfehlung
- Port-Change: Es ist keine echte Sicherheit (Security through Obscurity), aber es hält Ihre Logs sauber und spart CPU-Zyklen bei der Verarbeitung von Bot-Traffic.
- Fail2Ban: Ein Muss für jeden Server. Setzen Sie die
bantimeauf mindestens 24h für Wiederholungstäter. - Wahl: Nutzen Sie Port 22 nur, wenn Sie hinter einem spezialisierten SSH-Gateway/Proxy (wie Teleport oder Boundary) stehen.
# Anhang: Cheatsheet
| Aufgabe | Befehl |
|---|---|
| Gebannte IPs sehen | fail2ban-client status sshd |
| IP manuell entsperren | fail2ban-client set sshd unbanip <IP> |
| SSH Match-Regeln prüfen | sshd -T |
| Port in SELinux freigeben | semanage port -a -t ssh_port_t -p tcp <port> |
| Aktive Bans (iptables) | iptables -L f2b-sshd |
| Filter-Regeln testen | fail2ban-regex /var/log/secure /etc/fail2ban/filter.d/sshd.conf |