# Control Dependency Engine Generische Engine zur Modellierung und Auswertung von Abhaengigkeiten zwischen Compliance Controls. Stellt sicher, dass Controls nicht isoliert bewertet werden, sondern im Kontext ihrer logischen Beziehungen. **Datei:** `control-pipeline/services/dependency_engine.py` **Generator:** `control-pipeline/services/dependency_generator.py` **Domain Packs:** `control-pipeline/data/domain_packs/` **API:** `/v1/dependencies/` --- ## Motivation Ohne Dependency-Logik: - System fordert Schulung obwohl Vertrag vorhanden - Kunde verliert Vertrauen - Falsche Findings, unnoetige Massnahmen Mit Dependency-Logik: - "Control B wurde nicht geprueft, weil Control A bestanden hat" - "Control C ist fehlgeschlagen, aber durch Control E kompensiert" - Korrekte Audit-Ergebnisse, weniger False Positives --- ## 5 Dependency-Typen (v1) ```mermaid flowchart LR subgraph Stark A[supersedes Prio=10] B[scope_exclusion Prio=20] end subgraph Mittel C[prerequisite Prio=50] D[conditional_requirement Prio=70] end subgraph Schwach E[compensating_control Prio=80] end ``` | Typ | Prioritaet | Bedeutung | Beispiel | |-----|-----------|-----------|---------| | `supersedes` | 10 | A macht B ueberfluessig | GHV-Klausel → Schulung | | `scope_exclusion` | 20 | A schliesst B aus | Kein KI → KI-Controls | | `prerequisite` | 50 | A muss vor B existieren | Policy definieren → implementieren | | `conditional_requirement` | 70 | B nur unter Bedingung | Enhanced Logging nur fuer Grosse | | `compensating_control` | 80 | A kompensiert B-Failure | ISO-Cert → Einzelcontrols | --- ## Condition Language Jede Dependency hat eine `condition` (JSONB) die gegen einen Kontext ausgewertet wird: ### Einfache Bedingung ```json {"field": "source.status", "op": "==", "value": "pass"} ``` ### Zusammengesetzte Bedingung ```json { "operator": "AND", "clauses": [ {"field": "source.status", "op": "==", "value": "pass"}, {"field": "context.company_size", "op": "in", "value": ["large", "enterprise"]} ] } ``` ### Negation ```json { "operator": "NOT", "clause": {"field": "context.scope_signals", "op": "contains", "value": "uses_ai"} } ``` ### Verfuegbare Felder | Feld | Beschreibung | |------|-------------| | `source.status` | Status des Quell-Controls | | `target.status` | Status des Ziel-Controls | | `context.industry` | Branche des Unternehmens | | `context.company_size` | Unternehmensgroesse | | `context.scope_signals` | Scope-Signale (Liste) | ### Operatoren `==`, `!=`, `in`, `not_in`, `>`, `<`, `>=`, `<=`, `contains`, `AND`, `OR`, `NOT` --- ## Evaluation-Algorithmus ```mermaid flowchart TD A[Alle Dependencies laden] --> B[Zyklen erkennen DFS] B --> C{Zyklen?} C -->|Ja| D[Betroffene Controls = review_required] C -->|Nein| E[Topologisch sortieren] E --> F[Fuer jedes Control:] F --> G[Conditions pruefen] G --> H[Matching Effects sammeln] H --> I[Hoechste Prioritaet gewinnt] I --> J[Status setzen + Trace schreiben] ``` ### Priority-basierte Konfliktloesung Wenn mehrere Dependencies auf dasselbe Control wirken, gewinnt die mit der **niedrigsten** Prioritaetsnummer: - `scope_exclusion` (Prio 20) schlaegt `compensating_control` (Prio 80) - `supersedes` (Prio 10) schlaegt alles ### Cycle Detection Zyklen (A → B → A) werden via DFS erkannt. Betroffene Controls erhalten `review_required` mit Confidence 0.5. --- ## Automatische Generierung ### 1. Ontology-basiert Controls mit gleichem `normalized_object` und verschiedenen Lifecycle-Phasen: ``` define:access_policy (Phase 2) → prerequisite fuer → implement:access_policy (Phase 4) → prerequisite fuer → test:access_policy (Phase 8) ``` ### 2. Pattern-basiert | Regel | Source | Target | Dependency | |-------|--------|--------|-----------| | define_before_implement | define | implement | prerequisite | | implement_before_monitor | implement/configure | monitor/test | prerequisite | | define_before_enforce | define | enforce | prerequisite | | train_before_review | train | review/assess | prerequisite | ### 3. Domain Packs (YAML) Regulierungsspezifische Regeln in YAML-Dateien: **DSGVO (`gdpr.yaml`):** - Verarbeitungsverzeichnis → DSFA (prerequisite) - Rechtsgrundlage → Datenverarbeitung (prerequisite) **Security (`security.yaml`):** - MFA → Passwortkomplexitaet (compensating_control) - ISO-Cert → Einzelcontrols (compensating_control) **AI Act (`ai_act.yaml`):** - Risikoklassifizierung → High-Risk-Anforderungen (prerequisite) - FRIA → KI-Einsatz (prerequisite) **CRA (`cra.yaml`):** - SBOM → Vulnerability Monitoring (prerequisite) - CE-Zertifizierung → Einzelnachweise (compensating_control) **Arbeitsrecht (`labor_contracts.yaml`):** - GHV-Klausel → Schulung (supersedes) - Erstschulung → Nachschulung (prerequisite) --- ## API Endpoints | Methode | Pfad | Beschreibung | |---------|------|-------------| | `GET` | `/v1/dependencies/` | Dependencies auflisten (filterbar) | | `POST` | `/v1/dependencies/` | Dependency manuell erstellen | | `DELETE` | `/v1/dependencies/{id}` | Dependency deaktivieren | | `POST` | `/v1/dependencies/generate` | Auto-Generierung (dry_run default) | | `POST` | `/v1/dependencies/evaluate` | Controls evaluieren | | `GET` | `/v1/dependencies/evaluate/{run_id}` | Ergebnisse abrufen | | `POST` | `/v1/dependencies/validate` | Zyklen pruefen | | `GET` | `/v1/dependencies/graph` | Graph (Nodes + Edges) | --- ## DB-Schema ### `control_dependencies` | Spalte | Typ | Beschreibung | |--------|-----|-------------| | `id` | UUID | Primaerschluessel | | `source_control_id` | UUID FK | Quell-Control | | `target_control_id` | UUID FK | Ziel-Control (wird beeinflusst) | | `dependency_type` | VARCHAR(30) | Typ (5 Werte) | | `condition` | JSONB | Generische Bedingung | | `effect` | JSONB | Effekt bei Bedingung=true | | `priority` | INT | Niedrig = hohe Prioritaet | | `generation_method` | VARCHAR(30) | manual / ontology / pattern / domain_pack | | `is_active` | BOOLEAN | Soft-Delete | ### `control_evaluation_results` | Spalte | Typ | Beschreibung | |--------|-----|-------------| | `control_id` | UUID FK | Ausgewertetes Control | | `evaluation_run_id` | UUID | Gruppiert einen Lauf | | `raw_status` | VARCHAR(30) | Status vor Dependencies | | `resolved_status` | VARCHAR(30) | Status nach Dependencies | | `dependency_resolution` | JSONB | Vollstaendiger Trace | | `confidence` | FLOAT | 0.0-1.0 | --- ## Tests | Testdatei | Tests | Beschreibung | |-----------|-------|-------------| | `test_dependency_engine.py` | 39 | Condition Evaluator, Effect Applier, Cycle Detection, Topological Sort, GHV-Szenario | | `test_dependency_generator.py` | 14 | Ontology, Pattern, Domain Pack Generation |