0326d5baab
Phase 1-3 of the Vendor Contract Assessment:
Backend checklists (Doc-Check L1/L2 engine compatible):
- avv_checks.py: 28 checks (11 L1 + 17 L2) for Art. 28(3) DSGVO
- scc_checks.py: 7 checks for EU SCC 2021 (modules, annexes, TIA)
- tom_annex_checks.py: 12 checks for Art. 32 (8 control objectives)
- sub_processor_checks.py: 7 checks for sub-processor list completeness
Assessment service:
- POST /vendor-compliance/assessments — async contract analysis
- GET /vendor-compliance/assessments/{id} — poll status
- Cross-check engine: detects missing SCC when AVV mentions third-country,
missing TOM annex, missing sub-processor list
All checklists registered in runner.py CHECKLIST_MAP (27 doc_types total).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
174 lines
8.9 KiB
Python
174 lines
8.9 KiB
Python
"""
|
|
TOM-Anlage (Technische und Organisatorische Massnahmen) checks — Art. 32 DSGVO.
|
|
|
|
Prueft die 8 klassischen Kontrollziele nach dem DSK-Standard
|
|
sowie die Art. 32(1) Anforderungen.
|
|
|
|
Level 1: Kontrollziel adressiert?
|
|
Level 2: Konkrete Massnahme beschrieben?
|
|
"""
|
|
|
|
TOM_ANNEX_CHECKLIST = [
|
|
# ── L1: Zutrittskontrolle ────────────────────────────────────────
|
|
{
|
|
"id": "tom_access_physical",
|
|
"label": "Zutrittskontrolle (physischer Zugang)",
|
|
"level": 1, "parent": None,
|
|
"patterns": [
|
|
r"zutrittskontrolle",
|
|
r"physische[rn]?\s+(?:zugang|sicherheit|zutrittskontrolle)",
|
|
r"geb(?:ae|ä)ude(?:sicherheit|zugang|zutritt)",
|
|
],
|
|
"severity": "HIGH",
|
|
"hint": "Zutrittskontrolle: Unbefugten den physischen Zugang zu Datenverarbeitungsanlagen verwehren. Beispiele: Schliessanlage, Chipkarte, Videoüberwachung, Besucherregelung.",
|
|
},
|
|
{
|
|
"id": "tom_access_physical_measures",
|
|
"label": "Konkrete Zutrittsmassnahmen benannt",
|
|
"level": 2, "parent": "tom_access_physical",
|
|
"patterns": [
|
|
r"(?:schl(?:ue|ü)ssel|chipkarte|badge|code|pin|biometr|video(?:ue|ü)berwachung|alarm|pfortner|empfang|besucher)",
|
|
r"(?:zutrittskontroll|zugangs)(?:system|anlage|konzept)",
|
|
],
|
|
"severity": "MEDIUM",
|
|
"hint": "Nicht nur 'Zutrittskontrolle vorhanden' schreiben — konkrete Massnahmen benennen (z.B. 'elektronisches Schliesssystem mit personenbezogenen Chipkarten, protokollierte Besucherregelung').",
|
|
},
|
|
|
|
# ── L1: Zugangskontrolle ─────────────────────────────────────────
|
|
{
|
|
"id": "tom_access_logical",
|
|
"label": "Zugangskontrolle (IT-Systeme)",
|
|
"level": 1, "parent": None,
|
|
"patterns": [
|
|
r"zugangskontrolle",
|
|
r"(?:authentifizierung|authentisierung|login|anmeldung)\s+(?:zu|an|fuer|bei)\s+(?:systemen|it-?systemen|anwendungen)",
|
|
r"(?:passwort|kennwort)[\s-]?(?:richtlinie|policy|politik|regelung)",
|
|
],
|
|
"severity": "HIGH",
|
|
"hint": "Zugangskontrolle: Unbefugten den Zugang zu IT-Systemen verwehren. Beispiele: Passwortrichtlinie, MFA, automatische Sperrung, VPN.",
|
|
},
|
|
{
|
|
"id": "tom_access_logical_mfa",
|
|
"label": "Multi-Faktor-Authentifizierung oder starke Passwoerter",
|
|
"level": 2, "parent": "tom_access_logical",
|
|
"patterns": [
|
|
r"(?:multi[\s-]?faktor|zwei[\s-]?faktor|2[\s-]?fa|mfa|totp|fido|yubikey)",
|
|
r"(?:passwort|kennwort)[\s\S]{0,100}(?:mindestens\s+\d+\s+zeichen|komplex|stark|sicher)",
|
|
],
|
|
"severity": "MEDIUM",
|
|
"hint": "BSI empfiehlt MFA fuer alle Administratorzugaenge. Mindestens starke Passwoerter (12+ Zeichen, Komplexitaetsanforderungen) muessen dokumentiert sein.",
|
|
},
|
|
|
|
# ── L1: Zugriffskontrolle ────────────────────────────────────────
|
|
{
|
|
"id": "tom_authorization",
|
|
"label": "Zugriffskontrolle (Berechtigungen)",
|
|
"level": 1, "parent": None,
|
|
"patterns": [
|
|
r"zugriffskontrolle",
|
|
r"(?:berechtigungs|rechte|rollen)(?:konzept|management|vergabe|system)",
|
|
r"(?:need[\s-]?to[\s-]?know|least\s+privilege|minimalprinzip)",
|
|
],
|
|
"severity": "HIGH",
|
|
"hint": "Zugriffskontrolle: Sicherstellen, dass Benutzer nur auf die Daten zugreifen koennen, fuer die sie berechtigt sind. Beispiele: Rollenkonzept (RBAC), Need-to-Know-Prinzip, regelmaessige Rechterezertifizierung.",
|
|
},
|
|
|
|
# ── L1: Weitergabekontrolle / Uebertragungssicherheit ───────────
|
|
{
|
|
"id": "tom_transfer",
|
|
"label": "Weitergabekontrolle / Verschluesselung bei Transport",
|
|
"level": 1, "parent": None,
|
|
"patterns": [
|
|
r"weitergabekontrolle",
|
|
r"(?:ue|ü)bertragungssicherheit",
|
|
r"(?:transport|uebertragung|transit)[\s-]?verschl(?:ue|ü)sselung",
|
|
r"(?:tls|ssl|https|sftp|vpn|ipsec)\s",
|
|
],
|
|
"severity": "HIGH",
|
|
"hint": "Weitergabekontrolle: Personenbezogene Daten duerfen bei elektronischer Uebertragung nicht unbefugt gelesen, kopiert oder veraendert werden. Beispiele: TLS 1.2+, VPN, verschluesselter E-Mail-Versand.",
|
|
},
|
|
{
|
|
"id": "tom_transfer_encryption",
|
|
"label": "Verschluesselungsstandard benannt (TLS, AES etc.)",
|
|
"level": 2, "parent": "tom_transfer",
|
|
"patterns": [
|
|
r"(?:tls|ssl)\s*(?:1\.[2-3]|1\.3)",
|
|
r"aes[\s-]?(?:128|256)",
|
|
r"verschl(?:ue|ü)sselung[\s\S]{0,100}(?:bit|aes|rsa|ecc|sha)",
|
|
],
|
|
"severity": "MEDIUM",
|
|
"hint": "Konkrete Standards benennen: TLS 1.2 oder hoeher (nicht 'SSL'), AES-256 fuer Verschluesselung at Rest. Stand der Technik nach Art. 32(1) DSGVO.",
|
|
},
|
|
|
|
# ── L1: Eingabekontrolle ─────────────────────────────────────────
|
|
{
|
|
"id": "tom_input",
|
|
"label": "Eingabekontrolle (Protokollierung)",
|
|
"level": 1, "parent": None,
|
|
"patterns": [
|
|
r"eingabekontrolle",
|
|
r"(?:protokollierung|logging|audit[\s-]?(?:log|trail|protokoll))",
|
|
r"(?:nachvollziehbar|nachvollziehbarkeit)\s+(?:der\s+)?(?:eingabe|aenderung|loeschung|verarbeitung)",
|
|
],
|
|
"severity": "MEDIUM",
|
|
"hint": "Eingabekontrolle: Nachtraeglich pruefen koennen, wer wann welche Daten eingegeben, geaendert oder geloescht hat. Beispiele: Audit-Logging, Versionierung, Zugriffsprotokollierung.",
|
|
},
|
|
|
|
# ── L1: Auftragskontrolle ────────────────────────────────────────
|
|
{
|
|
"id": "tom_processing_control",
|
|
"label": "Auftragskontrolle (Weisungsgebundenheit)",
|
|
"level": 1, "parent": None,
|
|
"patterns": [
|
|
r"auftragskontrolle",
|
|
r"(?:weisung|anweisung)(?:sgebunden|en)\s+(?:der\s+)?(?:mitarbeiter|besch(?:ae|ä)ftigten)",
|
|
r"(?:schulung|sensibilisierung)\s+(?:der\s+)?(?:mitarbeiter|besch(?:ae|ä)ftigten)\s+(?:zum|im|bezueglich)\s+(?:datenschutz|umgang\s+mit\s+daten)",
|
|
],
|
|
"severity": "MEDIUM",
|
|
"hint": "Auftragskontrolle: Sicherstellen, dass personenbezogene Daten nur entsprechend den Weisungen verarbeitet werden. Beispiele: Mitarbeiterschulungen, Verpflichtung auf Datengeheimnis.",
|
|
},
|
|
|
|
# ── L1: Verfuegbarkeitskontrolle ─────────────────────────────────
|
|
{
|
|
"id": "tom_availability",
|
|
"label": "Verfuegbarkeitskontrolle (Backup, Wiederherstellung)",
|
|
"level": 1, "parent": None,
|
|
"patterns": [
|
|
r"verf(?:ue|ü)gbarkeit(?:skontrolle)?",
|
|
r"(?:backup|datensicherung|wiederherstellung|disaster\s+recovery|business\s+continuity)",
|
|
r"(?:redundanz|spiegelung|replikation|georedundant)",
|
|
],
|
|
"severity": "HIGH",
|
|
"hint": "Verfuegbarkeitskontrolle: Personenbezogene Daten gegen Verlust schuetzen. Beispiele: Regelmaessige Backups, Redundanz, Disaster-Recovery-Plan, USV.",
|
|
},
|
|
|
|
# ── L1: Trennungskontrolle ───────────────────────────────────────
|
|
{
|
|
"id": "tom_separation",
|
|
"label": "Trennungskontrolle (Mandantenfaehigkeit)",
|
|
"level": 1, "parent": None,
|
|
"patterns": [
|
|
r"trennungskontrolle",
|
|
r"(?:mandantenf(?:ae|ä)higkeit|mandantentrennung|datentrennung)",
|
|
r"(?:logische|physische)\s+trennung\s+(?:der\s+)?(?:daten|systeme)",
|
|
r"(?:zweckbindung|zwecktrennung)",
|
|
],
|
|
"severity": "MEDIUM",
|
|
"hint": "Trennungskontrolle: Sicherstellen, dass Daten verschiedener Auftraggeber/Zwecke getrennt verarbeitet werden. Beispiele: Mandantenfaehige Software, getrennte Datenbanken, Berechtigungskonzept.",
|
|
},
|
|
|
|
# ── L1: Verschluesselung at Rest ─────────────────────────────────
|
|
{
|
|
"id": "tom_encryption_rest",
|
|
"label": "Verschluesselung gespeicherter Daten (at Rest)",
|
|
"level": 1, "parent": None,
|
|
"patterns": [
|
|
r"verschl(?:ue|ü)sselung[\s\S]{0,50}(?:gespeichert|ruhend|at[\s-]?rest|festplatte|datentraeger|datenbank)",
|
|
r"(?:at[\s-]?rest|ruhende\s+daten|gespeicherte\s+daten)[\s\S]{0,50}verschl(?:ue|ü)ssel",
|
|
r"(?:festplatten|datentraeger|datenbank|disk)[\s-]?verschl(?:ue|ü)sselung",
|
|
],
|
|
"severity": "HIGH",
|
|
"hint": "Art. 32(1)(a) DSGVO: Verschluesselung ist explizit als Sicherheitsmassnahme benannt. Ohne Verschluesselung at Rest ist der Schutz bei physischem Verlust von Datentraegern nicht gewaehrleistet.",
|
|
},
|
|
]
|