Files
breakpilot-compliance/backend-compliance/compliance/services/doc_checks/dsfa_checks.py
T
Benjamin Admin e50f3dfbee
CI / loc-budget (push) Failing after 18s
CI / secret-scan (push) Has been skipped
CI / go-lint (push) Has been skipped
Build + Deploy / build-admin-compliance (push) Successful in 9s
Build + Deploy / build-backend-compliance (push) Successful in 10s
Build + Deploy / build-ai-sdk (push) Successful in 9s
Build + Deploy / build-developer-portal (push) Successful in 8s
Build + Deploy / build-tts (push) Successful in 8s
Build + Deploy / build-document-crawler (push) Successful in 8s
Build + Deploy / build-dsms-gateway (push) Successful in 8s
Build + Deploy / build-dsms-node (push) Successful in 8s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / nodejs-build (push) Successful in 3m22s
CI / dep-audit (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / test-go (push) Failing after 49s
CI / test-python-backend (push) Successful in 43s
CI / test-python-document-crawler (push) Successful in 32s
CI / test-python-dsms-gateway (push) Successful in 26s
CI / validate-canonical-controls (push) Successful in 18s
Build + Deploy / trigger-orca (push) Successful in 2m10s
feat: All 138 hints rewritten as expert-level legal guidance
Every hint now reads like a mini-consultation from a data protection
lawyer — with specific legal references, court rulings, and common
mistakes. Examples:

- EuGH C-210/16 (Fanpage), C-298/17 (Kontaktpflicht), C-311/18 (Schrems II)
- BGH I ZR 228/03 (ladungsfaehige Anschrift), XI ZR 388/10 (AGB)
- EDSA Guidelines 2/2019 (lit. b misuse), WP 248 Rev.01 (DSFA)
- DSK-Orientierungshilfe, CNIL-Leitlinien, SDM, BSI-IT-Grundschutz
- §25 TDDDG, §38 BDSG, §309 BGB, §312k BGB, Art. 246a EGBGB

This is the core value proposition: no lawyer can deliver this level
of specific, actionable compliance feedback in 60 seconds.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-07 17:13:37 +02:00

256 lines
14 KiB
Python

"""
DSFA checks — Art. 35 DSGVO (Datenschutz-Folgenabschaetzung).
Level 1: Pflichtangabe erwaehnt?
Level 2: Pflichtangabe korrekt/vollstaendig?
"""
DSFA_CHECKLIST = [
# ── L1: Schwellwertanalyse ────────────────────────────────────────
{
"id": "trigger",
"label": "Schwellwertanalyse / Ausloesepruefung (Art. 35(1))",
"level": 1, "parent": None,
"patterns": [
r"art\.\s*35\s*(?:abs|absatz)?\s*\.?\s*1",
r"hohes\s+risiko",
r"voraussichtlich.*risiko",
r"schwellwert",
r"folgen.*(?:verarbeitung|schutz).*personenbezogen",
],
"severity": "HIGH",
"hint": "Pruefen Sie die DSK-Blacklist (Positivliste der Aufsichtsbehoerden) und die EDSA-Leitlinien WP 248 Rev.01: Treffen 2+ Kriterien zu (z.B. Profiling, systematische Ueberwachung, grosse Datenmenge), ist die DSFA nach Art. 35(1) DSGVO Pflicht.",
},
# ── L1: Beschreibung der Verarbeitungsvorgaenge ───────────────────
{
"id": "description",
"label": "Beschreibung der Verarbeitungsvorgaenge (Art. 35(7)(a))",
"level": 1, "parent": None,
"patterns": [
r"beschreibung.*verarbeitung", r"verarbeitungsvorg(?:ae|ä)ng",
r"systematische\s+beschreibung", r"gegenstand.*verarbeitung",
r"social\s*media.*(?:angebot|nutzung|besteht\s+aus)",
r"(?:kan(?:ae|ä)le|plattform).*(?:facebook|twitter|instagram|youtube|linkedin|xing)",
],
"severity": "HIGH",
"hint": "Art. 35(7)(a) DSGVO verlangt eine 'systematische Beschreibung'. Nutzen Sie die Struktur der EDSA-Leitlinien: Art der Verarbeitung, Umfang (Datenkategorien, Betroffenenanzahl), Kontext (Umstaende), Zweck und Rechtsgrundlage. Ein Datenflussdiagramm wird von LfDI-Behoerden empfohlen.",
},
{
"id": "processing_named",
"label": "Konkreter Verarbeitungsvorgang benannt",
"level": 2, "parent": "description",
"patterns": [
r"(?:betrieb|nutzung|verwaltung|pflege)\s+(?:der|von|unserer|eines)\s+(?:seite|profil|kan(?:ae|ä)l|account|fanpage|pr(?:ae|ä)senz)",
r"(?:verarbeitung|erhebung|speicherung)\s+(?:von|der)\s+(?:nutzerdaten|personenbezogen|besucher|mitglieder)",
r"(?:angebot|social[\-\s]?media[\-\s]?angebot).*(?:besteht\s+aus|umfasst|beinhaltet)",
r"kan(?:ae|ä)le\w*\s+(?:facebook|twitter|instagram|youtube|linkedin|xing)",
],
"severity": "LOW",
"hint": "Benennen Sie den Verarbeitungsvorgang konkret, z.B. 'Betrieb einer Facebook-Fanpage inkl. Page Insights' oder 'Videobeobachtung oeffentlicher Bereiche'. Abstrakte Beschreibungen wie 'Nutzung von Social Media' genuegen nicht den Anforderungen der DSK.",
},
# ── L1: Notwendigkeit / Verhaeltnismaessigkeit ────────────────────
{
"id": "necessity",
"label": "Notwendigkeit und Verhaeltnismaessigkeit (Art. 35(7)(b))",
"level": 1, "parent": None,
"patterns": [
r"notwendigkeit", r"verh(?:ae|ä)ltnism(?:ae|ä)(?:ss|ß)igkeit",
r"erforderlichkeit", r"zweckbindung",
r"geringen?\s+umfang",
r"nur\s+(?:die|sehr).*daten.*(?:verarbeitet|erhoben)",
r"freiwillig\s+angegeben",
],
"severity": "HIGH",
"hint": "Art. 35(7)(b) DSGVO: Pruefen Sie Erforderlichkeit (gibt es mildere Mittel?), Zweckbindung (Art. 5(1)(b)) und Datenminimierung (Art. 5(1)(c)). Bei Social-Media-DSFA: Begruenden Sie, warum eine Fanpage noetig ist und nicht z.B. eine eigene Website genuegt.",
},
{
"id": "legal_basis_dsfa",
"label": "Rechtsgrundlage fuer die Verarbeitung",
"level": 2, "parent": "necessity",
"patterns": [
r"rechtsgrundlage.*(?:art\.\s*6|berechtigte|einwilligung)",
r"art\.\s*6\s*(?:abs\.\s*)?1\s*(?:lit\.\s*)?[a-f]",
r"(?:einwilligung|vertrag|berechtigt).*(?:rechtsgrundlage|grundlage)",
],
"severity": "LOW",
"hint": "Die Rechtsgrundlage ist Teil der Verhaeltnismaessigkeitspruefung. Bei Art. 6(1) lit. f (berechtigtes Interesse) muss die Interessenabwaegung dokumentiert werden. Bei Art. 9-Daten (z.B. Gesundheit, politische Meinungen) ist zusaetzlich Art. 9(2) DSGVO zu pruefen.",
},
# ── L1: Risikobewertung ───────────────────────────────────────────
{
"id": "risks",
"label": "Risikobewertung fuer Betroffene (Art. 35(7)(c))",
"level": 1, "parent": None,
"patterns": [
r"risiko.*(?:bewertung|analyse|einsch(?:ae|ä)tzung|abw(?:ae|ä)gung)",
r"risiken.*(?:rechte|freiheit)",
r"eintrittswahrscheinlichkeit",
r"schwere.*(?:risiko|auswirkung)",
r"hohes\s+risiko.*(?:rechte|freiheit)",
r"systematische\s+beobachtung",
],
"severity": "HIGH",
"hint": "Art. 35(7)(c) DSGVO: Verwenden Sie eine Risikomatrix (Eintrittswahrscheinlichkeit x Schadenshoehe). Die DSK empfiehlt das SDM (Standard-Datenschutzmodell) mit den Schutzzielen: Vertraulichkeit, Integritaet, Verfuegbarkeit, Nichtverkettbarkeit, Transparenz, Intervenierbarkeit.",
},
{
"id": "risk_probability",
"label": "Eintrittswahrscheinlichkeit bewertet",
"level": 2, "parent": "risks",
"patterns": [
r"eintrittswahrscheinlichkeit",
r"(?:wahrscheinlichkeit|likelihood)\s*[:\|]",
r"(?:gering|mittel|hoch)\w*\s+(?:wahrscheinlichkeit|eintritt)",
],
"severity": "MEDIUM",
"hint": "Nutzen Sie eine 4-stufige Skala (gering/mittel/hoch/sehr hoch) analog zum CNIL-DSFA-Tool oder dem BSI-IT-Grundschutz. Die Eintrittswahrscheinlichkeit muss je Risiko einzeln bewertet und nachvollziehbar begruendet werden.",
},
{
"id": "risk_severity",
"label": "Schwere/Auswirkung bewertet",
"level": 2, "parent": "risks",
"patterns": [
r"(?:schwere|auswirkung|schadensh(?:oe|ö)he|schadenpotential|schadenpotenzial)\s*[:\|]",
r"(?:gering|mittel|hoch|kritisch)\w*\s+(?:schwere|auswirkung|schaden)",
r"(?:physisch|materiell|immateriell)\w*\s+(?:schaden|nachteil|beeintr(?:ae|ä)chtigung)",
r"schadensschwere",
r"(?:risiko|gefahr).*(?:gering|mittel|hoch|wesentlich|begrenzt)",
],
"severity": "MEDIUM",
"hint": "EG 75 DSGVO nennt konkrete Schadensbeispiele: Diskriminierung, Identitaetsdiebstahl, finanzielle Verluste, Rufschaedigung, Verlust der Vertraulichkeit bei Berufsgeheimnissen. Bewerten Sie physische, materielle UND immaterielle Schaeden getrennt.",
},
# ── L1: Abhilfemassnahmen ─────────────────────────────────────────
{
"id": "measures",
"label": "Abhilfemassnahmen (Art. 35(7)(d))",
"level": 1, "parent": None,
"patterns": [
r"abhilfe", r"(?:ma(?:ss|ß)nahm).*(?:risiko|schutz|minderung)",
r"schutzma(?:ss|ß)nahm",
r"(?:technisch|organisatorisch).*ma(?:ss|ß)nahm",
r"tom",
r"risiko.*(?:minim|reduz|begrenzen)",
],
"severity": "HIGH",
"hint": "Art. 35(7)(d) DSGVO: Ordnen Sie jedem identifizierten Risiko konkrete Abhilfemassnahmen zu. Orientieren Sie sich am SDM (Standard-Datenschutzmodell) der DSK. Das Restrisiko nach Umsetzung der Massnahmen muss explizit bewertet werden.",
},
{
"id": "tom_encryption",
"label": "Verschluesselung als Massnahme",
"level": 2, "parent": "measures",
"patterns": [
r"verschl(?:ue|ü)sselung|encryption|ssl|tls|https",
r"(?:transport|ende[\-\s]zu[\-\s]ende)[\-\s]?verschl(?:ue|ü)sselung",
],
"severity": "LOW",
"hint": "Art. 32(1)(a) DSGVO nennt Verschluesselung ausdruecklich als Massnahme. Dokumentieren Sie konkret: TLS 1.2+ fuer Transport, AES-256 fuer Speicherung, ggf. E2E-Verschluesselung. Bei Social Media: Weisen Sie auf HTTPS-Erzwingung der Plattform hin.",
},
{
"id": "tom_pseudonymization",
"label": "Pseudonymisierung als Massnahme",
"level": 2, "parent": "measures",
"patterns": [
r"pseudonymisierung|anonymisierung",
r"(?:pseudonymisiert|anonymisiert).*(?:daten|verarbeit)",
],
"severity": "LOW",
"hint": "Art. 25(1) DSGVO (Privacy by Design) nennt Pseudonymisierung als Leitbeispiel. Unterscheiden Sie korrekt: Pseudonymisierung (Zuordnung noch moeglich, DSGVO gilt) vs. Anonymisierung (kein Personenbezug mehr, DSGVO gilt nicht). Bei Insights: Aggregation genuegt oft als Anonymisierung.",
},
{
"id": "tom_access_control",
"label": "Zugriffskontrolle als Massnahme",
"level": 2, "parent": "measures",
"patterns": [
r"zugriffskontrolle|zugangskontrolle|zutrittskontrolle",
r"(?:berechtigungs|rollen).*(?:konzept|management|vergabe)",
r"(?:need[\-\s]to[\-\s]know|least\s+privilege|minimalprinzip)",
],
"severity": "LOW",
"hint": "Dokumentieren Sie ein Berechtigungskonzept nach dem Need-to-know-Prinzip (Art. 32(1)(b) DSGVO). Bei Social Media: Wer hat Admin-Zugriff auf die Fanpage? Wie oft werden Zugriffsrechte geprueft? Mehrstufige Rollenkonzepte (Admin, Editor, Analyst) empfohlen.",
},
{
"id": "tom_logging",
"label": "Protokollierung/Logging als Massnahme",
"level": 2, "parent": "measures",
"patterns": [
r"(?:protokollierung|logging|audit[\-\s]?trail|nachvollziehbarkeit)",
r"(?:zugriff|(?:ae|ä)nderung).*(?:protokoll|logging|nachvollzieh)",
],
"severity": "LOW",
"hint": "Protokollierung dient der Nachweispflicht nach Art. 5(2) DSGVO (Accountability). Dokumentieren Sie: Was wird geloggt (Zugriffe, Aenderungen, Loeschungen), wie lange werden Logs aufbewahrt, wer hat Zugriff auf die Logs. Achtung: Logs selbst sind personenbezogene Daten.",
},
# ── L1: Landesbehoerden ───────────────────────────────────────────
{
"id": "lfdi",
"label": "Beruecksichtigung Landesbehoerden-Richtlinie",
"level": 1, "parent": None,
"patterns": [
r"l(?:an)?fdi", r"landesbeauftragt.*datenschutz",
r"landes.?datenschutz",
r"richtlinie.*(?:land|lfdi|landes)",
r"(?:aufsichtsbeh(?:oe|ö)rde|beh(?:oe|ö)rde).*(?:richtlinie|empfehlung|vorgabe)",
],
"severity": "MEDIUM",
"hint": "Die DSK hat eine Positivliste (Blacklist) nach Art. 35(4) DSGVO veroeffentlicht, die DSFA-pflichtige Verarbeitungen auflistet. Zusaetzlich hat jedes Bundesland eigene LfDI-Empfehlungen — z.B. der LfDI BaWue zu Social-Media-Fanpages. Pruefen und zitieren Sie die fuer Sie zustaendige Behoerde.",
},
# ── L1: Einbeziehung DSB ──────────────────────────────────────────
{
"id": "stakeholders",
"label": "Einbeziehung des DSB (Art. 35(2))",
"level": 1, "parent": None,
"patterns": [
r"datenschutzbeauftragt.*(?:einbez|konsult|beteilig|rat)",
r"dsb.*(?:konsult|einbez|rat)",
r"stellungnahme.*dsb",
r"(?:rat|empfehlung).*datenschutzbeauftragt",
],
"severity": "MEDIUM",
"hint": "Art. 35(2) DSGVO: 'Der Verantwortliche holt bei der Durchfuehrung einer DSFA den Rat des DSB ein.' Die Nichtbeteiligung des DSB ist ein eigener Verstoss (Art. 83(4)(a) DSGVO). Dokumentieren Sie Datum, Form und Ergebnis der Konsultation.",
},
{
"id": "dsb_opinion_documented",
"label": "DSB-Stellungnahme dokumentiert",
"level": 2, "parent": "stakeholders",
"patterns": [
r"stellungnahme.*(?:dsb|datenschutzbeauftragt)",
r"(?:dsb|datenschutzbeauftragt).*(?:stellungnahme|empfiehlt|bewertet|best(?:ae|ä)tigt)",
r"(?:empfehlung|beurteilung|einsch(?:ae|ä)tzung)\s+(?:des|der)\s+(?:dsb|datenschutzbeauftragt)",
],
"severity": "LOW",
"hint": "Die DSB-Stellungnahme sollte enthalten: Bewertung der Risiken, Empfehlung zu Massnahmen, Einschaetzung ob Restrisiko akzeptabel ist. Falls der DSB Bedenken aeussert und die Verarbeitung dennoch erfolgt, ist dies nach Art. 39(1)(c) DSGVO besonders zu dokumentieren.",
},
# ── L1: Dokumentation ─────────────────────────────────────────────
{
"id": "documentation",
"label": "Dokumentation der Ergebnisse",
"level": 1, "parent": None,
"patterns": [
r"(?:dokument|ergebnis|bericht).*(?:dsfa|folgenabsch(?:ae|ä)tzung)",
r"(?:ergebnis|schlussfolgerung|bewertung).*(?:risiko|verarbeitung)",
r"vorliegend.*(?:dsfa|analyse|bewertung|absch(?:ae|ä)tzung)",
r"\d\.\)\s*ergebnis",
r"(?:risiko|gefahr).*(?:gering|mittel|hoch).*(?:einstufen|bewerten|einsch(?:ae|ä)tz)",
r"(?:gering|mittel|hoch).*(?:einzustufen|zu\s+bewerten)",
],
"severity": "MEDIUM",
"hint": "Dokumentieren Sie das Ergebnis eindeutig: Ist das Restrisiko nach Umsetzung der Massnahmen tragbar? Falls das Restrisiko 'hoch' bleibt, ist vor Beginn der Verarbeitung die Aufsichtsbehoerde nach Art. 36 DSGVO (vorherige Konsultation) zu befragen.",
},
{
"id": "review_cycle",
"label": "Ueberpruefungszyklus/Review-Termin",
"level": 2, "parent": "documentation",
"patterns": [
r"(?:ueberpr(?:ue|ü)f|überpr(?:ue|ü)f|review|aktualisierung).*(?:zyklus|turnus|j(?:ae|ä)hrlich|regelm(?:ae|ä)(?:ss|ß)ig|termin)",
r"(?:regelm(?:ae|ä)(?:ss|ß)ig|j(?:ae|ä)hrlich|quartal|halbjahr).*(?:ueberpr(?:ue|ü)f|überpr(?:ue|ü)f|review|aktualisier)",
r"n(?:ae|ä)chste\s+(?:ueberpr(?:ue|ü)fung|überprüfung|review)",
],
"severity": "LOW",
"hint": "Art. 35(11) DSGVO: Die DSFA ist regelmaessig zu ueberpruefen. Best Practice: Jaehrliche Review + anlassbezogen bei wesentlichen Aenderungen (neue Plattform, geaenderte AGB der Plattform, neue Rechtsprechung). Legen Sie einen konkreten naechsten Prueftermin fest.",
},
]