Entwickler
· 10 Min. Lesezeit

Eine Schwärzungs-API im eigenen Netz

Von Amine Gaaliche · Entwurf mit Claude erstellt, von Hand geprüft und redigiert

Eine selbst gehostete Schwärzungs-API erkennt und schwärzt Dokumente auf Ihrer eigenen Infrastruktur. Die Dateien verlassen Ihr Netz dabei nicht. Nach außen geht nur eine Lizenzprüfung, alle sechs Stunden. Ohne sie läuft der Dienst höchstens drei Tage weiter.

Wer das Dokument in der Hand hat, während gesucht wird

Bei Schwärzungswerkzeugen dreht sich der Streit meist um eine Frage: Cloud oder lokal? Diese Frage vermengt den Ort, an dem gerechnet wird, mit der Frage, ob sich das Werkzeug aus Programmcode ansteuern lässt. Eine Desktop-Anwendung rechnet lokal, verarbeitet aber nur, was ein Mensch ihr vorlegt. Eine Cloud-API lässt sich in jede Verarbeitungsstrecke einhängen, doch jedes Dokument muss zuerst zum Anbieter.

Wer zehntausend Schriftsätze im Monat verarbeitet, hatte also die Wahl zwischen Handarbeit und Upload. Für die Compliance zählt eine andere Frage: Wer hat das Dokument in der Hand, während darin nach Namen, IBAN und Steuer-Identifikationsnummer gesucht wird? Bei einer Cloud-API ist das zwangsläufig der Anbieter, denn um eine Sozialversicherungsnummer zu finden, muss man sie lesen.

Eine selbst gehostete API holt das Dokument in Ihr eigenes Netz und bleibt programmierbar: dieselbe Erkennung als REST-Schnittstelle und als Kommandozeile, im eigenen Rechenzentrum oder in Ihrer Cloud-Umgebung. Die Lizenzprüfung läuft weiterhin über unseren Server.

Was das für den Auftragsverarbeitungsvertrag bedeutet

Liest eine Cloud-API Ihre Dokumente, verarbeitet ihr Anbieter personenbezogene Daten in Ihrem Auftrag. Dann verlangt Art. 28 DSGVO einen Vertrag mit festgelegtem Inhalt, und die Verarbeitung gehört ins Verzeichnis nach Art. 30 DSGVO. Sitzt der Anbieter außerhalb des Europäischen Wirtschaftsraums, kommen die Übermittlungsregeln hinzu.

Für Kanzleien, Steuerberater und Arztpraxen gilt außerdem § 203 StGB, unabhängig von DSGVO und BDSG. Einen Dienstleister an anvertrauten Geheimnissen mitwirken zu lassen, ist nach § 203 Abs. 3 StGB an Bedingungen geknüpft, etwa die ausdrückliche Verpflichtung zur Verschwiegenheit.

Die Landesdatenschutzbehörden und der BfDI fragen in einer Prüfung zuerst nach diesen Unterlagen. Läuft die Erkennung im eigenen Haus, kommt bei uns kein Dokumentinhalt an, an den ein Auftragsverarbeitungsvertrag anknüpfen könnte. Bei uns kommt die Lizenzprüfung an, und sie gehört in Ihre Dokumentation wie jeder andere ausgehende Dienst. Die Bewertung liegt bei Ihrem Datenschutzbeauftragten.

Alle sechs Stunden: der Aufruf, der Ihr Netz verlässt

Auf unserer Website stand eine Zeit lang, der Container komme ohne jede Verbindung zu uns aus. Das war falsch, und ein Mitschnitt des ausgehenden Verkehrs hätte es schnell gezeigt. Dieselbe Dokumentation nannte einen Paketnamen, der auf PyPI nie veröffentlicht wurde, und eine API-Dokumentation unter /docs, die mit 401 antwortet. Ein Browser schickt beim Öffnen einer Adresse keinen Schlüssel mit.

Alle drei Angaben sind korrigiert. Richtig ist: Der Container prüft seinen API-Schlüssel alle sechs Stunden bei unserem Lizenzserver. Ist der Server nicht erreichbar, arbeitet er aus einem lokalen Zwischenspeicher weiter, der höchstens drei Tage gilt. Danach ruht der Dienst, bis die Lizenzprüfung wieder gelingt.

Dokumente, Auszüge und erkannte Werte werden dabei nicht übertragen. Das Intervall allein klingt nach einem Lebenszeichen, das man abschalten könnte. Erst die Grenze von drei Tagen zeigt, dass diese API nicht für einen Betrieb ohne jedes Netz gebaut ist.

Einen Air-Gap-Modus hat die API nicht. Die Desktop-Anwendung bietet ihn im Tarif Pro, ohne Lizenzaufruf und ohne Absturzberichte. Er beruht auf einer signierten Lizenz, die das Gerät selbst prüft, und lässt sich auf den Container nicht übertragen.

