# Technische und Organisatorische Massnahmen (TOMs) # AZA / MedWork – Medizinische Desktop- und Backend-Anwendung **Version:** 1.0 **Stand:** 2026-02-22 **Geltungsbereich:** AZA/MedWork Gesamtsystem (Desktop-Client, Backend-Services, E-Mail-Modul, Workforce Planner) **Rechtsgrundlage:** Schweizer Datenschutzgesetz (DSG, rev. 2023), DSGVO (ergänzend) **Datenklassifikation:** Besonders schützenswerte Personendaten (Gesundheitsdaten, Art. 5 lit. c DSG) --- ## 1. Zugangskontrolle *Massnahmen, die verhindern, dass Unbefugte Zugang zu Datenverarbeitungsanlagen erhalten.* ### Implementiert | Massnahme | Umsetzung | Referenz | |-----------|-----------|----------| | Passwort-geschützter Login | Desktop-Client (basis14.py): Passwort-Dialog bei jedem Start, kein Zugriff ohne Authentifizierung | basis14.py, Zeilen 1318–1366 | | Workforce Planner: Token-basierte Authentifizierung | JWT (HS256) mit Ablaufzeit 480 Minuten, Bearer-Token in HTTP-Header | workforce_planner/api/auth.py | | Backend API-Token | API-Zugriff auf Backend-Services nur mit gültigem Token (Header X-Api-Token) | backend_main.py | | TLS-Verschlüsselung aller Backend-Services | HTTPS erzwungen für todo_server, transcribe_server, backend_main; HTTP wird abgelehnt (kein Redirect, Connection Refused) | aza_tls.py, STEP 4.1 | | Fail-Start bei fehlender TLS-Konfiguration | Server startet nicht, wenn AZA_TLS_REQUIRE=1 und Zertifikate fehlen | aza_tls.py | ### Nicht implementiert - Keine Multi-Faktor-Authentifizierung (2FA/MFA) - Keine biometrische Zugangskontrolle - Keine automatische Bildschirmsperre der Anwendung bei Inaktivität - Kein SSO-Protokoll (SAML/OAuth/OIDC) - Keine zertifikatsbasierte Client-Authentifizierung --- ## 2. Zugriffskontrolle *Massnahmen, die sicherstellen, dass Berechtigte nur auf die ihnen zugewiesenen Daten zugreifen können.* ### Implementiert | Massnahme | Umsetzung | Referenz | |-----------|-----------|----------| | Rollenbasierte Zugriffskontrolle (RBAC) | Workforce Planner: 3 Rollen (ADMIN, MANAGER, EMPLOYEE) mit Dependency-basierter Prüfung pro API-Endpunkt | workforce_planner/core/enums.py, api/auth.py | | Rollenprüfung bei schreibenden Operationen | Mitarbeiterverwaltung und Abwesenheitsmanagement erfordern ADMIN oder MANAGER Rolle | routes_employees.py, routes_absences.py | | Löschoperationen nur für ADMIN | Mitarbeiter-Löschung ist auf ADMIN-Rolle beschränkt | routes_employees.py | | Profil-Zugriff mit Passwortprüfung | Passwortänderung im Desktop-Client erfordert Eingabe des alten Passworts | basis14.py, Zeilen 1545–1554 | ### Nicht implementiert - Keine granulare Datenzugriffskontrolle auf Patienten-/Datensatzebene - Kein Berechtigungskonzept für Patientenakten (KG) - Keine Zugriffsmatrix dokumentiert - Keine regelmässige Überprüfung der Berechtigungen --- ## 3. Weitergabekontrolle *Massnahmen, die verhindern, dass personenbezogene Daten bei der Übermittlung unbefugt gelesen oder verändert werden.* ### Implementiert | Massnahme | Umsetzung | Referenz | |-----------|-----------|----------| | TLS >= 1.2 für alle Backend-Services | Erzwungen via zentrale Konfiguration; TLS 1.3 wird bevorzugt; starke Cipher Suites (ECDHE+AESGCM, ECDHE+CHACHA20, DHE+AESGCM) | aza_tls.py, STEP 4.1 | | Perfect Forward Secrecy (PFS) | Cipher Suites erfordern ECDHE oder DHE Schlüsselaustausch | aza_tls.py | | IMAP über SSL/TLS | E-Mail-Empfang über IMAP4_SSL (Port 993) | aza_email.py | | SMTP mit STARTTLS | E-Mail-Versand über SMTP mit STARTTLS (Port 587) | aza_email.py | | Credentials nicht in Dateien | E-Mail-Passwörter werden ausschliesslich aus ENV-Variablen geladen, nie auf Disk geschrieben | aza_email.py, STEP 4.4 | | Secret Keys nicht hardcoded | JWT-Signing-Key kommt aus ENV (AZA_SECRET_KEY), mit Validierung auf Länge und Komplexität | workforce_planner/config.py, STEP 4.3 | ### Nicht implementiert - Keine Ende-zu-Ende-Verschlüsselung für E-Mails (kein S/MIME, kein PGP) - Keine Signierung von E-Mails - Kein VPN oder Netzwerk-Tunnel - Keine Zertifikatsverifikation im SMTP-Client (STARTTLS ist opportunistisch) - Keine Verschlüsselung lokaler Daten auf Disk (SQLite-Datenbank, JSON-Dateien) --- ## 4. Eingabekontrolle *Massnahmen, die nachvollziehbar machen, wer wann welche Daten eingegeben oder verändert hat.* ### Implementiert | Massnahme | Umsetzung | Referenz | |-----------|-----------|----------| | Audit-Log für schreibende Aktionen | Workforce Planner: AuditLog-Tabelle mit user_id, action, entity_type, entity_id, old_values, new_values, timestamp, ip_address, user_agent | workforce_planner/core/models.py, api/audit.py | | Benutzeridentifikation | Jede API-Aktion wird dem authentifizierten Benutzer zugeordnet (JWT-Token enthält employee_id und role) | workforce_planner/api/auth.py | ### Nicht implementiert - Audit-Log-Funktion ist definiert, aber nicht in alle API-Endpunkte integriert (log_action wird nur in audit.py referenziert, keine Aufrufe in Routes gefunden) - Kein Audit-Log für Desktop-Client-Aktionen (basis14.py) - Kein Audit-Log für E-Mail-Aktionen - Keine Protokollierung von Datenzugriffen (nur schreibende Aktionen vorgesehen) - Kein manipulationssicheres Logging (kein WORM, kein Syslog) --- ## 5. Auftragskontrolle *Massnahmen, die sicherstellen, dass im Auftrag verarbeitete Daten nur gemäss Weisung verarbeitet werden.* ### Implementiert | Massnahme | Umsetzung | Referenz | |-----------|-----------|----------| | Externe Dienstleister dokumentiert | OpenAI API für Transkription und KI-Funktionen; Supabase für Cloud-Speicher | basis14.py, aza_config.py | | API-Key-basierter Zugriff auf externe Dienste | OpenAI-Zugriff nur mit gültigem API-Key aus ENV-Variable | basis14.py | ### Nicht implementiert - Kein formaler Auftragsverarbeitungsvertrag (AVV/DPA) mit OpenAI dokumentiert - Kein formaler AVV/DPA mit Supabase dokumentiert - Keine Prüfung der Datenverarbeitungsstandorte der Unterauftragnehmer - Keine vertragliche Regelung zur Löschung nach Vertragsende - Keine Prüfung der technischen Massnahmen der Unterauftragnehmer --- ## 6. Verfügbarkeitskontrolle *Massnahmen zum Schutz personenbezogener Daten gegen Zerstörung oder Verlust.* ### Implementiert | Massnahme | Umsetzung | Referenz | |-----------|-----------|----------| | Lokale Datenspeicherung | Patientendaten, Konfigurationen und Notizen werden lokal als JSON/SQLite gespeichert | aza_persistence.py | | Manuelle Backup-Kopien | Projektverzeichnis enthält mehrere Backup-Kopien (basis14 - Kopie*.py) | Dateisystem | | Fail-Start-Mechanismen | Server starten nicht bei fehlender Konfiguration (TLS, Secret Key) – verhindert ungesicherten Betrieb | aza_tls.py, workforce_planner/config.py | ### Nicht implementiert - Kein automatisiertes Backup-Konzept - Kein Disaster-Recovery-Plan - Keine Redundanz der Backend-Services - Kein Monitoring der Dienstverfügbarkeit - Kein USV-Schutz dokumentiert - Keine regelmässigen Wiederherstellungstests --- ## 7. Trennungsgebot *Massnahmen, die sicherstellen, dass zu unterschiedlichen Zwecken erhobene Daten getrennt verarbeitet werden.* ### Implementiert | Massnahme | Umsetzung | Referenz | |-----------|-----------|----------| | Modulare Architektur | Separate Module für KG-Diktat (basis14), E-Mail (aza_email), Workforce Planning (workforce_planner), Todo (todo_server), Transkription (transcribe_server) | Dateisystem | | Getrennte Datenbanken | Workforce Planner: eigene SQLite-Datenbank (workforce_planner.db); Desktop-Client: separate JSON-Config-Dateien | workforce_planner/config.py, aza_persistence.py | | Getrennte Konfigurationen | Jedes Modul hat eigene Konfigurationsdateien | aza_config.py | ### Nicht implementiert - Keine mandantenfähige Datentrennung - Keine formale Datenklassifikation implementiert - Keine technische Trennung von Produktiv-/Testdaten - Keine Trennung von medizinischen und administrativen Daten auf Datenbankebene --- ## 8. Incident Management ### Implementiert | Massnahme | Umsetzung | Referenz | |-----------|-----------|----------| | Incident-Dokumentation | Formale Incident-Notiz erstellt bei Entdeckung exponierter Credentials | INCIDENT_2026-02-22_CREDENTIAL_EXPOSURE.md | | Sofortmassnahmen dokumentiert | Checkliste mit Verantwortlichkeiten und Status | INCIDENT_2026-02-22_CREDENTIAL_EXPOSURE.md | | Security-Handover-Dokumentation | Jeder Sicherheitsschritt wird formal dokumentiert mit Änderungen, Tests und Restrisiken | /security/handovers/ | ### Nicht implementiert - Kein formaler Incident-Response-Plan - Keine definierten Eskalationsstufen - Keine Meldepflicht-Prozesse (DSG Art. 24: Meldung an EDÖB innert 72h) - Keine automatische Anomalie-Erkennung - Kein Security Operations Center (SOC) --- ## 9. Backup & Recovery ### Implementiert | Massnahme | Umsetzung | Referenz | |-----------|-----------|----------| | Manuelle Dateisystem-Backups | Mehrere datierte Backup-Kopien des Projekts vorhanden | Dateisystem (backup-Ordner) | | Lokale Datenpersistenz | Alle Daten lokal gespeichert (kein Single Point of Failure durch Cloud-Abhängigkeit) | aza_persistence.py | ### Nicht implementiert - Kein automatisiertes, regelmässiges Backup - Keine Versionierung der Datenbanken - Kein Off-Site-Backup - Keine dokumentierte Recovery-Prozedur - Keine Recovery Time Objective (RTO) / Recovery Point Objective (RPO) definiert - Keine regelmässigen Wiederherstellungstests --- ## 10. Patch- & Update-Management ### Implementiert | Massnahme | Umsetzung | Referenz | |-----------|-----------|----------| | Python-Paketmanagement | Dependencies über pip/requirements installierbar | Projektstruktur | | Aktuelle Kryptographie-Bibliotheken | bcrypt und cryptography-Bibliothek im Einsatz | basis14.py, aza_tls.py | ### Nicht implementiert - Kein dokumentiertes Patch-Management-Verfahren - Keine automatische Dependency-Prüfung auf bekannte Schwachstellen (kein pip-audit, kein Dependabot) - Keine regelmässigen Update-Zyklen definiert - Keine Testprozedur vor Produktiv-Updates - Kein Changelog oder Release-Management --- ## 11. Logging & Monitoring ### Implementiert | Massnahme | Umsetzung | Referenz | |-----------|-----------|----------| | Audit-Log-Modell | Datenbankmodell für Änderungsprotokoll mit Benutzer, Aktion, Zeitstempel, alte/neue Werte, IP-Adresse | workforce_planner/core/models.py (AuditLog) | | Debug-Logging | Print-basiertes Debug-Logging in E-Mail-Modul (SMTP/IMAP-Verbindungen) | aza_email.py | | Sicherheitswarnungen auf stderr | Migrationswarnung bei Klartext-Credentials, Fail-Start-Meldungen bei fehlender Konfiguration | aza_email.py, aza_tls.py, workforce_planner/config.py | ### Nicht implementiert - Audit-Log-Integration in API-Endpunkte nicht vollständig - Kein zentrales Logging-Framework (kein strukturiertes Logging) - Kein Log-Rotation-Mechanismus - Kein Monitoring-Dashboard - Keine Alerting-Mechanismen - Keine Protokollierung fehlgeschlagener Anmeldeversuche - Kein SIEM (Security Information and Event Management) --- ## 12. Mitarbeiterschulung ### Implementiert | Massnahme | Umsetzung | Referenz | |-----------|-----------|----------| | Keine | Keine formalen Schulungsmassnahmen implementiert | — | ### Nicht implementiert - Keine Security-Awareness-Schulungen - Keine Dokumentation für Endbenutzer zum sicheren Umgang - Keine Schulung zum Umgang mit Patientendaten - Keine Phishing-Awareness - Keine dokumentierte Einweisungsprozedur für neue Benutzer --- ## Zusammenfassung | Bereich | Implementiert | Teilweise | Nicht implementiert | |---------|:---:|:---:|:---:| | 1. Zugangskontrolle | 5 | — | 5 | | 2. Zugriffskontrolle | 4 | — | 4 | | 3. Weitergabekontrolle | 6 | — | 5 | | 4. Eingabekontrolle | 2 | — | 5 | | 5. Auftragskontrolle | 2 | — | 5 | | 6. Verfügbarkeitskontrolle | 3 | — | 6 | | 7. Trennungsgebot | 3 | — | 4 | | 8. Incident Management | 3 | — | 5 | | 9. Backup & Recovery | 2 | — | 6 | | 10. Patch- & Update-Management | 2 | — | 5 | | 11. Logging & Monitoring | 3 | — | 7 | | 12. Mitarbeiterschulung | 0 | — | 5 | **Total: 35 Massnahmen implementiert, 62 Massnahmen offen** ### Implementierte Security-Schritte (Bezug) | Schritt | Massnahme | Status | |---------|-----------|--------| | STEP 4.1 | TLS-Pflicht für alle Backend-Services | Erledigt, verifiziert (STEP 4.1a) | | STEP 4.2 | Sicheres Passwort-Hashing (bcrypt, cost=12) | Erledigt, verifiziert (STEP 4.2a) | | STEP 4.3 | Hardcoded Secret Key entfernt | Erledigt, getestet | | STEP 4.4 | Klartext-Credentials entfernt | Erledigt, getestet | | STEP 4.4a | Incident-Dokumentation Credential Exposure | Erledigt | --- *Dieses Dokument beschreibt den Ist-Zustand der technischen und organisatorischen Massnahmen des AZA/MedWork-Systems. Es dient als Grundlage für die Weiterentwicklung des Sicherheitskonzepts und als Nachweis gegenüber Aufsichtsbehörden.* *Nächste Überprüfung: Bei Abschluss weiterer Security-Schritte oder spätestens nach 6 Monaten.*