Data & MoreEngineeringgithub.com/dataandmore/dlp

Stoppen Sie das Datenleck
an der Quelle.

Ein mandantenfähiger Flask-Dienst, der Microsoft 365-Änderungsereignisse abonniert, neue E-Mails, Teams-Chats sowie OneDrive- und SharePoint-Inhalte auf personenbezogene Daten prüft und diese blockiert, unter Quarantäne stellt oder meldet, bevor sie sich verbreiten. Dasselbe Prüfprotokoll, das die Blockierung auslöst, stellt dem Dateneigentümer auch einen Ein-Klick-Rücksetzlink bereit.

Jede Änderung überwachen, in Millisekunden klassifizieren, handeln bevor die Seite neu geladen wird.

4Microsoft 365-Quellen
5Richtlinienaktionen pro Quelle
2Klassifikatoren: Regex + KI
60sDeduplizierungsfenster pro Ressource
Abschnitt 01Übersicht

Was der Dienst leistet

Der DLP-Dienst ist zwischen Microsoft 365 und dem Klassifizierungs-Stack der Data & More-Plattform eingebettet. Er abonniert Graph-Änderungsbenachrichtigungen für die betreuten Mandanten, dedupliziert diese, ruft die betroffenen Inhalte ab, führt sie durch einen schnellen Regex-Vorfilter sowie die Profiler der Plattform und ordnet das Ergebnis einer mandantenspezifischen Richtlinie zu, die anschließend direkt im Quellsystem durchgesetzt wird. Jede Aktion wird in einem Elasticsearch-Prüfindex erfasst, und jede Blockierung wird mit einem Rücksetzlink versehen, den der Dateneigentümer direkt aus der E-Mail heraus verwenden kann.

Abonnieren

M365 überwachen

Graph-Abonnements werden durch einen Hintergrund-Scheduler aufrechterhalten, der Token erneuert, Abweichungen ausgleicht und Bulk-Quellkonfigurationen erneut anwendet, sobald sich die Auswahl des Mandanten ändert.

Klassifizieren

Regex zuerst, KI danach

Jedes Element durchläuft einen mandantenspezifisch abgestimmten Regex-Vorfilter (mit ReDoS-geschützten Timeouts). Nur Elemente, die den Vorfilter passieren, werden zur umfassenderen PII-Bewertung an den java_profiler weitergeleitet.

Handeln

Blockieren, unter Quarantäne stellen oder melden

Die Richtlinie ordnet einem (Quelle, Ergebnis)-Paar eine von fünf Aktionen zu, die alle innerhalb von Microsoft 365 ausgeführt werden: Nachricht löschen, in Quarantäne verschieben, eine Datei schwärzen oder lediglich eine Benachrichtigungs-E-Mail bzw. eine Teams-Karte senden.

Abschnitt 02Die Pipeline

Vom Webhook zur Durchsetzung

Eine Änderung in Microsoft 365 führt zu genau einer Benachrichtigung, einem Klassifizierungs-Roundtrip, einer Richtlinienentscheidung und einem Prüfeintrag. Die nachfolgende Pipeline zeigt den Weg, den jede Teams-Nachricht, jeder OneDrive-Upload und jede SharePoint-Bearbeitung durchläuft.

EINGANG DEDUPLIZIERUNG ABRUF KLASSIFIZIERUNG AKTION AUSGABE Microsoft Graph Änderungs-Webhook POST /webhooks/graph clientState validiert 202 sofort zurückgeben Deduplizierung In-Process-Map Schlüssel = Ressource TTL 60s Duplikate verworfen Inhalt abrufen über Graph API teams: Nachrichtentext onedrive: Datei sharepoint: Datei exchange: Quarantäne Klassifizieren zweistufige Entscheidung Regex-Vorfilter 1s Timeout pro Muster java_profiler Circuit Breaker, Wiederholung x3 Entscheiden + handeln mandantenspezifische Richtlinie allow alert block grace_block quarantine redact Prüfprotokoll + Benachrichtigung ES-Index E-Mail + Teams ein Eintrag pro Element Graph-Lifecycle-Webhook Erneute Authentifizierung, verpasst, entfernt POST /webhooks/graph/lifecycle Hintergrund-Scheduler Daemon-Threads, periodisch Profiler-Gesundheit, Webhook-Gesundheit, Drift-Abgleich, Kulanzfrist-Durchsetzung Abonnement-Drift Bei Änderung erneut anwenden Stündlich Kulanzfrist-Durchsetzung Abgelaufene Einträge Periodische Bereinigung Elasticsearch Gemeinsames Substrat: dlp_config, subscriptions, transport_rules, pattern_library, audit, exclusions, fingerprints Lese- und Schreibzugriffe
Hauptpipeline-Pfad Lebenszyklus / bedingter Verzweigungspfad Persistiertes / gemeinsames Substrat
Abschnitt 03Quellen

