Commit Graph

1 Commits (efecd26e31ab98a159327716ee6183da305a793e)

Author SHA1 Message Date
boban efecd26e31 feat(firewall): full UFW rule management + read-only firewalld view
The server-detail page gains a "Firewall-Regeln" panel — addressing "ich kann nur
aktivieren, sonst nichts": list rules, add, and delete, with hard SSH-lockout guards.

FirewallService:
- status(): one privileged read — installed/active, default policies, and the rule
  list. ufw rules come from `ufw show added` (add-syntax, works active OR inactive),
  defaults from /etc/default/ufw; a CLUSEV_FWREAD_OK sentinel + a "Status:" check
  distinguish a real read from a failed/empty one.
- addRule(): validated action/proto/port/from (proto before `from`, ufw grammar);
  refuses deny/reject on the SSH port or portless (would block all inbound).
- deleteRule(): whitelists the spec against rules ufw actually reported (injection-
  proof — a forged spec can't match), deletes by spec (race-free, no rule number),
  guards SSH-port allow rules incl. ranges and trailing comments, distinguishes
  not_found from a real deletion so the audit only records true deletions.

firewalld is READ-ONLY this release: status() reads the runtime state of every active
zone (ports/services/rich rules, zone-attributed), rule mutation is refused with a
German note. on/off + hardening (Phase A) still work.

UI: x-panel with default-policy badges, "+ Regel" (modal modals.firewall-rule), per-
rule delete via R5 ConfirmAction (audit deferred to the real outcome), graceful
read-error / not-installed / inactive / firewalld-read-only states.

Fix: the firewall row's tone variable was renamed $tone -> $ruleTone — the page-level
$tone is a closure used by the gauges/Volumes panel; reusing the name clobbered it and
500'd the page below the firewall block. R12 now confirms the full loaded page.

Default-policy EDITING was intentionally not exposed (highest lockout risk).
Pint clean; Codex review clean; R12 — server-detail HTTP 200, 0 console errors,
firewall panel + rules + volumes all render.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 19:53:52 +02:00