linux-security ssh fail2ban firewall hardening intrusion-prevention

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.

  1. Port-Changing: Versteckt den Dienst vor blinden Massen-Scannern.
  2. 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 bantime auf 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