Files
breakpilot-compliance/backend-compliance/compliance/services/doc_checks/tom_annex_checks.py
T
Benjamin Admin 0326d5baab feat(vendor-assessment): AVV/SCC/TOM/Sub-Processor checklists + assessment service
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>
2026-05-12 23:14:54 +02:00

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.",
},
]