Benutzer-Werkzeuge

Webseiten-Werkzeuge


ubuntu:ssh

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
ubuntu:ssh [2022/11/23 17:55] – [Banner-Warnseite anlegen] franzubuntu:ssh [2026/09/11 09:06] (aktuell) – [SSH hat deinen Job abgebrochen und beendet? Hier ist die Lösung] franz
Zeile 4: Zeile 4:
  
 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]] 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 ===== ===== Remote Script über SSH ausführen =====
Zeile 9: Zeile 10:
 Installiere[[https://askubuntu.com/questions/1073940/execute-bash-script-on-remote-server-non-interactively|sshpass]], ein Tool zur nicht-interaktiven ssh-Passwort-Authentifizierung.\\ 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: [[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 =====
 +
 +<code bash>\\
 +sudo apt update\\
 +sudo apt install ipset\\
 +ipset --version\\
 +
 +</code>
 +
 +===== 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
 +
 +</code>
 +
 +===== 3. Persistenz der manuellen Blocklist =====
 +
 +ipset-Sets sind standardmäßig **nicht** über Reboots persistent.
 +
 +==== 3.1 Einmalig sichern ====
 +
 +<code bash>
 +sudo ipset save > /etc/ipset.\conf
 +
 +</code>
 +
 +Kontrolle:
 +
 +<code bash>
 +cat /etc/ipset.\conf
 +
 +</code>
 +
 +==== 3.2 Restore beim Boot (systemd) ====
 +
 +Datei: ''/etc/systemd/system/ipset-persistent.service''
 +
 +<code ini>
 +[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
 +
 +</code>
 +
 +<code bash>
 +sudo systemctl enable ipset-\persistent
 +
 +</code>
 +
 +==== 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''
 +
 +<code ini>
 +[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
 +
 +</code>
 +
 +<code bash>
 +sudo systemctl enable ipset-save.\service
 +
 +</code>
 +
 +> **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-<jailname>'') sowie die zugehörige iptables-Regel **automatisch** beim Start/Stop des Jails.
 +
 +==== 4.1 Verfügbare Actions prüfen ====
 +
 +<code bash>
 +ls /etc/fail2ban/action.d/ | grep \ipset
 +
 +</code>
 +
 +Relevant: ''iptables-ipset-proto6.conf''
 +
 +==== 4.2 jail.local konfigurieren ====
 +
 +Datei: ''/etc/fail2ban/jail.local''
 +
 +<code ini>
 +[sshd]
 +enabled = \true
 +port = <NICHT-STANDARD-PORT>
 +maxretry = \3
 +findtime = \600
 +bantime = \86400
 +bantime.increment = \true
 +bantime.factor = \24
 +bantime.maxtime = \604800
 +banaction = iptables-ipset-\proto6
 +
 +</code>
 +
 +* **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 ====
 +
 +<code bash>
 +sudo systemctl restart \fail2ban
 +sudo fail2ban-client status \sshd
 +
 +</code>
 +
 +==== 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
 +
 +</code>
 +
 +==== 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
 +
 +</code>
 +
 +===== 5. Ergänzende Härtungsmaßnahmen =====
 +
 +==== 5.1 sshd_config ====
 +
 +<code ini>
 +PermitRootLogin \no
 +AllowUsers <username>
 +MaxStartups 3:50:\10
 +LoginGraceTime \15
 +
 +</code>
 +
 +==== 5.2 Connection-Rate-Limiting (zusätzlich zu fail2ban) ====
 +
 +<code bash>
 +sudo iptables -A INPUT -p tcp --dport <PORT> -m conntrack --ctstate NEW -m recent --set --name \SSH
 +sudo iptables -A INPUT -p tcp --dport <PORT> -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 4 --name SSH -j \DROP
 +
 +</code>
 +
 +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  |
  
  
ubuntu/ssh.1669222558.txt.gz · Zuletzt geändert: von franz

Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht: Public Domain
Public Domain Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki