ubuntu:ssh
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende Überarbeitung | |||
| ubuntu:ssh [2026/05/08 17:09] – [Remote Script über SSH ausführen] franz | ubuntu:ssh [2026/09/11 09:06] (aktuell) – [SSH hat deinen Job abgebrochen und beendet? Hier ist die Lösung] franz | ||
|---|---|---|---|
| Zeile 16: | Zeile 16: | ||
| Nähere Infos findest [[https:// | Nähere Infos findest [[https:// | ||
| + | |||
| + | ====== SSH-Absicherung: | ||
| + | |||
| + | ===== Ausgangslage ===== | ||
| + | |||
| + | Massive Brute-Force-/ | ||
| + | |||
| + | ===== Voraussetzungen ===== | ||
| + | |||
| + | * Root- bzw. sudo-Zugriff auf den Server\\ | ||
| + | * fail2ban bereits installiert und aktiv\\ | ||
| + | * iptables (legacy) im Einsatz | ||
| + | |||
| + | ===== 1. ipset installieren ===== | ||
| + | |||
| + | <code bash>\\ | ||
| + | sudo apt update\\ | ||
| + | sudo apt install ipset\\ | ||
| + | ipset --version\\ | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===== 2. Manuelle Blocklist für bekannte Angreifer-IPs ===== | ||
| + | |||
| + | Für IPs/Ranges, die dauerhaft und unabhängig von fail2ban gesperrt werden sollen (z. B. bekannte bösartige Hoster-Ranges): | ||
| + | |||
| + | <code bash> | ||
| + | sudo ipset create blocklist hash:\ip | ||
| + | sudo ipset add blocklist 61.138.113.\187 | ||
| + | sudo iptables -I INPUT -m set --match-set blocklist src -j \DROP | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===== 3. Persistenz der manuellen Blocklist ===== | ||
| + | |||
| + | ipset-Sets sind standardmäßig **nicht** über Reboots persistent. | ||
| + | |||
| + | ==== 3.1 Einmalig sichern ==== | ||
| + | |||
| + | <code bash> | ||
| + | sudo ipset save > / | ||
| + | |||
| + | </ | ||
| + | |||
| + | Kontrolle: | ||
| + | |||
| + | <code bash> | ||
| + | cat / | ||
| + | |||
| + | </ | ||
| + | |||
| + | ==== 3.2 Restore beim Boot (systemd) ==== | ||
| + | |||
| + | Datei: ''/ | ||
| + | |||
| + | <code ini> | ||
| + | [Unit] | ||
| + | Description=Restore ipset \rules | ||
| + | Before=netfilter-persistent.\service | ||
| + | After=network-pre.target | ||
| + | |||
| + | [Service] | ||
| + | Type=\oneshot | ||
| + | ExecStart=/ | ||
| + | |||
| + | [Install] | ||
| + | WantedBy=multi-user.\target | ||
| + | |||
| + | </ | ||
| + | |||
| + | <code bash> | ||
| + | sudo systemctl enable ipset-\persistent | ||
| + | |||
| + | </ | ||
| + | |||
| + | ==== 3.3 Automatisches Sichern bei Änderungen ==== | ||
| + | |||
| + | Da neue IPs nicht automatisch in ''/ | ||
| + | |||
| + | Datei: ''/ | ||
| + | |||
| + | <code ini> | ||
| + | [Unit] | ||
| + | Description=Save ipset rules on \shutdown | ||
| + | Before=shutdown.target reboot.target halt.target | ||
| + | |||
| + | [Service] | ||
| + | Type=\oneshot | ||
| + | ExecStart=/ | ||
| + | RemainAfterExit=yes | ||
| + | |||
| + | [Install] | ||
| + | WantedBy=halt.target reboot.target shutdown.\target | ||
| + | |||
| + | </ | ||
| + | |||
| + | <code bash> | ||
| + | sudo systemctl enable ipset-save.\service | ||
| + | |||
| + | </ | ||
| + | |||
| + | > **Hinweis: | ||
| + | |||
| + | ===== 4. fail2ban-Integration mit ipset ===== | ||
| + | |||
| + | Anstatt dass fail2ban für jede gebannte IP eine eigene iptables-Regel anlegt, wird die mitgelieferte ipset-Action genutzt. Diese erstellt und verwaltet das Set ('' | ||
| + | |||
| + | ==== 4.1 Verfügbare Actions prüfen ==== | ||
| + | |||
| + | <code bash> | ||
| + | ls / | ||
| + | |||
| + | </ | ||
| + | |||
| + | Relevant: '' | ||
| + | |||
| + | ==== 4.2 jail.local konfigurieren ==== | ||
| + | |||
| + | Datei: ''/ | ||
| + | |||
| + | <code ini> | ||
| + | [sshd] | ||
| + | enabled = \true | ||
| + | port = < | ||
| + | maxretry = \3 | ||
| + | findtime = \600 | ||
| + | bantime = \86400 | ||
| + | bantime.increment = \true | ||
| + | bantime.factor = \24 | ||
| + | bantime.maxtime = \604800 | ||
| + | banaction = iptables-ipset-\proto6 | ||
| + | |||
| + | </ | ||
| + | |||
| + | * **bantime.increment**: | ||
| + | * **banaction**: | ||
| + | |||
| + | ==== 4.3 fail2ban neu starten ==== | ||
| + | |||
| + | <code bash> | ||
| + | sudo systemctl restart \fail2ban | ||
| + | sudo fail2ban-client status \sshd | ||
| + | |||
| + | </ | ||
| + | |||
| + | ==== 4.4 Kontrolle: Set und Regel automatisch angelegt ==== | ||
| + | |||
| + | <code bash> | ||
| + | sudo ipset list f2b-\sshd | ||
| + | sudo iptables -L INPUT -n --line-numbers | grep f2b-\sshd | ||
| + | |||
| + | </ | ||
| + | |||
| + | ==== 4.5 Funktionstest ==== | ||
| + | |||
| + | <code bash> | ||
| + | sudo fail2ban-client set sshd banip 1.2.3.\4 | ||
| + | sudo ipset list f2b-\sshd | ||
| + | sudo fail2ban-client set sshd unbanip 1.2.3.\4 | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===== 5. Ergänzende Härtungsmaßnahmen ===== | ||
| + | |||
| + | ==== 5.1 sshd_config ==== | ||
| + | |||
| + | <code ini> | ||
| + | PermitRootLogin \no | ||
| + | AllowUsers < | ||
| + | MaxStartups 3:50:\10 | ||
| + | LoginGraceTime \15 | ||
| + | |||
| + | </ | ||
| + | |||
| + | ==== 5.2 Connection-Rate-Limiting (zusätzlich zu fail2ban) ==== | ||
| + | |||
| + | <code bash> | ||
| + | sudo iptables -A INPUT -p tcp --dport < | ||
| + | sudo iptables -A INPUT -p tcp --dport < | ||
| + | |||
| + | </ | ||
| + | |||
| + | Begrenzt neue Verbindungsversuche auf 4 pro Minute je IP, unabhängig von fail2ban. | ||
| + | |||
| + | ==== 5.3 Optionale Erweiterungen (nicht umgesetzt / zu prüfen) ==== | ||
| + | |||
| + | * GeoIP-Blocking (xtables-addons / nftables-Sets) für Länder ohne legitimen \Zugriffsbedarf | ||
| + | * CrowdSec als Ergänzung/ | ||
| + | * Automatisches Reporting gebannter IPs an AbuseIPDB via fail2ban-Plugin | ||
| + | |||
| + | ===== 6. Architekturübersicht ===== | ||
| + | |||
| + | ^ Set ^ Verwaltet durch ^ Persistenz | ||
| + | | blocklist | ||
| + | | f2b-sshd | ||
| + | |||
| + | ===== Offene Punkte / To-Do ===== | ||
| + | |||
| + | * Migration bereits bestehender, | ||
| + | * Entscheidung zu GeoIP-Blocking treffen\\ | ||
| + | * Monitoring/ | ||
| + | |||
| + | ===== Changelog ===== | ||
| + | |||
| + | ^ Datum ^ Änderung | ||
| + | | {{date}} | ||
ubuntu/ssh.1778252996.txt.gz · Zuletzt geändert: von franz