Vier Wege, auf denen Inhalte eintreffen können

Jede Quelle verfügt über ein eigenes Graph-Abonnement, ein eigenes Ressourcenpfadformat, einen eigenen Inhaltsabruf und ein eigenes Verständnis davon, was Blockierung bedeutet. Der Prozessor leitet anhand des geparsten Ressourcenpfads weiter und verteilt die Verarbeitung an den passenden Abruf-Handler sowie die zuständige Durchsetzungslogik.

QuelleRessourcenpfadAbonniert überDurchsetzungsvektor
Teams/teams/{id}/channels/.../messagesGraph-Change-WebhookAntwort mit adaptiver Karte, optionales Löschen
OneDrive/users/{id}/drive/rootGraph-Change-WebhookBlockierung über Graph-Dateiaktionen, Ausnahme-Speicher
SharePoint/sites/{id}/drive/rootGraph-Change-WebhookBlockierung über Graph-Dateiaktionen, Benachrichtigung der Verantwortlichen
Exchangetransport-rule quarantineEXO-TransportregelScan-und-Freigabe-Ablauf, separater Pfad
Abonnements

Wie sie stabil gehalten werden

  • Der Scheduler überwacht den Ablauf von Abonnements und erneuert diese über graph-management bevor Token ablaufen.
  • Der Lebenszyklus-Webhook verarbeitet reauthorizationRequired (erneuern), missed (protokollieren; Administrator kann erneut anwenden) und subscriptionRemoved (protokollieren).
  • Ein Drift-Abgleich-Job wendet die Bulk-Abonnementkonfiguration stündlich für die Modi ALL-users und GROUPS erneut an; der Modus SELECTED-ids wird dabei nicht berührt.
Exchange

Warum Exchange einen eigenen Verarbeitungspfad hat

Exchange ist über eine EXO-Transportregel eingebunden, die verdächtige E-Mails unter Quarantäne stellt, bevor der Benutzer sie zu sehen bekommt. Der DLP-Dienst ruft die Nachricht anschließend aus der Quarantäne ab, klassifiziert sie und gibt sie entweder frei oder blockiert sie. Exchange-Benachrichtigungen außerhalb der Quarantäne werden sofort verworfen – sie sind ein Zeichen für veraltete Konfigurationen oder Fehlkonfigurationen.

Abschnitt 04Klassifizierung

Zwei Klassifizierer, ein Ergebnis

Die Klassifizierung erfolgt in zwei Stufen, damit die kostengünstige Stufe den Großteil herausfiltert und die aufwändige Stufe nur das verarbeitet, was die erste Stufe passiert hat.

Stufe 1

Regex-Vorfilter

Eine mandantenspezifische Liste von Regex-Mustern, die beim ersten Einsatz kompiliert und bei jeder Änderung der Musterliste neu kompiliert wird. Jeder Abgleich wird mit einem ReDoS-geschützten Timeout von 1 Sekunde ausgeführt (über das Drittanbieter-Modul regex), sodass ein einzelnes problematisches Muster den Worker nicht blockieren kann.

Erster Treffer gewinnt. Gibt Mustername oder None zurück.
Stufe 2

java_profiler

Wenn der Vorfilter nicht greift, wird der Text an den Endpunkt /dlp/classify des java_profiler weitergeleitet. Der Client kapselt den Aufruf in einen Circuit Breaker (5 Fehlschläge, 60 s Rücksetzzeit) und einen Tenacity-Wiederholungsmechanismus (3 Versuche, exponentielles Backoff bei Verbindungs- und Timeout-Fehlern). Bei vollständigem Ausfall wird offen gefehlt und der Inhalt als „kein PII" eingestuft, anstatt unproblematische Inhalte zu blockieren.

