feat(crowdsec): CrowdSec IDS/IPS Management — v1.2.61

- Backend: internal/crowdsec/service.go — vollständige cscli-Wrapper
  (Decisions, Alerts, Bouncers, Machines, Collections, ServiceStatus)
- Handler: 12 REST-Endpoints mit Audit-Logging unter /crowdsec/*
- Migration 0036: crowdsec_settings-Tabelle
- postinst: CrowdSec-Auto-Install (crowdsec + crowdsec-firewall-bouncer-nftables)
  inkl. sudoers-Einträge für alle cscli-Operationen
- systemd: /var/lib/crowdsec in ReadWritePaths
- UI: CrowdSec-Page mit StatusStrip + 5 Tabs (Decisions, Alerts, Bouncers,
  Machines, Collections), Sidebar-Eintrag, i18n EN+DE
- firewall: flush ruleset → flush table inet edgeguard (CrowdSec-nftables-Table
  bleibt bei Firewall-Render erhalten)
- cluster: Firewall-Reload nur bei echter IP-Änderung, nicht bei jedem
  periodischen Secondary-Heartbeat (verhindert nftables-Counter-Reset)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Debian
2026-06-01 20:25:48 +02:00
parent e999eb68c2
commit 1740cb7ae2
15 changed files with 1561 additions and 8 deletions

View File

@@ -27,6 +27,7 @@
"alerts": "Alarme",
"license": "Lizenz",
"settings": "Einstellungen",
"crowdsec": "CrowdSec IDS",
"section": {
"overview": "Übersicht",
"routing": "Routing",
@@ -1679,5 +1680,82 @@
"next": "Weiter",
"showing": "Zeile {{from}}{{to}}"
}
},
"cs": {
"title": "CrowdSec IDS",
"intro": "Kollaborative Intrusion-Detection: Log-basierte Erkennung + Community-Blocklisten via nftables-Bouncer.",
"notInstalled": "CrowdSec ist nicht installiert. Bitte das Paket crowdsec + crowdsec-firewall-bouncer-nftables installieren.",
"status": {
"agent": "Agent",
"bouncer": "Bouncer",
"decisions": "Aktive Sperren",
"alerts": "Alarme",
"running": "Aktiv",
"stopped": "Gestoppt",
"notInstalled": "Nicht installiert"
},
"tabs": {
"decisions": "Entscheidungen",
"alerts": "Alarme",
"bouncers": "Bouncers",
"machines": "Maschinen",
"collections": "Collections"
},
"decision": {
"ip": "IP-Adresse",
"reason": "Grund",
"origin": "Herkunft",
"duration": "Dauer",
"country": "Land",
"as": "AS-Name",
"type": "Typ",
"unban": "Entsperren",
"banModal": "Manuell sperren",
"banBtn": "IP sperren",
"confirmUnban": "IP {{ip}} wirklich entsperren?",
"addSuccess": "IP {{ip}} wurde gesperrt.",
"deleteSuccess": "Sperre aufgehoben."
},
"alert": {
"id": "ID",
"scenario": "Szenario",
"events": "Events",
"sourceIP": "Quell-IP",
"country": "Land",
"start": "Beginn",
"stop": "Ende",
"delete": "Verwerfen",
"confirmDelete": "Alarm #{{id}} wirklich verwerfen?"
},
"bouncer": {
"name": "Name",
"ip": "IP",
"validKey": "Key gültig",
"version": "Version",
"lastPull": "Letzter Pull",
"type": "Typ",
"delete": "Entfernen",
"confirmDelete": "Bouncer {{name}} wirklich entfernen?"
},
"machine": {
"id": "Machine-ID",
"created": "Angelegt",
"lastPush": "Letzter Push",
"validated": "Validiert",
"version": "Version",
"delete": "Entfernen",
"confirmDelete": "Maschine {{id}} wirklich entfernen?"
},
"collection": {
"name": "Collection",
"status": "Status",
"version": "Version",
"author": "Author",
"install": "Installieren",
"remove": "Entfernen",
"enabled": "Installiert",
"disabled": "Nicht installiert",
"confirmRemove": "Collection {{name}} wirklich entfernen?"
}
}
}