Statt manueller SecRuleRemoveById-IDs kann man pro Domain offizielle OWASP-CRS- Exclusion-Plugins aktivieren — pfad-genaue, upstream-gepflegte App-Ausnahmen. - Migration 0046: waf_configs.crs_plugins text[]. - Engine (engine.go): je gewähltem Plugin werden config/before VOR den CRS-Rules und after DANACH inkludiert (exakt nach OWASP-CRS-Plugin-Spec); nur die für DIESE Domain gewählten, nur wenn die Datei existiert. Whitelist KnownCRSPlugins. - Handler: crs_plugins im Upsert-Body + Whitelist-Validierung (Include-Pfad- Injection-Schutz). - Packaging (postinst): lädt die Plugins (coreruleset/<name>-plugin) nach <crs>/plugins/ — self-healing auf jedem configure, nur fehlende. - UI: Multi-Select „App-Profile (CRS-Plugins)" im WAF-Config-Drawer. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
25 lines
1.5 KiB
Go
25 lines
1.5 KiB
Go
package models
|
||
|
||
import "time"
|
||
|
||
// WafConfig holds the per-domain WAF policy.
|
||
// Default on creation: enabled=false, mode=detection, paranoia_level=1.
|
||
type WafConfig struct {
|
||
ID int64 `gorm:"primaryKey" json:"id"`
|
||
DomainID int64 `gorm:"column:domain_id;uniqueIndex" json:"domain_id"`
|
||
Enabled bool `gorm:"column:enabled" json:"enabled"`
|
||
Mode string `gorm:"column:mode" json:"mode"` // "detection" | "blocking"
|
||
ParanoiaLevel int `gorm:"column:paranoia_level" json:"paranoia_level"` // 1–4
|
||
RuleExclusions []string `gorm:"column:rule_exclusions;type:text[]" json:"rule_exclusions"`
|
||
// CRSPlugins: aktivierte OWASP-CRS-App-Exclusion-Plugins (z. B.
|
||
// "nextcloud","wordpress"). Der Renderer inkludiert je Plugin dessen
|
||
// config/before/after-Dateien aus <crsDir>/plugins/.
|
||
CRSPlugins []string `gorm:"column:crs_plugins;type:text[]" json:"crs_plugins"`
|
||
ExclusionNotes map[string]string `gorm:"column:exclusion_notes;type:jsonb" json:"exclusion_notes"` // rule_id → note
|
||
TrustedProxies []string `gorm:"column:trusted_proxies;type:text[]" json:"trusted_proxies"`
|
||
CustomRules string `gorm:"column:custom_rules" json:"custom_rules"`
|
||
UpdatedAt time.Time `gorm:"column:updated_at" json:"updated_at"`
|
||
}
|
||
|
||
func (WafConfig) TableName() string { return "waf_configs" }
|