Anfrage: text, name, type, companyId
Antwort: pii: true | false
Der KI-Profiler-Dienst ist ebenfalls eingebunden (für seine NER- und wörterbuchgesteuerten Kategorien) und verwendet dieselbe Gesundheitsüberwachungs-Infrastruktur. Der schnelle DLP-Verarbeitungspfad läuft jedoch über den zweckgebundenen Endpunkt /dlp/classify des java_profiler, der für binäre Block-/Freigabe-Entscheidungen optimiert ist.
Abschnitt 05Aktionen

Vom Ergebnis zur Aktion

Das Paar (Quelle, Urteil) wird durch die mandantenspezifische Richtlinie, die indlp_configgespeichert ist, einer von fünf Aktionen zugeordnet. „Allow" lässt das System stumm; die anderen vier enden jeweils mit einem Audit-Eintrag.

allow

Keine Aktion

Entweder wurde keine PII erkannt, oder die Datei befindet sich auf der Ausschlussliste des Mandanten für OneDrive / SharePoint. Es wird nichts geschrieben und nichts gesendet.

alert

Nur Benachrichtigung

Der Inhalt verbleibt an seinem Ort. Der Absender (oder der Dateiinhaber) erhält eine E-Mail oder eine Teams-Karte mit dem Hinweis, dass der Inhalt die Richtlinie ausgelöst hat. Geeignet für Kategorien mit geringem Schweregrad.

block

Sofortige Durchsetzung

Die Durchsetzungsschicht ergreift Maßnahmen an der Quelle: Teams-Nachricht wird hinter einer Karte verborgen, OneDrive- / SharePoint-Datei wird gesperrt, Exchange-E-Mail wird aus der Quarantäne entfernt. Der Audit-Eintrag enthält ein Rücksetz-Token, sodass die Aktion rückgängig gemacht werden kann.

grace_block

Manuell geprüft

Die Datei bleibt unverändert, und der Inhaber erhält eine E-Mail mit drei Optionen: jetzt durchsetzen, abbrechen (mit optionalem temporären oder dauerhaften Ausschluss) oder nichts unternehmen. Nach Ablauf des Kulanzzeitraums nimmt der Scheduler den Eintrag auf und setzt die Maßnahme automatisch durch.

quarantine

Nur Exchange

Eingehende E-Mails, die von der Transportregel abgefangen wurden, befinden sich in der Quarantäne. Der DLP-Dienst klassifiziert sie und wählt zwischen Freigabe (zustellen), Behalten (blockieren) und Benachrichtigen (wird geprüft). Ein separater Scan-und-Freigabe-Benachrichtigungspfad hält den Absender informiert.

revert

Rückgängigmachen per Klick

Jede Aktion der Block-Klasse bettet eine signierte Rücksetz-URL in die Benachrichtigung ein. Der Empfänger klickt darauf, und derrevert_serviceliestreversal_dataaus dem Audit-Eintrag, um die Aktion rückgängig zu machen und einen entsprechenden Rücksetz-Audit-Eintrag zu schreiben.

Abschnitt 06Kulanzablauf

Die Form einesmanuell geprüften Blocks

Eingrace_blockist die sanfte Option für OneDrive und SharePoint: An der Quelle geschieht nichts, bis der Inhaber eine Entscheidung trifft oder der Kulanzzeitraum abläuft.

PII erkannt grace_block-Richtlinie Audit-Eintrag: ausstehend grace_expires_at = +Nd E-Mail an Inhaber drei signierte Links jetzt durchsetzen abbrechen nichts unternehmen jetzt durchsetzen Block auslösen, Status: durchgesetzt, Rücksetz-Link gespeichert abbrechen, optionaler Ausschluss Status: abgebrochen, Ausschluss: keiner | temporär | dauerhaft Scheduler setzt automatisch durch wenn grace_expires_at < now()
Block-Entscheidungspfad Abbruchzweig Ergebnis / Audit-Status
Abschnitt 07Benachrichtigungen