Für Ihre Firewall bedeutet das eine ausgehende Regel zum Lizenzserver. Fällt die Verbindung von Freitagabend bis Dienstag aus, steht eine nächtliche Stapelverarbeitung ab Montagabend still. „100 % offline“ beschreibt bei uns nur die Desktop-Anwendung, denn schon die kostenlose Browser-Anwendung meldet ihren Start anonym. Für alle Varianten gilt: Das Dokument verlässt den Rechner nicht, auf der es verarbeitet wird.

Was im Container geschieht

Erkannt wird in Schichten. Präzise Muster finden Werte mit fester Form wie IBAN und Sozialversicherungsnummer. Ein Entitätenmodell sucht Namen, Firmen und Anschriften, und welches Modell das ist (spaCy, BERT oder GLiNER), legen Sie pro Installation fest. Eine Schicht mit einem Sprachmodell ist möglich, ab Werk aber ausgeschaltet.

Die Ergebnisse werden zusammengeführt, von Doppelfunden und Fehltreffern befreit und über Seitengrenzen weitergereicht, damit ein Name von Seite 1 auch auf Seite 4 markiert wird. Kein lokales Modell erkennt jede Kennung. Deshalb sollte ein Mensch die Funde überprüfen, bevor ein Ergebnis weitergeht.

Gescannte Seiten rendert der Dienst mit 300 dpi und liest sie mit Tesseract in der Dokumentsprache und zusätzlich auf Englisch. Er bestimmt die Bildbereiche mit personenbezogenen Daten, überdeckt diese Pixel und legt darunter eine durchsuchbare Textebene an. Es gibt sieben Sprachpakete: Deutsch, Englisch, Französisch, Spanisch, Italienisch, Niederländisch und Portugiesisch. Mit dem falschen Paket wird ein Scan schlecht gelesen, ohne Warnung.

Entfernen nimmt den Inhalt aus der Datei, statt einen schwarzen Kasten darüberzulegen. Kodieren ersetzt den Wert durch einen kurzen Code, den das Code-Register lokal wieder auflösen kann.

Ein Code gilt pro Ordner, und Ordner sind voneinander getrennt. Global gilt nur ein von Hand festgesetzter Code. Jedes einzeln über die API hochgeladene Dokument erhält eigene Codes, dieselbe Person also in jedem Dokument einen anderen. Wer Bezüge über mehrere Dokumente erhalten will, fasst sie zu einer Gruppe zusammen.

Beim Export bearbeitet der Dienst auch unsichtbare Stellen im PDF wie Alternativtexte, Metadaten, Sprungziele und Formularfelder. Dort steht danach der Code oder ein neutraler Platzhalter. Ein vorher berechnetes Vorschaubild wird verworfen, weil sich in einer Rastergrafik nichts ersetzen lässt.

In fünf Minuten nachgeprüft

Installiert wird aus einem Checkout des Quellcodes mit pip install -e .. Ein veröffentlichtes Paket auf PyPI gibt es noch nicht, und was dort unter ähnlichem Namen liegt, ist ein alter Platzhalter. Ohne Schlüssel erreichbar ist danach nur curl http://<host>:<port>/health.

Alles andere, auch das Schema der Schnittstelle, verlangt den Header Authorization: Bearer <Ihr Schlüssel>. Hochladen, Erkennen und Anonymisieren sind drei Aufrufe hintereinander. Ein Schlüssel, der nur erkennen darf, erhält beim Anonymisieren und beim Export des Code-Registers den Fehlercode 403.

Das zählt bei mehreren Teams, denn der Export enthält die Zuordnung von Code zu Klartext. Die Endpunkte stehen in der Entwicklerdokumentation. Warum Werkzeuge, die eine Zeichenkette statt einer Datei erwarten, bei echten Akten wenig helfen, beschreiben wir in einem eigenen Beitrag.

Häufige Fragen

Sendet die API meine Dokumente irgendwohin?

Nein. Erkennen, Texterkennung, Kodieren und Entfernen laufen in Ihrem Container, und auch das Code-Register liegt dort. Nach außen geht alle sechs Stunden nur die Lizenzprüfung, ohne Dokumentinhalte oder erkannte Werte.

Läuft die selbst gehostete API ganz ohne Netz?

Nein. Ohne Lizenzserver arbeitet sie aus einem Zwischenspeicher, der höchstens drei Tage gilt, und stellt dann den Dienst ein. Einen Air-Gap-Modus gibt es nur in der Desktop-Anwendung im Tarif Pro.

Wie installiere ich die API?

Aus einem Checkout mit pip install -e ., dann starten Sie den Server mit Ihrem API-Schlüssel. Für den ersten Test genügt curl auf /health. Jeder weitere Aufruf braucht den Schlüssel im Header Authorization.

Wir hätten das von Anfang an so schreiben sollen. Wer einen nicht erwähnten Aufruf im eigenen Mitschnitt findet, glaubt auch den Teil nicht mehr, der stimmt: Ihre Dokumente bleiben in Ihrem Netz, solange in ihnen gesucht wird.

Dieser Text ordnet die Rechtslage ein. Er ersetzt keine Beratung im Einzelfall.

War das hilfreich? Sagen Sie es uns.

Teilen