Compliance & Audit
Cortina ist als technische Schutzmaßnahme im Sinne von DSGVO Art. 32 gebaut: Pseudonymisierung als ein klares, reproduzierbares Verfahren, das harte Garantien gibt — die im Code verdrahtet sind, nicht nur in einer Policy stehen.
DSGVO Art. 32 — Pseudonymisierung
Section titled “DSGVO Art. 32 — Pseudonymisierung”Art. 32 verlangt „geeignete technische und organisatorische Maßnahmen” zur Sicherheit der Verarbeitung; Pseudonymisierung wird dort explizit als Beispiel genannt. Cortina implementiert Pseudonymisierung als reversible Mapping-Operation mit zwei harten Eigenschaften:
- Das Mapping verlässt nie die EU. Redis läuft auf Hetzner Falkenstein; Postgres auch.
- Das Mapping verlässt nie Redis. Originaltext landet nicht in Postgres, nicht in Audit-Logs, nicht in Logs zur Fehlersuche.
Was im Audit-Log steht — und was nicht
Section titled “Was im Audit-Log steht — und was nicht”Cortina schreibt zu jedem Anonymize-Call einen Audit-Log-Eintrag. Der Eintrag enthält bewusst keinen Originaltext und keine Pseudonyme.
Was geschrieben wird:
| Feld | Beispiel | Zweck |
|---|---|---|
request_id | 01HZA… (UUIDv7) | Korrelation mit Logs |
tenant_id | UUIDv5 deterministisch aus Tenant-Name | Per-Tenant-Aggregationen |
api_key_id | (DB-Key-ID, nicht der Plaintext) | Audit pro Key |
client_ip_hash | SHA256 der Client-IP mit API_KEY_SALT | Rate-Limit-Forensik ohne IP-Speicherung |
endpoint | /v1/anonymize | — |
entities_count | {"DE_IBAN": 1, "PERSON": 2} | Aggregat — keine Werte |
stages_filter | [1, 2] oder null | Welcher ?stages=-Filter wirkte |
audit_flags | ["context_llm_unavailable"] | Welche degradierten Pfade liefen |
re_id_score | 0.08 (nur intern, nicht in Public-API) | Stage-4-Calibration |
llm_token_counts | {"stage3_in": 412, "stage3_out": 120, …} | Cost-Tracking |
created_at | UTC | — |
Was niemals geschrieben wird:
- Originaltext — weder direkt noch fragmentiert.
- Pseudonyme oder ihre Mappings.
- LLM-Prompts oder LLM-Responses (auch nicht hashed).
- Rohe IP-Adressen.
Diese Regel ist im Code als Schema-Constraint im
audit_log-Payload-Builder verdrahtet, nicht nur Policy.
Auftragsverarbeitung (AVV)
Section titled “Auftragsverarbeitung (AVV)”TUP AI GbR ist Auftragsverarbeiter im Sinne von Art. 28 DSGVO. Auf Anfrage stellen wir den AVV bereit. Sub-Prozessoren mit Region:
| Rolle | Anbieter | Region |
|---|---|---|
| Hosting (Compute, DB, Cache) | Hetzner Online GmbH | Falkenstein / Helsinki |
| Stage-3 LLM | AWS Bedrock (Claude family) | eu-central-1 Frankfurt |
| Stage-4 LLM | Google Cloud Vertex AI (Gemini family) | europe-west3 Frankfurt |
Die LLM-Aufrufe sind die einzigen Daten-Transfers außerhalb der reinen
TUP-Infrastruktur. Beide Endpoints sind regional gepinnt; AWS verwendet
für Bedrock in eu-central-1 ein regional inference profile, das
das Routing auf EU-Endpoints beschränkt — Cross-Region-Routing ist
nicht aktiv.
Hosting-Region
Section titled “Hosting-Region”Alle Komponenten (FastAPI, Postgres, Redis) laufen in Deutschland (Hetzner Falkenstein); Backup-Replikate liegen in Helsinki (Hetzner Finland), das innerhalb der EU als gleichwertige Hosting-Region zählt.
Es gibt keine US-Datenflüsse außer den zwei oben genannten LLM-Calls, die ihrerseits an EU-pinnte Endpoints gehen. CDN, Static Assets, Logs, Metriken — alles EU.
Was Audit-Flags bedeuten
Section titled “Was Audit-Flags bedeuten”Ein nicht-leeres audit_flags-Array in der Anonymize-Response ist ein
Signal an den Caller, dass die Pipeline degradiert lief. Konkret:
| Flag | Was es bedeutet |
|---|---|
context_llm_disabled | Stage 3 ist per Config aus. Keine Art.-9-Coverage. |
context_llm_unavailable | Stage 3 wollte laufen, Provider war down. Keine Art.-9-Coverage. |
adversarial_unavailable | Stage 4 down — Re-ID-Score nicht gegeben. |
adversarial_invalid_output | Stage 4 LLM hat zweimal nicht parsebare JSON geliefert. |
re_id_risk_remaining | Stage 4 lief, ε wurde nicht erreicht. Output bleibt mit Restrisiko. |
re_id_oscillation | Stage 3 ↔ 4 sind sich uneinig. Pipeline-Instabilität, ops-relevant. |
Caller, die eine harte Garantie brauchen, sollten jedes nicht-leere
audit_flags-Array als „degradierte Antwort” behandeln und die
Anfrage entweder neu schicken oder den Output zusätzlich manuell
prüfen.
Bekannte Lücke: GDPR Art. 9 ohne Stage 3
Section titled “Bekannte Lücke: GDPR Art. 9 ohne Stage 3”Wenn Stage 3 deaktiviert ist (context_llm_disabled /
context_llm_unavailable), fängt die Pipeline keine Nationalitäten,
Religionen oder Veranstaltungsbezüge ab. Das ist eine bewusst doku-
mentierte Lücke — wir advertisen die Pipeline ohne Stage 3 explizit
nicht als Art.-9-vollständig. Telemetriegestützte Phase-3.1-
Recognizer (deterministisch für eine geschlossene Demonym-Liste) sind
Backlog.