# KI-Anonymisierungs-Gateway — Benutzerhandbuch

## Übersicht

Das KI-Anonymisierungs-Gateway ist ein zentraler Proxy-Server, der zwischen Klinik-Systemen und externen KI-APIs (Claude, OpenAI) sitzt. Er erkennt und anonymisiert personenbezogene Daten automatisch, bevor sie das Kliniknetz verlassen.

## Installation

### Windows (Einzeiler)
```powershell
irm https://downloads.c3po42.de/ki-gateway/install.ps1 | iex
```

### Manuell
```bash
cd C:\KI-Gateway
pip install -r requirements.txt
python main.py
```

Das Dashboard öffnet sich automatisch unter `http://localhost:8600`.

## Netzwerk-Setup

### 1. Gateway im Netzwerk erreichbar machen

Das Gateway bindet standardmäßig auf `0.0.0.0:8600` — es ist also von allen Geräten im Netzwerk erreichbar. Die Adresse für Clients ist:

```
http://<Gateway-IP>:8600
```

### 2. Sophos XGS Firewall konfigurieren

#### Schritt 1: KI-Domains blockieren
Unter **Web → URL Groups** eine neue Gruppe "KI-Dienste" erstellen:

| Domain |
|--------|
| api.anthropic.com |
| api.openai.com |
| chat.openai.com |
| chatgpt.com |
| claude.ai |
| gemini.google.com |
| bard.google.com |
| copilot.microsoft.com |

Diese Gruppe in einer **Web Filter Policy** auf "Block" setzen und der LAN-Zone zuweisen.

#### Schritt 2: Ausnahme für den Gateway-Server
Unter **Firewall Rules** eine neue Regel erstellen:

- **Name:** KI-Gateway Outbound
- **Source:** Gateway-Server (IP-Host-Objekt)
- **Destination:** Internet
- **Services:** HTTPS (443)
- **Destination Networks:** api.anthropic.com, api.openai.com
- **Action:** Allow
- **Position:** VOR der Block-Regel

#### Schritt 3: Interner Zugriff auf Gateway
Unter **Firewall Rules**:

- **Name:** KI-Gateway Intern
- **Source:** LAN
- **Destination:** Gateway-Server:8600
- **Action:** Allow

### 3. Windows Firewall

Falls das Gateway auf einem Windows-Server läuft:
```powershell
New-NetFirewallRule -DisplayName "KI-Gateway" -Direction Inbound -Port 8600 -Protocol TCP -Action Allow
```

## Client-Konfiguration

### Prinzip
Clients richten ihre KI-Anfragen an das Gateway statt direkt an die KI-API. Das Gateway anonymisiert automatisch — der Client merkt keinen Unterschied.

### Python (Anthropic SDK)
```python
import anthropic

client = anthropic.Anthropic(
    base_url="http://ki-gateway:8600/v1",
    api_key="sk-ant-..."  # Wird vom Gateway durchgeleitet
)

# Ganz normal nutzen — Anonymisierung passiert transparent
response = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Fasse den Befund von Max Mustermann zusammen..."}]
)
```

### Python (OpenAI SDK)
```python
from openai import OpenAI

client = OpenAI(
    base_url="http://ki-gateway:8600/v1",
    api_key="sk-..."
)

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Patient Hans Meier, geb. 15.03.1980..."}]
)
```

### curl
```bash
curl http://ki-gateway:8600/v1/messages \
  -H "x-api-key: sk-ant-..." \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-sonnet-4-20250514",
    "max_tokens": 1024,
    "messages": [{"role": "user", "content": "Arztbrief für Max Mustermann..."}]
  }'
```

### Umgebungsvariablen
Alternativ kann man die API-URL global setzen:
```bash
# Claude
export ANTHROPIC_BASE_URL=http://ki-gateway:8600/v1

# OpenAI
export OPENAI_BASE_URL=http://ki-gateway:8600/v1
```

## Dashboard

Das Admin-Dashboard (`http://ki-gateway:8600`) bietet:

### Live-Traffic
Echtzeit-Ansicht aller KI-Anfragen mit:
- Zeitstempel
- Aktion (proxy_claude, proxy_openai, anonymize)
- Details (Modell, Entitäten-Anzahl)
- Quell-IP des Clients

