====== SSH ======
===== Banner-Warnseite anlegen =====
Will man eine Warnseite bei einem SSH Zugang anzeigen, [[https://www.tecmint.com/ssh-warning-message-before-login/?fbclid=IwAR3g9LnFvu0CZ8ZZGIf1FuMOR9DHn3-EXPw9dw4zKBDJNvot-0A857afY9E|hilft diese Anleitung]]
===== Remote Script über SSH ausführen =====
Installiere[[https://askubuntu.com/questions/1073940/execute-bash-script-on-remote-server-non-interactively|sshpass]], ein Tool zur nicht-interaktiven ssh-Passwort-Authentifizierung.\\
[[https://www.cyberciti.biz/faq/linux-unix-running-sudo-command-without-a-password/|So führst du]] den Befehl sudo ohne Passwort aus:
===== SSH hat deinen Job abgebrochen und beendet? Hier ist die Lösung =====
Du hast einen langwierigen rsync-Job oder ein Python-Skript auf einem Remote-Server laufen lassen, nur um mit anzusehen, wie es in dem Moment abstürzt, in dem deine SSH-Sitzung unterbrochen wird, und jetzt musst du dich mit nohup, screen, tmux und systemd auseinandersetzen, damit das nie wieder passiert.
Nähere Infos findest [[https://www.tecmint.com/keep-linux-commands-running-after-logout/|du auf Tecmint]]
====== SSH-Absicherung: fail2ban mit ipset-Integration ======
===== Ausgangslage =====
Massive Brute-Force-/Scan-Angriffe auf den SSH-Dienst, u. a. von einzelnen IPs mit mehreren zehntausend Login-Versuchen. SSH ist bereits über Key-Auth, Non-Standard-Port und fail2ban abgesichert. Ziel dieser Maßnahme: Reduktion von Logspam, Ressourcenverbrauch und Angriffsfläche durch effizientere Blockierung auf Firewall-Ebene mittels **ipset** statt einzelner iptables-Regeln pro IP.
===== Voraussetzungen =====
* Root- bzw. sudo-Zugriff auf den Server\\
* fail2ban bereits installiert und aktiv\\
* iptables (legacy) im Einsatz
===== 1. ipset installieren =====
\\
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):
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 ====
sudo ipset save > /etc/ipset.\conf
Kontrolle:
cat /etc/ipset.\conf
==== 3.2 Restore beim Boot (systemd) ====
Datei: ''/etc/systemd/system/ipset-persistent.service''
[Unit]
Description=Restore ipset \rules
Before=netfilter-persistent.\service
After=network-pre.target
[Service]
Type=\oneshot
ExecStart=/sbin/ipset restore -! -file /etc/ipset.conf
[Install]
WantedBy=multi-user.\target
sudo systemctl enable ipset-\persistent
==== 3.3 Automatisches Sichern bei Änderungen ====
Da neue IPs nicht automatisch in ''/etc/ipset.conf'' landen, empfiehlt sich ein Save-Service beim Shutdown.
Datei: ''/etc/systemd/system/ipset-save.service''
[Unit]
Description=Save ipset rules on \shutdown
Before=shutdown.target reboot.target halt.target
[Service]
Type=\oneshot
ExecStart=/sbin/ipset save -file /etc/ipset.\conf
RemainAfterExit=yes
[Install]
WantedBy=halt.target reboot.target shutdown.\target
sudo systemctl enable ipset-save.\service
> **Hinweis:** Dieser Save/Restore-Mechanismus betrifft ausschließlich das manuell gepflegte Set ''blocklist''. Das fail2ban-eigene Set (siehe Punkt 4) wird davon bewusst **nicht** erfasst.
===== 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 (''f2b-'') sowie die zugehörige iptables-Regel **automatisch** beim Start/Stop des Jails.
==== 4.1 Verfügbare Actions prüfen ====
ls /etc/fail2ban/action.d/ | grep \ipset
Relevant: ''iptables-ipset-proto6.conf''
==== 4.2 jail.local konfigurieren ====
Datei: ''/etc/fail2ban/jail.local''
[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**: Bannzeit verlängert sich bei wiederholten Verstößen exponentiell (Faktor 24, Cap bei 7 Tagen)
* **banaction**: nutzt ipset statt Einzelregeln
==== 4.3 fail2ban neu starten ====
sudo systemctl restart \fail2ban
sudo fail2ban-client status \sshd
==== 4.4 Kontrolle: Set und Regel automatisch angelegt ====
sudo ipset list f2b-\sshd
sudo iptables -L INPUT -n --line-numbers | grep f2b-\sshd
==== 4.5 Funktionstest ====
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 ====
PermitRootLogin \no
AllowUsers
MaxStartups 3:50:\10
LoginGraceTime \15
==== 5.2 Connection-Rate-Limiting (zusätzlich zu fail2ban) ====
sudo iptables -A INPUT -p tcp --dport -m conntrack --ctstate NEW -m recent --set --name \SSH
sudo iptables -A INPUT -p tcp --dport -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 4 --name SSH -j \DROP
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/Ersatz zu fail2ban (Community-Blocklists)
* Automatisches Reporting gebannter IPs an AbuseIPDB via fail2ban-Plugin
===== 6. Architekturübersicht =====
^ Set ^ Verwaltet durch ^ Persistenz ^ Zweck ^
| blocklist | manuell / Admin | ipset-persistent.service (Boot) | dauerhafte Sperre bekannter Angreifer |\\
| f2b-sshd | fail2ban (automatisch) | keine (Neuaufbau bei Jail-Start) | dynamische Bans aus Login-Versuchen |
===== Offene Punkte / To-Do =====
* Migration bereits bestehender, einzeln gesetzter iptables-Bans in das neue ipset-Schema\\
* Entscheidung zu GeoIP-Blocking treffen\\
* Monitoring/Alerting bei ungewöhnlich hoher Ban-Rate einrichten
===== Changelog =====
^ Datum ^ Änderung ^ Autor ^\\
| {{date}} | Ersterstellung – ipset + fail2ban-Integration | Franz |