Phase 1 — Python (klausur-service): 5 monoliths → 36 files - dsfa_corpus_ingestion.py (1,828 LOC → 5 files) - cv_ocr_engines.py (2,102 LOC → 7 files) - cv_layout.py (3,653 LOC → 10 files) - vocab_worksheet_api.py (2,783 LOC → 8 files) - grid_build_core.py (1,958 LOC → 6 files) Phase 2 — Go (edu-search-service, school-service): 8 monoliths → 19 files - staff_crawler.go (1,402 → 4), policy/store.go (1,168 → 3) - policy_handlers.go (700 → 2), repository.go (684 → 2) - search.go (592 → 2), ai_extraction_handlers.go (554 → 2) - seed_data.go (591 → 2), grade_service.go (646 → 2) Phase 3 — TypeScript (admin-lehrer): 45 monoliths → 220+ files - sdk/types.ts (2,108 → 16 domain files) - ai/rag/page.tsx (2,686 → 14 files) - 22 page.tsx files split into _components/ + _hooks/ - 11 component files split into sub-components - 10 SDK data catalogs added to loc-exceptions - Deleted dead backup index_original.ts (4,899 LOC) All original public APIs preserved via re-export facades. Zero new errors: Python imports verified, Go builds clean, TypeScript tsc --noEmit shows only pre-existing errors. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
487 lines
14 KiB
TypeScript
487 lines
14 KiB
TypeScript
/**
|
|
* Control Definitions - Operations Domains
|
|
*
|
|
* Controls for: SUBPROCESSOR, TOM, CONTRACT, DATA_SUBJECT, SECURITY, GOVERNANCE
|
|
*/
|
|
|
|
import { Control } from '../types'
|
|
|
|
// ==========================================
|
|
// SUBPROCESSOR - Unterauftragnehmer Controls
|
|
// ==========================================
|
|
|
|
export const SUBPROCESSOR_CONTROLS: Control[] = [
|
|
{
|
|
id: 'VND-SUB-01',
|
|
domain: 'SUBPROCESSOR',
|
|
title: {
|
|
de: 'Genehmigungspflicht für Unterauftragnehmer',
|
|
en: 'Approval requirement for sub-processors',
|
|
},
|
|
description: {
|
|
de: 'Einsatz von Unterauftragnehmern nur mit Genehmigung',
|
|
en: 'Use of sub-processors only with approval',
|
|
},
|
|
passCriteria: {
|
|
de: 'Genehmigungserfordernis (spezifisch oder allgemein mit Widerspruchsrecht) vereinbart',
|
|
en: 'Approval requirement (specific or general with objection right) agreed',
|
|
},
|
|
requirements: ['Art. 28 Abs. 2, 4 DSGVO'],
|
|
isRequired: true,
|
|
defaultFrequency: 'ANNUAL',
|
|
},
|
|
{
|
|
id: 'VND-SUB-02',
|
|
domain: 'SUBPROCESSOR',
|
|
title: {
|
|
de: 'Aktuelle Unterauftragnehmer-Liste',
|
|
en: 'Current sub-processor list',
|
|
},
|
|
description: {
|
|
de: 'Vollständige und aktuelle Liste aller Unterauftragnehmer',
|
|
en: 'Complete and current list of all sub-processors',
|
|
},
|
|
passCriteria: {
|
|
de: 'Liste liegt vor mit Name, Sitz, Verarbeitungszweck',
|
|
en: 'List available with name, location, processing purpose',
|
|
},
|
|
requirements: ['Art. 28 Abs. 2 DSGVO'],
|
|
isRequired: true,
|
|
defaultFrequency: 'QUARTERLY',
|
|
},
|
|
{
|
|
id: 'VND-SUB-03',
|
|
domain: 'SUBPROCESSOR',
|
|
title: {
|
|
de: 'Informationspflicht bei Änderungen',
|
|
en: 'Notification obligation for changes',
|
|
},
|
|
description: {
|
|
de: 'Information über neue oder geänderte Unterauftragnehmer',
|
|
en: 'Information about new or changed sub-processors',
|
|
},
|
|
passCriteria: {
|
|
de: 'Vorabinformation vereinbart, ausreichende Frist für Widerspruch',
|
|
en: 'Advance notification agreed, sufficient time for objection',
|
|
},
|
|
requirements: ['Art. 28 Abs. 2 DSGVO'],
|
|
isRequired: true,
|
|
defaultFrequency: 'ANNUAL',
|
|
},
|
|
{
|
|
id: 'VND-SUB-04',
|
|
domain: 'SUBPROCESSOR',
|
|
title: {
|
|
de: 'Weitergabe der Datenschutzpflichten',
|
|
en: 'Transfer of data protection obligations',
|
|
},
|
|
description: {
|
|
de: 'Datenschutzpflichten werden an Unterauftragnehmer weitergegeben',
|
|
en: 'Data protection obligations are transferred to sub-processors',
|
|
},
|
|
passCriteria: {
|
|
de: 'Vertraglich vereinbart, dass Unterauftragnehmer gleichen Pflichten unterliegen',
|
|
en: 'Contractually agreed that sub-processors are subject to same obligations',
|
|
},
|
|
requirements: ['Art. 28 Abs. 4 DSGVO'],
|
|
isRequired: true,
|
|
defaultFrequency: 'ANNUAL',
|
|
},
|
|
{
|
|
id: 'VND-SUB-05',
|
|
domain: 'SUBPROCESSOR',
|
|
title: {
|
|
de: 'Haftung für Unterauftragnehmer',
|
|
en: 'Liability for sub-processors',
|
|
},
|
|
description: {
|
|
de: 'Klare Haftungsregelung für Unterauftragnehmer',
|
|
en: 'Clear liability provision for sub-processors',
|
|
},
|
|
passCriteria: {
|
|
de: 'Auftragsverarbeiter haftet für Unterauftragnehmer wie für eigenes Handeln',
|
|
en: 'Processor is liable for sub-processors as for own actions',
|
|
},
|
|
requirements: ['Art. 28 Abs. 4 DSGVO'],
|
|
isRequired: true,
|
|
defaultFrequency: 'ANNUAL',
|
|
},
|
|
]
|
|
|
|
// ==========================================
|
|
// TOM - Technische/Organisatorische Maßnahmen
|
|
// ==========================================
|
|
|
|
export const TOM_CONTROLS: Control[] = [
|
|
{
|
|
id: 'VND-TOM-01',
|
|
domain: 'TOM',
|
|
title: {
|
|
de: 'TOM-Dokumentation vorhanden',
|
|
en: 'TOM documentation available',
|
|
},
|
|
description: {
|
|
de: 'Vollständige Dokumentation der technischen und organisatorischen Maßnahmen',
|
|
en: 'Complete documentation of technical and organizational measures',
|
|
},
|
|
passCriteria: {
|
|
de: 'TOM-Anlage vorhanden, aktuell, spezifisch für die Verarbeitung',
|
|
en: 'TOM annex available, current, specific to the processing',
|
|
},
|
|
requirements: ['Art. 28 Abs. 3 lit. c DSGVO', 'Art. 32 DSGVO'],
|
|
isRequired: true,
|
|
defaultFrequency: 'ANNUAL',
|
|
},
|
|
{
|
|
id: 'VND-TOM-02',
|
|
domain: 'TOM',
|
|
title: {
|
|
de: 'Verschlüsselung',
|
|
en: 'Encryption',
|
|
},
|
|
description: {
|
|
de: 'Angemessene Verschlüsselung für Daten in Transit und at Rest',
|
|
en: 'Appropriate encryption for data in transit and at rest',
|
|
},
|
|
passCriteria: {
|
|
de: 'TLS 1.2+ für Transit, AES-256 für at Rest',
|
|
en: 'TLS 1.2+ for transit, AES-256 for at rest',
|
|
},
|
|
requirements: ['Art. 32 Abs. 1 lit. a DSGVO'],
|
|
isRequired: true,
|
|
defaultFrequency: 'ANNUAL',
|
|
},
|
|
{
|
|
id: 'VND-TOM-03',
|
|
domain: 'TOM',
|
|
title: {
|
|
de: 'Zugriffskontrolle',
|
|
en: 'Access control',
|
|
},
|
|
description: {
|
|
de: 'Angemessene Zugriffskontrollmechanismen',
|
|
en: 'Appropriate access control mechanisms',
|
|
},
|
|
passCriteria: {
|
|
de: 'Rollenbasierte Zugriffskontrolle, Least Privilege, Logging',
|
|
en: 'Role-based access control, least privilege, logging',
|
|
},
|
|
requirements: ['Art. 32 Abs. 1 lit. b DSGVO', 'ISO 27001 A.9'],
|
|
isRequired: true,
|
|
defaultFrequency: 'ANNUAL',
|
|
},
|
|
{
|
|
id: 'VND-TOM-04',
|
|
domain: 'TOM',
|
|
title: {
|
|
de: 'Verfügbarkeit und Wiederherstellung',
|
|
en: 'Availability and recovery',
|
|
},
|
|
description: {
|
|
de: 'Maßnahmen zur Sicherstellung der Verfügbarkeit und Wiederherstellung',
|
|
en: 'Measures to ensure availability and recovery',
|
|
},
|
|
passCriteria: {
|
|
de: 'Backup-Konzept, DR-Plan, RTO/RPO definiert',
|
|
en: 'Backup concept, DR plan, RTO/RPO defined',
|
|
},
|
|
requirements: ['Art. 32 Abs. 1 lit. b, c DSGVO'],
|
|
isRequired: true,
|
|
defaultFrequency: 'ANNUAL',
|
|
},
|
|
{
|
|
id: 'VND-TOM-05',
|
|
domain: 'TOM',
|
|
title: {
|
|
de: 'Regelmäßige TOM-Überprüfung',
|
|
en: 'Regular TOM review',
|
|
},
|
|
description: {
|
|
de: 'Regelmäßige Überprüfung und Aktualisierung der TOM',
|
|
en: 'Regular review and update of TOM',
|
|
},
|
|
passCriteria: {
|
|
de: 'TOM werden mindestens jährlich überprüft und bei Bedarf aktualisiert',
|
|
en: 'TOM are reviewed at least annually and updated as needed',
|
|
},
|
|
requirements: ['Art. 32 Abs. 1 lit. d DSGVO'],
|
|
isRequired: true,
|
|
defaultFrequency: 'ANNUAL',
|
|
},
|
|
{
|
|
id: 'VND-TOM-06',
|
|
domain: 'TOM',
|
|
title: {
|
|
de: 'Penetrationstest',
|
|
en: 'Penetration testing',
|
|
},
|
|
description: {
|
|
de: 'Regelmäßige Penetrationstests der relevanten Systeme',
|
|
en: 'Regular penetration testing of relevant systems',
|
|
},
|
|
passCriteria: {
|
|
de: 'Jährlicher Pentest, kritische Findings behoben',
|
|
en: 'Annual pentest, critical findings resolved',
|
|
},
|
|
requirements: ['ISO 27001 A.12.6.1'],
|
|
isRequired: false,
|
|
defaultFrequency: 'ANNUAL',
|
|
},
|
|
]
|
|
|
|
// ==========================================
|
|
// CONTRACT - Vertragliche Grundlagen
|
|
// ==========================================
|
|
|
|
export const CONTRACT_CONTROLS: Control[] = [
|
|
{
|
|
id: 'VND-CON-01',
|
|
domain: 'CONTRACT',
|
|
title: {
|
|
de: 'Weisungsgebundenheit',
|
|
en: 'Instruction binding',
|
|
},
|
|
description: {
|
|
de: 'Auftragsverarbeiter ist an Weisungen gebunden',
|
|
en: 'Processor is bound by instructions',
|
|
},
|
|
passCriteria: {
|
|
de: 'Weisungsgebundenheit explizit vereinbart, Hinweispflicht bei rechtswidrigen Weisungen',
|
|
en: 'Instruction binding explicitly agreed, notification obligation for unlawful instructions',
|
|
},
|
|
requirements: ['Art. 28 Abs. 3 lit. a DSGVO'],
|
|
isRequired: true,
|
|
defaultFrequency: 'ANNUAL',
|
|
},
|
|
{
|
|
id: 'VND-CON-02',
|
|
domain: 'CONTRACT',
|
|
title: {
|
|
de: 'Vertraulichkeitsverpflichtung',
|
|
en: 'Confidentiality obligation',
|
|
},
|
|
description: {
|
|
de: 'Mitarbeiter sind zur Vertraulichkeit verpflichtet',
|
|
en: 'Employees are obligated to confidentiality',
|
|
},
|
|
passCriteria: {
|
|
de: 'Vertraulichkeitsverpflichtung für alle Mitarbeiter mit Datenzugriff',
|
|
en: 'Confidentiality obligation for all employees with data access',
|
|
},
|
|
requirements: ['Art. 28 Abs. 3 lit. b DSGVO'],
|
|
isRequired: true,
|
|
defaultFrequency: 'ANNUAL',
|
|
},
|
|
{
|
|
id: 'VND-CON-03',
|
|
domain: 'CONTRACT',
|
|
title: {
|
|
de: 'Gegenstand und Dauer der Verarbeitung',
|
|
en: 'Subject and duration of processing',
|
|
},
|
|
description: {
|
|
de: 'Klare Definition von Gegenstand und Dauer der Verarbeitung',
|
|
en: 'Clear definition of subject and duration of processing',
|
|
},
|
|
passCriteria: {
|
|
de: 'Verarbeitungsgegenstand, Dauer, Art der Daten, Betroffene definiert',
|
|
en: 'Processing subject, duration, type of data, data subjects defined',
|
|
},
|
|
requirements: ['Art. 28 Abs. 3 DSGVO'],
|
|
isRequired: true,
|
|
defaultFrequency: 'ANNUAL',
|
|
},
|
|
{
|
|
id: 'VND-CON-04',
|
|
domain: 'CONTRACT',
|
|
title: {
|
|
de: 'Schriftform/Textform',
|
|
en: 'Written/text form',
|
|
},
|
|
description: {
|
|
de: 'AVV in Schriftform oder elektronischem Format',
|
|
en: 'DPA in written or electronic format',
|
|
},
|
|
passCriteria: {
|
|
de: 'AVV in Schriftform oder elektronisch mit qualifizierter Signatur',
|
|
en: 'DPA in written form or electronically with qualified signature',
|
|
},
|
|
requirements: ['Art. 28 Abs. 9 DSGVO'],
|
|
isRequired: true,
|
|
defaultFrequency: 'ANNUAL',
|
|
},
|
|
]
|
|
|
|
// ==========================================
|
|
// DATA_SUBJECT - Betroffenenrechte
|
|
// ==========================================
|
|
|
|
export const DATA_SUBJECT_CONTROLS: Control[] = [
|
|
{
|
|
id: 'VND-DSR-01',
|
|
domain: 'DATA_SUBJECT',
|
|
title: {
|
|
de: 'Unterstützung bei Betroffenenrechten',
|
|
en: 'Support for data subject rights',
|
|
},
|
|
description: {
|
|
de: 'Vendor unterstützt bei der Erfüllung von Betroffenenrechten',
|
|
en: 'Vendor supports fulfillment of data subject rights',
|
|
},
|
|
passCriteria: {
|
|
de: 'Unterstützungspflicht vereinbart, Prozess zur Weiterleitung definiert',
|
|
en: 'Support obligation agreed, process for forwarding defined',
|
|
},
|
|
requirements: ['Art. 28 Abs. 3 lit. e DSGVO'],
|
|
isRequired: true,
|
|
defaultFrequency: 'ANNUAL',
|
|
},
|
|
{
|
|
id: 'VND-DSR-02',
|
|
domain: 'DATA_SUBJECT',
|
|
title: {
|
|
de: 'Reaktionszeit für Anfragen',
|
|
en: 'Response time for requests',
|
|
},
|
|
description: {
|
|
de: 'Definierte Reaktionszeit für Betroffenenanfragen',
|
|
en: 'Defined response time for data subject requests',
|
|
},
|
|
passCriteria: {
|
|
de: 'Reaktionszeit max. 5 Werktage, um Frist von 1 Monat einhalten zu können',
|
|
en: 'Response time max. 5 business days to meet 1 month deadline',
|
|
},
|
|
requirements: ['Art. 12 Abs. 3 DSGVO'],
|
|
isRequired: true,
|
|
defaultFrequency: 'ANNUAL',
|
|
},
|
|
]
|
|
|
|
// ==========================================
|
|
// SECURITY - Sicherheit
|
|
// ==========================================
|
|
|
|
export const SECURITY_CONTROLS: Control[] = [
|
|
{
|
|
id: 'VND-SEC-01',
|
|
domain: 'SECURITY',
|
|
title: {
|
|
de: 'Sicherheitsbewertung',
|
|
en: 'Security assessment',
|
|
},
|
|
description: {
|
|
de: 'Regelmäßige Sicherheitsbewertung des Vendors',
|
|
en: 'Regular security assessment of the vendor',
|
|
},
|
|
passCriteria: {
|
|
de: 'Sicherheitsfragebogen ausgefüllt, keine kritischen Lücken',
|
|
en: 'Security questionnaire completed, no critical gaps',
|
|
},
|
|
requirements: ['Art. 32 DSGVO', 'ISO 27001 A.15.2.1'],
|
|
isRequired: true,
|
|
defaultFrequency: 'ANNUAL',
|
|
},
|
|
{
|
|
id: 'VND-SEC-02',
|
|
domain: 'SECURITY',
|
|
title: {
|
|
de: 'Vulnerability Management',
|
|
en: 'Vulnerability management',
|
|
},
|
|
description: {
|
|
de: 'Etabliertes Vulnerability Management beim Vendor',
|
|
en: 'Established vulnerability management at the vendor',
|
|
},
|
|
passCriteria: {
|
|
de: 'Regelmäßige Schwachstellen-Scans, Patch-Management dokumentiert',
|
|
en: 'Regular vulnerability scans, patch management documented',
|
|
},
|
|
requirements: ['ISO 27001 A.12.6'],
|
|
isRequired: false,
|
|
defaultFrequency: 'ANNUAL',
|
|
},
|
|
{
|
|
id: 'VND-SEC-03',
|
|
domain: 'SECURITY',
|
|
title: {
|
|
de: 'Mitarbeiter-Schulung',
|
|
en: 'Employee training',
|
|
},
|
|
description: {
|
|
de: 'Datenschutz-Schulung für Mitarbeiter des Vendors',
|
|
en: 'Data protection training for vendor employees',
|
|
},
|
|
passCriteria: {
|
|
de: 'Regelmäßige Schulungen (mind. jährlich), Nachweis verfügbar',
|
|
en: 'Regular training (at least annually), proof available',
|
|
},
|
|
requirements: ['Art. 39 Abs. 1 lit. b DSGVO'],
|
|
isRequired: false,
|
|
defaultFrequency: 'ANNUAL',
|
|
},
|
|
]
|
|
|
|
// ==========================================
|
|
// GOVERNANCE - Governance
|
|
// ==========================================
|
|
|
|
export const GOVERNANCE_CONTROLS: Control[] = [
|
|
{
|
|
id: 'VND-GOV-01',
|
|
domain: 'GOVERNANCE',
|
|
title: {
|
|
de: 'Datenschutzbeauftragter benannt',
|
|
en: 'Data protection officer appointed',
|
|
},
|
|
description: {
|
|
de: 'Vendor hat DSB benannt (wenn erforderlich)',
|
|
en: 'Vendor has appointed DPO (if required)',
|
|
},
|
|
passCriteria: {
|
|
de: 'DSB benannt und Kontaktdaten verfügbar',
|
|
en: 'DPO appointed and contact details available',
|
|
},
|
|
requirements: ['Art. 37 DSGVO'],
|
|
isRequired: false,
|
|
defaultFrequency: 'ANNUAL',
|
|
},
|
|
{
|
|
id: 'VND-GOV-02',
|
|
domain: 'GOVERNANCE',
|
|
title: {
|
|
de: 'Verzeichnis der Verarbeitungstätigkeiten',
|
|
en: 'Records of processing activities',
|
|
},
|
|
description: {
|
|
de: 'Vendor führt eigenes Verarbeitungsverzeichnis',
|
|
en: 'Vendor maintains own processing records',
|
|
},
|
|
passCriteria: {
|
|
de: 'Verzeichnis nach Art. 30 Abs. 2 DSGVO vorhanden',
|
|
en: 'Records according to Art. 30(2) GDPR available',
|
|
},
|
|
requirements: ['Art. 30 Abs. 2 DSGVO'],
|
|
isRequired: true,
|
|
defaultFrequency: 'ANNUAL',
|
|
},
|
|
{
|
|
id: 'VND-GOV-03',
|
|
domain: 'GOVERNANCE',
|
|
title: {
|
|
de: 'Unterstützung bei DSFA',
|
|
en: 'Support for DPIA',
|
|
},
|
|
description: {
|
|
de: 'Vendor unterstützt bei Datenschutz-Folgenabschätzung',
|
|
en: 'Vendor supports data protection impact assessment',
|
|
},
|
|
passCriteria: {
|
|
de: 'Unterstützungspflicht bei DSFA vertraglich vereinbart',
|
|
en: 'Support obligation for DPIA contractually agreed',
|
|
},
|
|
requirements: ['Art. 28 Abs. 3 lit. f DSGVO'],
|
|
isRequired: true,
|
|
defaultFrequency: 'ANNUAL',
|
|
},
|
|
]
|