152 lines
4.8 KiB
Markdown
152 lines
4.8 KiB
Markdown
|
|
# STEP 11 – Audit-Logging (Minimal & DSG-konform)
|
|||
|
|
|
|||
|
|
## Ziel
|
|||
|
|
Sicherheitsrelevante Ereignisse nachvollziehbar protokollieren,
|
|||
|
|
ohne sensible Daten (Patientendaten, Prompts, Passwoerter) zu speichern.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. Architektur
|
|||
|
|
|
|||
|
|
Neues Modul: aza_audit_log.py
|
|||
|
|
|
|||
|
|
Log-Format: Pipe-separierte Textdatei (eine Zeile pro Ereignis)
|
|||
|
|
|
|||
|
|
TIMESTAMP | EVENT | USER | STATUS | SOURCE | DETAIL
|
|||
|
|
|
|||
|
|
Beispiel:
|
|||
|
|
2026-02-22T21:13:25.419+00:00 | LOGIN_OK | Dr. Mueller | OK | desktop |
|
|||
|
|
|
|||
|
|
Alle Timestamps sind UTC (ISO-8601).
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 2. Protokollierte Ereignisse
|
|||
|
|
|
|||
|
|
Event-Typ Beschreibung Wann
|
|||
|
|
------------------------------------------------------------------
|
|||
|
|
APP_START Anwendung gestartet main()
|
|||
|
|
APP_STOP Anwendung beendet nach mainloop()
|
|||
|
|
LOGIN_OK Erfolgreicher Login do_login()
|
|||
|
|
LOGIN_FAIL Fehlgeschlagener Login do_login()
|
|||
|
|
2FA_OK 2FA-Verifizierung erfolgreich do_verify()
|
|||
|
|
2FA_FAIL 2FA-Verifizierung fehlgeschlagen do_verify()
|
|||
|
|
CONSENT_GRANT KI-Einwilligung erteilt on_accept()
|
|||
|
|
CONSENT_REVOKE KI-Einwilligung widerrufen toggle_consent()
|
|||
|
|
AI_TRANSCRIBE KI-Transkription gestartet transcribe_wav()
|
|||
|
|
AI_CHAT KI-Chat-Completion aufgerufen call_chat_completion()
|
|||
|
|
AI_BLOCKED KI-Aufruf ohne Consent blockiert transcribe/chat
|
|||
|
|
PASSWORD_REHASH Legacy-Hash auf bcrypt migriert do_login()
|
|||
|
|
EXPORT Log-Export durchgefuehrt do_export()
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 3. Data Minimization (DSG Art. 6)
|
|||
|
|
|
|||
|
|
Was NICHT im Audit-Log gespeichert wird:
|
|||
|
|
- Patientennamen / Patientendaten
|
|||
|
|
- Transkripte / KG-Inhalte
|
|||
|
|
- KI-Prompts / KI-Antworten
|
|||
|
|
- Passwoerter / Passwort-Hashes
|
|||
|
|
- API-Keys / Secrets
|
|||
|
|
- E-Mail-Inhalte
|
|||
|
|
|
|||
|
|
Detail-Feld: Maximal 200 Zeichen, nur Metadaten
|
|||
|
|
(z.B. "model=gpt-5.2", "2FA backup-code").
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 4. Log-Rotation
|
|||
|
|
|
|||
|
|
Parameter Standard ENV-Variable
|
|||
|
|
--------------------------------------------------
|
|||
|
|
Max. Dateigroesse 10 MB AZA_AUDIT_ROTATE_MB
|
|||
|
|
Rotierte Dateien 12 AZA_AUDIT_KEEP
|
|||
|
|
Logdatei-Pfad aza_audit.log AZA_AUDIT_LOG
|
|||
|
|
|
|||
|
|
Bei Ueberschreitung der Maximalgroesse:
|
|||
|
|
aza_audit.log -> aza_audit.1.log -> ... -> aza_audit.12.log
|
|||
|
|
Aelteste Datei wird ueberschrieben.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 5. Export
|
|||
|
|
|
|||
|
|
Ueber Einstellungen -> "Logs exportieren (Audit)":
|
|||
|
|
Exportiert sowohl Consent-Log als auch Audit-Log als JSON.
|
|||
|
|
|
|||
|
|
Programmatisch:
|
|||
|
|
python -c "from aza_audit_log import export_audit_log; print(export_audit_log())"
|
|||
|
|
|
|||
|
|
Export-Format:
|
|||
|
|
{
|
|||
|
|
"export_timestamp": "2026-02-22T...",
|
|||
|
|
"total_entries": 12,
|
|||
|
|
"source_file": ".../aza_audit.log",
|
|||
|
|
"entries": [
|
|||
|
|
{
|
|||
|
|
"timestamp": "2026-02-22T...",
|
|||
|
|
"event": "LOGIN_OK",
|
|||
|
|
"user_id": "...",
|
|||
|
|
"status": "OK",
|
|||
|
|
"source": "desktop",
|
|||
|
|
"detail": ""
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 6. Integration bestehender Audit-Systeme
|
|||
|
|
|
|||
|
|
Komponente Audit-System Speicherort
|
|||
|
|
-----------------------------------------------------------
|
|||
|
|
Desktop-App (basis14) aza_audit_log.py aza_audit.log
|
|||
|
|
Backend (backend_main) _audit_write() medwork_audit.log
|
|||
|
|
Workforce Planner log_action() + DB workforce_planner.db
|
|||
|
|
|
|||
|
|
Alle drei Systeme sind unabhaengig und koennen
|
|||
|
|
separat exportiert werden.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 7. Geaenderte / Neue Dateien
|
|||
|
|
|
|||
|
|
Datei Aktion
|
|||
|
|
--------------------------------------------------
|
|||
|
|
aza_audit_log.py NEU – Audit-Log-Modul
|
|||
|
|
basis14.py GEAENDERT – Import + 10 log_event()-Aufrufe
|
|||
|
|
aza_settings_mixin.py GEAENDERT – Import + Widerruf-Log + Export
|
|||
|
|
_test_audit_log.py NEU – Testskript (23 Tests)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 8. Test-Ergebnisse (22.02.2026)
|
|||
|
|
|
|||
|
|
Test Ergebnis
|
|||
|
|
-------------------------------------------
|
|||
|
|
Events schreiben PASS
|
|||
|
|
12 Zeilen korrekt PASS
|
|||
|
|
6 Felder pro Zeile PASS
|
|||
|
|
Timestamp UTC PASS
|
|||
|
|
Event-Typ korrekt PASS
|
|||
|
|
User korrekt PASS
|
|||
|
|
Status OK/FAIL korrekt PASS
|
|||
|
|
Source = desktop PASS
|
|||
|
|
Statistiken korrekt PASS
|
|||
|
|
Export JSON korrekt PASS
|
|||
|
|
Data Minimization PASS
|
|||
|
|
Pipe-Sanitierung PASS
|
|||
|
|
Gesamt: 23/23 ALLE BESTANDEN
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 9. Risiken
|
|||
|
|
|
|||
|
|
Risiko Bewertung Massnahme
|
|||
|
|
--------------------------------------------------------
|
|||
|
|
Log-Datei loeschbar NIEDRIG Backup sichert mit
|
|||
|
|
Kein zentrales SIEM MITTEL Export fuer manuelle Pruefung
|
|||
|
|
Keine Echtzeit-Alarmierung MITTEL Manueller Review empfohlen
|
|||
|
|
Log-Rotation verliert alte Daten NIEDRIG 12 Dateien a 10 MB = 120 MB
|