Skip to content

PII-Scanner

Der KnowledgeValidator scannt hochgeladene Texte auf personenbezogene Daten (PII) bevor sie vektorisiert werden. Er warnt bei Funden, blockiert aber nicht — der Tenant entscheidet, ob trotzdem vektorisiert wird.

Verhalten

  • Bei PII-Funden wird das Knowledge-Item auf status: 'pending_review' gesetzt
  • Der Tenant sieht die Warnung im Dashboard und kann manuell freigeben
  • Die KB Onboarding Checkliste markiert pii_scan_passed und no_email_dumps als nicht bestanden, solange Items mit pending_review existieren
  • Keine PII-Daten werden in der Scan-Response zurückgegeben — nur Counts und Kategorien

Regex-Patterns

NameLabelRegexRiskSeverity
emailE-Mail-Adressen[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}Personenbezogene Datenhigh
ibanIBAN-Nummern\b[A-Z]{2}\d{2}[A-Z0-9]{11,30}\bFinanzdatenhigh
phoneTelefonnummern\+\d{1,3}[\s-]?\d{3,15}Kontaktdatenmedium
email_headerE-Mail-Header (Dump-Erkennung)\b(Von:|An:|Betreff:|Subject:|Forwarded|From:|To:|Sent:|Date:)\bE-Mail-Dump erkannthigh
credit_cardKreditkarten-Nummern\b\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}\bFinanzdatencritical

Severity-Hierarchie

Die hoechste gefundene Severity bestimmt maxSeverity in der Response:

  1. critical — Kreditkarten-Nummern
  2. high — E-Mail-Adressen, IBAN, E-Mail-Header
  3. medium — Telefonnummern
  4. low — Fallback (kein Pattern hat aktuell diese Severity)

Oversized-Check

Neben PII-Erkennung prueft der Scanner auch die geschaetzte Chunk-Anzahl:

estimatedChunks = Math.ceil(text.length / 500)
isOversized = estimatedChunks > 500

Ein Dokument mit mehr als 500 geschaetzten Chunks wird als isOversized: true markiert.

Scan-Response

json
{
  "clean": false,
  "findings": [
    {
      "pattern": "email",
      "label": "E-Mail-Adressen",
      "count": 3,
      "risk": "Personenbezogene Daten",
      "severity": "high"
    }
  ],
  "totalFindings": 3,
  "maxSeverity": "high",
  "isOversized": false,
  "estimatedChunks": 42,
  "summary": "1 PII-Muster gefunden (3 Treffer). Hoechstes Risiko: high."
}

Bei sauberem Scan:

json
{
  "clean": true,
  "findings": [],
  "totalFindings": 0,
  "maxSeverity": null,
  "isOversized": false,
  "estimatedChunks": 42,
  "summary": null
}

Integration in die Pipeline

Upload → TextExtractor → KnowledgeValidator.scan()

                    clean=true → status='pending' → Vektorisierung
                    clean=false → status='pending_review' → Tenant-Entscheidung

Der PII-Scanner ist in KnowledgeService.processDocument() integriert und läuft automatisch bei jedem Upload.