Den Inhaber dort erreichen, wo erbereits ist

Benachrichtigungen werden an die Identität adressiert, die für die jeweilige Quelle relevant ist (Absender in Teams, Dateiinhaber in OneDrive, Website-Inhaber in SharePoint). Der Transportweg wird pro Mandant festgelegt.

Teams

Adaptive Card, im Thread

Bei Teams-Benachrichtigungen postet der Bot eine proaktive Antwort im ursprünglichen Thread (oder eine Direktnachricht, wenn die Kanal-Antwort fehlschlägt). Die Karte zeigt die Aktion, einen Begründungsausschnitt, einen Deep-Link zur Nachricht sowie die Rücksetz-URL an.

E-Mail

Graph Mail oder dm-notify

Der E-Mail-Transportweg wird pro Mandant gewählt:graph-managementsendet über das eigene Postfach des Mandanten, sofern Graph-Mail-Einstellungen konfiguriert sind, andernfalls sendetdm-notifyvon der Plattform aus. Vorlagen sind aktionsspezifisch mit mandantenspezifischen Überschreibungen für Kopfzeile / Inhalt / Fußzeile.

AktionBetreffvorlageEnthält
blockDatenschutzrichtlinie: Inhalt gesperrtRücksetz-Link
grace_blockDatenschutzrichtlinie: Handlung erforderlichKulanzzeitraum + drei signierte Links
alertDatenschutzrichtlinie: Inhalt mit Hinweis versehenNur Kopfzeile / Inhalt / Fußzeile
quarantine, under reviewDatenschutzrichtlinie: E-Mail wird geprüftn/a
quarantine, deliveredDatenschutzrichtlinie: E-Mail zugestelltn/a
quarantine, blockedDatenschutzrichtlinie: E-Mail gesperrtRücksetz-Link

Beispiele aus der Praxis

Die nachstehenden Mockups zeigen drei reale Benachrichtigungen, die der Dienst versendet: eine Teams Adaptive Card, eine E-Mail der Klasse „block" und eine E-Mail der Klasse „alert". Sie sind in Ausstellungskarten des Field Manual eingebettet, tragen jedoch ihre eigene Produktfarbidentität, sodass der Leser sieht, was seine Nutzer tatsächlich sehen.

Exhibit 01 | Teams Adaptive Cardsource: bot proactive reply
Data & More DLP08.39
DATENSCHUTZWARNUNG

Inhaltswarnung

Ihr Inhalt wurde markiert, da er möglicherweise sensible Daten enthält. Bitte prüfen Sie diesen vor dem Teilen.


Inhalt
(kein Betreff)
Zeitpunkt
2026-06-03 06:39 UTC
Warum wurde dieser Inhalt markiert?

Analyse: Diese Daten enthalten personenbezogene Daten gemäß der DSGVO. Die Zeichenfolge „mit cpr er 010101…" stellt wahrscheinlich eine dänische CPR-Nummer (Central Person Register) dar – einen eindeutigen Identifikator für eine natürliche Person – und fällt damit unter die Definition personenbezogener Daten.

Dies ist eine informative Warnung. Es wurden keine Maßnahmen an Ihrem Inhalt vorgenommen.

Exhibit 02 | Block-E-Mailsource: graph-management or dm-notify
DSGVO-WARNUNG

Inhalt gesperrt

Ihr Inhalt wurde durch die Datenschutzrichtlinie Ihrer Organisation gesperrt. Die ursprüngliche E-Mail finden Sie in der DLP-Quarantäne.

Ergriffene Maßnahmeblock
Quelleexchange
BetreffDavid Junge shared "Red hat" with you
SpeicherortMarkierten Inhalt anzeigen
Begriffe, die die Richtlinie ausgelöst haben:
  • red hat

Wenn Sie der Meinung sind, dass es sich um einen Fehler handelt, wenden Sie sich bitte an Ihren IT-Administrator.

Exhibit 03 | Alert-E-Mailsource: graph-management or dm-notify

Inhaltswarnung

Ihr Inhalt wurde markiert, da er möglicherweise sensible Daten enthält. Bitte prüfen Sie diesen vor dem Teilen.

