-- +goose Up -- +goose StatementBegin -- Benutzerdefinierte WAF-App-Profile: benannte, wiederverwendbare Bündel von -- CRS-Rule-Exclusions (reine Rule-IDs/Ranges — keine SecLang-Ausführung, sicher). -- Wirken wie die eingebauten OWASP-Plugins, sind aber im UI erstellbar/editierbar -- und werden pro Domain zugewiesen (waf_configs.app_profiles). Die Auflösung in -- effektive SecRuleRemoveById-Zeilen passiert im WAF-Agent (ListAllWithDomain). -- -- Repliziert (Config, kein node-lokaler Zustand) → vom cluster-reconcile -- automatisch in edgeguard_shared aufgenommen (nicht in localOnlyTables). CREATE TABLE IF NOT EXISTS waf_app_profiles ( id SERIAL PRIMARY KEY, name TEXT NOT NULL UNIQUE, description TEXT NOT NULL DEFAULT '', rule_exclusions TEXT[] NOT NULL DEFAULT '{}', builtin BOOLEAN NOT NULL DEFAULT FALSE, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); -- Zuweisung Profil→Domain: Liste von Profil-Namen je waf_config. Beim Bauen der -- Engine werden ihre rule_exclusions in die effektiven Ausnahmen der Domain -- gemischt (zusätzlich zu den domain-eigenen rule_exclusions). ALTER TABLE waf_configs ADD COLUMN IF NOT EXISTS app_profiles TEXT[] NOT NULL DEFAULT '{}'; -- +goose StatementEnd -- +goose Down -- +goose StatementBegin ALTER TABLE waf_configs DROP COLUMN IF EXISTS app_profiles; DROP TABLE IF EXISTS waf_app_profiles; -- +goose StatementEnd