### Test-UI
Manuelles Testen der Anonymisierung:
1. Text eingeben
2. "Anonymisieren" klicken → Platzhalter sehen
3. Optional "An KI senden" → re-identifizierte Antwort

### Einstellungen
- Entity-Typen ein/ausschalten (Namen, KVNR, Adressen etc.)
- API-Keys konfigurieren
- Regex-Only-Modus (ohne spaCy/NLP)

### Integration
- Proxy-Adressen zum Kopieren
- Sophos-Regeln als Referenz
- Client-Code-Beispiele

## Erkannte Datentypen

| Typ | Beispiel | Platzhalter |
|-----|----------|-------------|
| KVNR | A123456789 | [KVNR_001] |
| Geburtsdatum | 15.03.1980 | [DATE_OF_BIRTH_001] |
| Adresse | Hauptstraße 42 | [ADDRESS_001] |
| PLZ + Ort | 12345 Berlin | [ADDRESS_002] |
| Telefon | 030 1234567 | [PHONE_NUMBER_001] |
| IBAN | DE89370400440532013000 | [IBAN_001] |
| E-Mail | max@example.de | [EMAIL_ADDRESS_001] |
| Name* | Max Mustermann | [PERSON_001] |

*Namen-Erkennung erfordert spaCy/Presidio (Python ≤ 3.12). Im Regex-Only-Modus werden nur strukturierte Daten erkannt.

## Konfiguration (config.json)

```json
{
  "gateway_name": "KI-Anonymisierungs-Gateway",
  "version": "0.2.0",
  "port": 8600,
  "host": "0.0.0.0",
  "entity_types": {
    "PERSON": true,
    "DATE_OF_BIRTH": true,
    "KVNR": true,
    "ADDRESS": true,
    "PHONE_NUMBER": true,
    "IBAN": true,
    "EMAIL_ADDRESS": true,
    "LOCATION": true
  },
  "providers": {
    "claude": {
      "api_key": "sk-ant-...",
      "model": "claude-sonnet-4-20250514"
    },
    "openai": {
      "api_key": "sk-...",
      "model": "gpt-4o"
    }
  },
  "regex_only_mode": true,
  "session_timeout_minutes": 60
}
```

### Wichtige Einstellungen

| Einstellung | Beschreibung |
|-------------|-------------|
| `host` | `0.0.0.0` = Netzwerkzugriff, `127.0.0.1` = nur lokal |
| `port` | Standard: 8600 |
| `regex_only_mode` | `true` = nur Regex (leicht), `false` = mit NLP (genauer) |
| `session_timeout_minutes` | Wie lange Mappings im RAM bleiben |

## Sicherheit

- **Mapping nur im RAM** — Personenbezogene Daten werden nie auf die Festplatte geschrieben
- **Session-Timeout** — Mappings werden nach 60 Minuten (konfigurierbar) automatisch gelöscht
- **Kein Logging von Klartextdaten** — Das Aktionslog speichert nur Metadaten (Zeitstempel, Typ, Anzahl)
- **API-Keys** — Werden in config.json gespeichert, im Dashboard maskiert angezeigt
- **On-Premise** — Nichts verlässt das Netzwerk ungeschützt

## Fehlerbehebung

### Gateway startet nicht
- Port 8600 belegt? → Anderer Port in config.json oder automatischer Fallback
- Python nicht gefunden? → `python --version` prüfen, PATH setzen

### Clients können nicht verbinden
- Windows Firewall: Port 8600 freigeben
- Gateway-Host: `0.0.0.0` statt `127.0.0.1` in config.json

### NLP-Erkennung nicht verfügbar
- Benötigt Python ≤ 3.12 (spaCy unterstützt 3.14 noch nicht)
- Installation: `pip install presidio-analyzer presidio-anonymizer spacy`
- Modell: `python -m spacy download de_core_news_sm`
- In config.json: `regex_only_mode: false`

### KI-API-Fehler
- API-Key korrekt? → Im Dashboard unter Einstellungen prüfen
- Sophos blockiert? → Gateway-Server muss als Ausnahme konfiguriert sein