Maßnahme: Warnung
Quelle: Sharepoint
Zeitpunkt: 2026-06-02 23:01 UTC
Warum wurde dieser Inhalt markiert?

Analyse: Diese Daten enthalten personenbezogene Daten gemäß der DSGVO. Sie umfassen Namen („Peter"), nationale Identifikationsmerkmale („NIN", „DNI", „número de identidad") sowie Identifikationsnummern natürlicher Personen, einschließlich Angaben zu Ausweisdokumenten von Familienangehörigen, was das Vorhandensein personenbezogener Daten eindeutig belegt.

Dies ist eine informative Warnung. Es wurden keine Maßnahmen an Ihrem Inhalt vorgenommen.

Dies ist eine automatisierte Nachricht des Data-Loss-Prevention-Systems Ihrer Organisation.
Section 08Hintergrund

Was der Scheduler kontinuierlich ausführt

Vier Daemon-Threads starten beim App-Start und werden nie beendet. Sie halten den Dienst fehlerfrei, ohne dass ein Cron-Job oder ein externer Orchestrator erforderlich ist.

Job 01

Profiler-Zustand

Prüft java_profiler und den KI-Profiler. Protokolliert Verfügbarkeits- und Ausfallübergänge und stellt Abhilfemaßnahmen bereit.

Job 02

Webhook-Zustand

Alle 15 Minuten. Markiert Mandanten, deren Graph-Abonnements zu lange inaktiv waren.

Job 03

Drift-Abgleich

Stündlich. Wendet Massenabonnements für die Modi ALL und GROUPS erneut an, sodass neue Nutzer und Gruppenänderungen automatisch erfasst werden.

Job 04

Grace-Durchsetzung

Durchsucht den Audit-Index nach grace_block Einträgen, deren Zeitfenster abgelaufen ist, und veranlasst die zurückgestellte Durchsetzung.

Die Threads sind Daemons, damit der Gunicorn-Worker sauber beendet werden kann. Der Zustand wird in Elasticsearch gespeichert, nicht im Arbeitsspeicher, sodass jeder Worker dort fortfahren kann, wo ein anderer aufgehört hat.
Section 09Unter der Haube

Der Stack

LaufzeitumgebungPython 3.12, uv, Flask + Gunicorn :8000
Web-Schicht10 Flask-Blueprints (health, webhook, settings, transport-rules, pattern-library, audit, revert, subscriptions, testing, teams bot)
Ausfallsicherheitpybreaker Circuit Breaker, tenacity-Wiederholungsversuche, ReDoS-geschützte Regex (regex module timeout)
Microsoft 365Graph Change Webhooks (Teams, OneDrive, SharePoint), EXO-Transportregeln, Graph-Management-Proxy, Teams Bot SDK
Klassifikatorenjava_profiler für schnelle Klassifizierung, KI-Profiler mit Gesundheitsüberwachung, In-Process-Regex-Vorfilter
DatenspeicherElasticsearch über das dm-lib Basismodell: dlp_config, subscriptions, transport_rules, pattern_library, audit, exclusions, fingerprints, azure_creds, azure_users, azure_sites, bot_chat_lookup, email_settings
Benachrichtigungengraph-management /send-mail (Tenant-Postfach) oder dm-notify /email/send (Plattform), Teams Adaptive Cards über den Bot
HintergrundDaemon-Threads für Gesundheitsmonitore, Drift-Abgleich und Grace-Enforce
BereitstellungDocker, AWS ECR (eu-central-1), bash deploy.sh
ZusammengefasstDie Gesamtstruktur

Abonnieren, deduplizieren, klassifizieren, entscheiden, handeln, protokollieren.

Von einer Graph-Benachrichtigung bis zur Freigabe einer Exchange-Quarantäne durchläuft jede Microsoft 365-Änderung eine klar definierte Schleife – mandantenspezifisch und in weniger Zeit, als der Benutzer benötigt, um den Tab zu wechseln. Jede Aktion wird protokolliert, jede Sperrung ist rückgängig zu machen, und jeder Klassifikator ist so konzipiert, dass er im Fehlerfall offen bleibt – damit das System Inhalte niemals aus dem falschen Grund zurückhält.

github.com/dataandmore/dlp