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": "Alerts",
"license": "License",
"settings": "Settings",
"crowdsec": "CrowdSec IDS",
"section": {
"overview": "Overview",
"routing": "Routing",
@@ -1679,5 +1680,82 @@
"next": "Next",
"showing": "Row {{from}}{{to}}"
}
},
"cs": {
"title": "CrowdSec IDS",
"intro": "Collaborative intrusion detection: log-based detection + community blocklists via nftables bouncer.",
"notInstalled": "CrowdSec is not installed. Please install the crowdsec + crowdsec-firewall-bouncer-nftables packages.",
"status": {
"agent": "Agent",
"bouncer": "Bouncer",
"decisions": "Active bans",
"alerts": "Alerts",
"running": "Active",
"stopped": "Stopped",
"notInstalled": "Not installed"
},
"tabs": {
"decisions": "Decisions",
"alerts": "Alerts",
"bouncers": "Bouncers",
"machines": "Machines",
"collections": "Collections"
},
"decision": {
"ip": "IP address",
"reason": "Reason",
"origin": "Origin",
"duration": "Duration",
"country": "Country",
"as": "AS name",
"type": "Type",
"unban": "Unban",
"banModal": "Manual ban",
"banBtn": "Ban IP",
"confirmUnban": "Really unban IP {{ip}}?",
"addSuccess": "IP {{ip}} has been banned.",
"deleteSuccess": "Ban removed."
},
"alert": {
"id": "ID",
"scenario": "Scenario",
"events": "Events",
"sourceIP": "Source IP",
"country": "Country",
"start": "Start",
"stop": "End",
"delete": "Dismiss",
"confirmDelete": "Really dismiss alert #{{id}}?"
},
"bouncer": {
"name": "Name",
"ip": "IP",
"validKey": "Key valid",
"version": "Version",
"lastPull": "Last pull",
"type": "Type",
"delete": "Remove",
"confirmDelete": "Really remove bouncer {{name}}?"
},
"machine": {
"id": "Machine ID",
"created": "Created",
"lastPush": "Last push",
"validated": "Validated",
"version": "Version",
"delete": "Remove",
"confirmDelete": "Really remove machine {{id}}?"
},
"collection": {
"name": "Collection",
"status": "Status",
"version": "Version",
"author": "Author",
"install": "Install",
"remove": "Remove",
"enabled": "Installed",
"disabled": "Not installed",
"confirmRemove": "Really remove collection {{name}}?"
}
}
}