Debian
cdbb62ee1a
harden(api): Slowloris-Timeout + gosec-Security-Audit + waf-Purge-Bugfix — v1.3.2
...
Go-Quality-Baseline-Rollout, Security-Teil:
- api: http.Server bekommt ReadHeaderTimeout (15s) + IdleTimeout (120s)
gegen Slowloris-Header-Stalls (gosec G112). ReadTimeout/WriteTimeout
bewusst offen (lang laufende Rolling-Update-/Backup-Endpoints).
- fix(waf): PurgeAlerts nutzte NOW() - ($1 || ' days')::interval mit
olderThanDays int → pgx-Encode-Error zur Laufzeit → DELETE /waf/alerts
war kaputt. Auf make_interval(days => $1) umgestellt (gleiche Bug-
Klasse wie audit-Cleanup v1.3.0). Via Lint-Aufräumen entdeckt.
- .golangci.yml: 26 gosec-Findings line-by-line auditiert. Alle sind
bewusstes Appliance-Verhalten mit Compensating Controls (Subprocess-
Args intern/validiert, Config-File-Perms daemon-lesbar, SSH opt-in
Fingerprint-Pinning, UI-Server Clean+HasPrefix-Traversal-Guard) oder
FPs (G101 Konstanten-Namen, G702/G703/G706 Taint). Dokumentiert
exclude't. gosec-Rest = 0.
- .golangci.yml: rowserrcheck/sqlclosecheck raus — database/sql-Linter,
bei durchgängigem pgx nur FPs.
gosec=0, govulncheck=0, race=0. Rest-Backlog: errcheck/noctx/staticcheck
(Code-Quality, kein Security) — folgt.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-05 23:36:37 +02:00
Debian
8a4fefee73
feat(waf): Ausnahmen mit Notiz + Ausnahmen-Liste im Drawer — v1.2.79
...
- Migration 0039: exclusion_notes JSONB in waf_configs (rule_id → note)
- Model/Service/Handler: exclusion_notes in Upsert + GET durchgereicht
- Alerts-Tab: "Als Ausnahme"-Button öffnet Modal mit Notiz-Textarea;
Notiz wird in exclusion_notes gespeichert
- Config-Drawer: Ausnahmen als Liste (Rule-ID + Notiz + Entfernen-Button)
statt rohem Textfeld; Ausnahmen nur noch via Alert-Tab hinzufügbar
- i18n EN + DE
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-03 11:31:49 +02:00
Debian
220d9d7050
feat(waf): Alerts — Regelübereinstimmungen in DB + UI — v1.2.77
...
- Migration 0038: waf_alerts-Tabelle
- AlertWriter (Buffered-Channel → async DB-Write)
- SPOE: MatchedRules → sendAlert() nach ProcessRequestHeaders()
- API: GET /waf/alerts + DELETE /waf/alerts
- WAF-Page: Tabs Domains | Alarme; Alarme-Tabelle mit Rule-ID,
Severity, Aktion (Detected/Blocked), URI, Client-IP + Purge-Button
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-03 10:40:43 +02:00
Debian
bd32bc343a
feat(waf): Phase 2 — edgeguard-waf Binary + SPOE + Coraza Engine — v1.2.67
...
- cmd/edgeguard-waf/: neues Binary — lädt WAF-Configs aus DB, startet
SPOE-Agent auf 127.0.0.1:9000, refreshed Configs alle 30s
- internal/waf/engine.go: BuildEngine() — Coraza WAF aus WafConfig bauen
(SecLang-Direktiven: RuleEngine, PL, CRS-Include, Exclusions, Custom)
- internal/waf/manager.go: Manager — per-Hostname Coraza-Engine-Cache
(thread-safe, Lazy-Init via Reload(), Port-Strip, IPv6-Brackets)
- internal/waf/spoe.go: SPOEAgent — haproxy-go SPOE-Handler
(src/method/path/query/ver/host/headers aus HAProxy-Vars,
Coraza-Transaction, Blocking: txn.waf.status=403 setzen)
- services/waf/waf.go: ListAllWithDomain() — JOIN domains+waf_configs
- go.mod: coraza/v3 v3.7.0 + dropmorepackets/haproxy-go v0.0.8
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 15:43:15 +02:00
Debian
72f793552e
feat(waf): Phase 1 — Migration + Service + Handler — v1.2.66
...
- Migration 0037: waf_configs-Tabelle (domain_id FK, enabled=false default,
mode/paranoia_level/rule_exclusions/trusted_proxies/custom_rules)
- models/waf.go: WafConfig-Model
- services/waf/waf.go: Repo (List, GetByDomain, Upsert, ListEnabled)
- handlers/waf.go: GET /waf/configs, GET /waf/configs/:id, PUT /waf/configs/:id
— GET liefert Default-Config (disabled) wenn noch kein Row existiert
- main.go: WafHandler registriert
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 15:28:29 +02:00