293c58d0dd
Build + Deploy / build-admin-compliance (push) Successful in 1m40s
Build + Deploy / build-backend-compliance (push) Successful in 7s
Build + Deploy / build-ai-sdk (push) Successful in 35s
Build + Deploy / build-developer-portal (push) Successful in 8s
Build + Deploy / build-tts (push) Successful in 7s
Build + Deploy / build-document-crawler (push) Successful in 8s
Build + Deploy / build-dsms-gateway (push) Successful in 7s
Build + Deploy / build-dsms-node (push) Successful in 8s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / loc-budget (push) Failing after 16s
CI / secret-scan (push) Has been skipped
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Successful in 2m50s
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / test-go (push) Failing after 40s
CI / test-python-backend (push) Successful in 37s
CI / test-python-document-crawler (push) Successful in 25s
CI / test-python-dsms-gateway (push) Successful in 23s
CI / validate-canonical-controls (push) Successful in 15s
Build + Deploy / trigger-orca (push) Successful in 2m28s
Each check now has a "hint" field explaining what is missing and what the customer should do to fix it. Hints are shown in the frontend below failed checks in red text. Examples: - "Bei Verarbeitung auf Basis von Art. 6(1)(f) muss dokumentiert werden, warum Ihr berechtigtes Interesse die Rechte der Betroffenen ueberwiegt." - "Die ladungsfaehige Anschrift fehlt. Erforderlich: Strasse, Hausnummer, PLZ und Ort." Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
249 lines
13 KiB
Python
249 lines
13 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": "Es fehlt eine Schwellwertanalyse gemaess Art. 35 Abs. 1 DSGVO. Beschreiben Sie, warum die Verarbeitung voraussichtlich ein hohes Risiko fuer die Rechte und Freiheiten natuerlicher Personen birgt und eine DSFA erforderlich ist.",
|
|
},
|
|
|
|
# ── 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": "Eine systematische Beschreibung der geplanten Verarbeitungsvorgaenge fehlt. Fuegen Sie einen Abschnitt hinzu, der Art, Umfang, Umstaende und Zweck der Verarbeitung detailliert beschreibt.",
|
|
},
|
|
{
|
|
"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|kanal|account|fanpage|pr(?:ae|ä)senz)",
|
|
r"(?:verarbeitung|erhebung|speicherung)\s+(?:von|der)\s+(?:nutzerdaten|personenbezogen|besucher|mitglieder)",
|
|
],
|
|
"severity": "LOW",
|
|
"hint": "Der konkrete Verarbeitungsvorgang ist nicht namentlich benannt. Benennen Sie den spezifischen Vorgang (z.B. Betrieb einer Fanpage, Verwaltung eines Social-Media-Kanals) explizit im Dokument.",
|
|
},
|
|
|
|
# ── 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": "Die Bewertung der Notwendigkeit und Verhaeltnismaessigkeit der Verarbeitung fehlt. Begruenden Sie, warum die Verarbeitung erforderlich ist und in einem angemessenen Verhaeltnis zum Zweck steht.",
|
|
},
|
|
{
|
|
"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 der Verarbeitung ist nicht angegeben. Nennen Sie die einschlaegige Rechtsgrundlage nach Art. 6 Abs. 1 DSGVO (z.B. Einwilligung, berechtigtes Interesse, Vertragserfuellung).",
|
|
},
|
|
|
|
# ── 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": "Eine Risikobewertung fuer die Rechte und Freiheiten der Betroffenen fehlt. Fuehren Sie eine strukturierte Risikoanalyse durch, die moegliche Schaeden und deren Auswirkungen auf die betroffenen Personen beschreibt.",
|
|
},
|
|
{
|
|
"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": "Die Eintrittswahrscheinlichkeit der identifizierten Risiken ist nicht bewertet. Ordnen Sie jedem Risiko eine Eintrittswahrscheinlichkeit zu (z.B. gering, mittel, hoch).",
|
|
},
|
|
{
|
|
"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)",
|
|
],
|
|
"severity": "MEDIUM",
|
|
"hint": "Die Schwere der moeglichen Auswirkungen auf Betroffene ist nicht bewertet. Bewerten Sie fuer jedes Risiko die Schadenshoehe (z.B. gering, mittel, hoch, kritisch) und unterscheiden Sie physische, materielle und immaterielle Schaeden.",
|
|
},
|
|
|
|
# ── 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": "Abhilfemassnahmen zur Risikominderung fehlen. Beschreiben Sie die geplanten technischen und organisatorischen Massnahmen (TOMs), mit denen die identifizierten Risiken eingedaemmt werden sollen.",
|
|
},
|
|
{
|
|
"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": "Verschluesselung ist nicht als Schutzmassnahme aufgefuehrt. Ergaenzen Sie, ob und welche Verschluesselungsverfahren eingesetzt werden (z.B. TLS-Transportverschluesselung, Ende-zu-Ende-Verschluesselung).",
|
|
},
|
|
{
|
|
"id": "tom_pseudonymization",
|
|
"label": "Pseudonymisierung als Massnahme",
|
|
"level": 2, "parent": "measures",
|
|
"patterns": [
|
|
r"pseudonymisierung|anonymisierung",
|
|
r"(?:pseudonymisiert|anonymisiert).*(?:daten|verarbeit)",
|
|
],
|
|
"severity": "LOW",
|
|
"hint": "Pseudonymisierung oder Anonymisierung ist nicht als Massnahme erwaehnt. Pruefen Sie, ob personenbezogene Daten pseudonymisiert oder anonymisiert werden koennen, und dokumentieren Sie dies.",
|
|
},
|
|
{
|
|
"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": "Zugriffskontrollmassnahmen sind nicht dokumentiert. Beschreiben Sie, wie der Zugriff auf personenbezogene Daten beschraenkt wird (z.B. Berechtigungskonzept, Rollenmodell, Need-to-know-Prinzip).",
|
|
},
|
|
{
|
|
"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 und Nachvollziehbarkeit sind nicht als Massnahme aufgefuehrt. Ergaenzen Sie, wie Zugriffe und Aenderungen an personenbezogenen Daten protokolliert und nachvollziehbar gemacht werden.",
|
|
},
|
|
|
|
# ── 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": "Es fehlt ein Verweis auf die Richtlinien der zustaendigen Landesbehoerde (LfDI). Pruefen Sie, ob Ihre Landesdatenschutzbehoerde spezifische Vorgaben oder Empfehlungen fuer diese Verarbeitung veroeffentlicht hat, und beruecksichtigen Sie diese.",
|
|
},
|
|
|
|
# ── 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": "Die Einbeziehung des Datenschutzbeauftragten (DSB) ist nicht dokumentiert. Gemaess Art. 35 Abs. 2 DSGVO muss der DSB bei der DSFA konsultiert werden — dokumentieren Sie dessen Beteiligung und Stellungnahme.",
|
|
},
|
|
{
|
|
"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 Stellungnahme des Datenschutzbeauftragten ist nicht im Dokument enthalten. Fuegen Sie die schriftliche Stellungnahme oder Empfehlung des DSB zur DSFA hinzu.",
|
|
},
|
|
|
|
# ── 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)",
|
|
],
|
|
"severity": "MEDIUM",
|
|
"hint": "Die Ergebnisse der DSFA sind nicht zusammenfassend dokumentiert. Erstellen Sie einen Ergebnisabschnitt, der die Schlussfolgerungen der Folgenabschaetzung und die Gesamtbewertung des Restrisikos festhält.",
|
|
},
|
|
{
|
|
"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": "Ein Ueberpruefungszyklus fuer die DSFA ist nicht festgelegt. Definieren Sie, in welchem Turnus die DSFA ueberprueft und aktualisiert wird (z.B. jaehrlich oder bei wesentlichen Aenderungen der Verarbeitung).",
|
|
},
|
|
]
|