Netzwerk-Sicherheitsübersicht — Stand 2026-03-11
Infrastruktur
| Node | IP | Rolle |
|---|---|---|
| pve01 | 192.168.1.51 | Proxmox, Ceph Mon+OSD |
| pve02 | 192.168.1.52 | Proxmox, Ceph OSD |
| pve03 | 192.168.1.53 | Proxmox, Monitoring CT |
| pve04 | 192.168.1.54 | Proxmox |
| pve05 | 193.70.XXX.XX | Proxmox VPS (WireGuard: 192.168.16.4) |
| CT100 | 192.168.1.100 | NPM + CrowdSec (auf pve02) |
| CT121 | 192.168.1.121 | Grafana + Prometheus (auf pve03) |
Phase 1 — Kernel & Basis-Härtung (alle 5 Nodes)
Kernel-Hardening /etc/sysctl.d/99-security.conf
| Parameter | Wert | Schutz gegen |
|---|---|---|
| tcp_syncookies = 1 | aktiv | SYN-Flood-Angriffe |
| rp_filter = 1 | aktiv | IP-Spoofing / Source-Route-Angriffe |
| icmp_echo_ignore_broadcasts = 1 | aktiv | Smurf-Amplification-Angriffe |
| accept_redirects = 0 | geblockt | ICMP-Redirect-Hijacking |
| send_redirects = 0 | geblockt | Man-in-the-Middle via ICMP |
| accept_source_route = 0 | geblockt | Source-Routing-Angriffe |
| tcp_max_syn_backlog = 2048 | erhöht | SYN-Flood-Resistenz |
| tcp_synack_retries = 2 | reduziert | Halboffene Verbindungen limitieren |
| dmesg_restrict = 1 | aktiv | Kernel-Infoleaks für unprivilegierte User |
| suid_dumpable = 0 | deaktiviert | SUID-Core-Dumps verhindern |
SSH-Härtung /etc/ssh/sshd_config (alle 5 Nodes)
| Parameter | Wert | Bedeutung |
|---|---|---|
| MaxAuthTries | 3 | Max. 3 Fehlversuche pro Verbindung |
| LoginGraceTime | 20s | Verbindung bricht nach 20s ohne Login ab |
| MaxSessions | 5 | Max. 5 gleichzeitige Multiplexed Sessions |
| ClientAliveInterval | 300s | Keepalive alle 5 Minuten |
| ClientAliveCountMax | 2 | Trennung nach 2 fehlenden Keepalives (~10 Min) |
| SSH-Keys | 8 Keys | Alle Nodes; Passwort-Auth aktiv (bewusst) |
Automatische Sicherheitsupdates (unattended-upgrades)
- pve01–04: installiert & konfiguriert (nur Debian-Security-Origin)
- pve05: bereits vorhanden
- Automatischer Reboot: aus
- Entfernung ungenutzter Abhängigkeiten: ein
Phase 2 — Zugriffskontrolle & Intrusion Prevention
Port-Knocking (knockd) — alle 5 Nodes
SSH-Port 22 ist standardmäßig für neue Verbindungen gedroppt. Zugang nur nach korrekter Klopfsequenz.
| Einstellung | Wert |
|---|---|
| Öffnen-Sequenz | PORT1 → PORT2 → PORT3 (TCP SYN) |
| Schließen-Sequenz | PORT3 → PORT2 → PORT1 |
| Sequenz-Timeout | 10 Sekunden |
| SSH-Freischaltung | 30 Sekunden (danach automatisch gesperrt) |
| Interface pve01–04 | vmbr0 |
| Interface pve05 (VPS) | ens3 |
Aktive iptables-Regeln auf jedem Node:
Code
1 ACCEPT -- ESTABLISHED,RELATED (bestehende Sessions bleiben offen)
2 ACCEPT -- <eigene IP> dpt:22 (nach Knock temporär freigegeben)
5 DROP -- 0.0.0.0/0 dpt:22 NEW (alle anderen neuen SSH-Verbindungen)
pve05 Sonderregel: WireGuard-Netz 192.168.16.0/24 ist dauerhaft vom SSH-Drop ausgenommen (VPN-Zugang ohne Klopfen möglich).
Klopfen ohne knock-Client (Linux/Mac):
Code
bash -c "echo >/dev/tcp/<NODE-IP>/PORT1"; sleep 0.1
bash -c "echo >/dev/tcp/<NODE-IP>/PORT2"; sleep 0.1
bash -c "echo >/dev/tcp/<NODE-IP>/PORT3"
fail2ban — alle 5 Nodes
| Jail | bantime | findtime | maxretry | Aktion |
|---|---|---|---|---|
| sshd | 2 Stunden | 10 Min | 3 | IP-Ban via iptables |
| proxmox-web (pve01) | 7 Tage | 24 Stunden | 3 | IP-Ban |
Proxmox Web-UI — 2FA (TOTP)
| Einstellung | Wert |
|---|---|
| Nutzer | root@pam |
| Methode | TOTP (SHA1, 6-stellig, 30s) |
| Gilt für | alle Nodes (Cluster-Sync via /etc/pve/priv/tfa.cfg) |
| App | Google Authenticator / Authy / jede TOTP-App |
| Secret | MyUltimateSecretKey |
| Recovery | /root/recovery.txt auf pve01 |
CrowdSec — Threat Intelligence (CT100)
Version: v1.7.6 | Deployment: Docker-Container in CT100 (NPM-Host)
Aktive Collections
| Collection | Schützt gegen |
|---|---|
| crowdsecurity/nginx | Nginx-spezifische Angriffe |
| crowdsecurity/base-http-scenarios | HTTP-Brute-Force, Scanning |
| crowdsecurity/http-cve | Bekannte CVE-Exploits (ThinkPHP, PHPUnit, …) |
| crowdsecurity/linux | Systemweite Linux-Angriffe |
| crowdsecurity/sshd | SSH-Brute-Force |
| crowdsecurity/whitelist-good-actors | Legitime Crawler (Google, Bing, …) |
Aktiver Bouncer
| Bouncer | Typ | Status |
|---|---|---|
| firewall-bouncer-lxc | iptables (Layer 3) | ✓ aktiv |
Aktuelle Ban-Statistiken
| Szenario | Gebannte IPs |
|---|---|
| CVE-2017-9841 (PHPUnit RCE) | 11 |
| http-probing | 5 |
| http-crawl-non_statics | 5 |
| http-admin-interface-probing | 4 |
| thinkphp-cve-2018-20062 | 3 |
| http-path-traversal-probing | 2 |
| http-sensitive-files | 2 |
| http-bad-user-agent | 1 |
Top-Herkunftsländer: FR (13) · CH (9) · BD (4) · CN (4) · IT (3) · US (2) · NL (1)
Prometheus-Monitoring
- Port 6060: Native CrowdSec-Metriken
- Port 6061: Custom Geo-Exporter (crowdsec_bans_by_country, crowdsec_bans_by_scenario)
- Grafana Dashboard: CrowdSec — Threat Intelligence & Security
NPM (Nginx Proxy Manager) — CT100
| Schutzmaßnahme | Status |
|---|---|
| Port 81 (Admin-UI) | Nur aus 192.168.1.0/24 erreichbar |
| CrowdSec firewall bouncer | ✓ aktiv — gebannte IPs werden per iptables gedroppt |
| TLS-Terminierung | über NPM für alle Reverse-Proxy-Routen |
Monitoring (CT121 — Grafana + Prometheus)
- Grafana 12.3.2 auf 192.168.1.121:3000
- Login: $LDAPUSER
- Relevante Security-Dashboards:
- CrowdSec — Threat Intelligence & Security
- Security - Intrusion Prevention (fail2ban)
- Sicherheits-Analyse (fail2ban)
Ausstehend — Phase 3 & 4
| Maßnahme | Beschreibung |
|---|---|
| Suricata (CT ~130) | Netzwerk-IDS im NFQUEUE-Mode, Emerging Threats Ruleset |
| Wazuh (CT ~131) | Host-IDS, File Integrity Monitoring, Rootkit-Erkennung, Agents auf allen Nodes |
| CrowdSec AppSec | HTTP-WAF-Komponente in LAPI (OWASP Top 10) |