Data & MoreEngineeringgithub.com/dataandmore/dlp

Stoppa läckan
vid källan.

En Flask-tjänst för flera klientorganisationer som prenumererar på Microsoft 365-ändringshändelser, söker igenom ny e-post, Teams-chatt, OneDrive- och SharePoint-innehåll efter personuppgifter och sedan blockerar, karantäniserar eller varnar för det innan det sprids. Samma granskningslogg som utlöser blockeringen ger även dataägaren en möjlighet att ångra åtgärden med ett enda klick.

Bevaka varje förändring, klassificera på millisekunder, agera innan sidan hinner uppdateras.

4Microsoft 365-källor
5policyåtgärder per källa
2klassificerare: regex + AI
60sdedupliceringsfönster per resurs
Avsnitt 01Översikt

Vad tjänsten gör

DLP-tjänsten befinner sig mellan Microsoft 365 och Data & More-plattformens klassificeringslager. Den prenumererar på Graph-ändringsaviseringar för de klientorganisationer den betjänar, deduplicerar dem, hämtar det berörda innehållet, kör det genom ett snabbt regex-förfilter och plattformens profilerar, mappar sedan utfallet mot en klientspecifik policy och agerar i källsystemet. Varje åtgärd skrivs till ett Elasticsearch-granskningsindex, och varje blockering paras ihop med en återställningslänk som dataägaren kan använda utan att lämna e-postmeddelandet.

Prenumerera

Lyssna på M365

Graph-prenumerationer hålls aktiva av en bakgrundsschemaläggare som förnyar token, stämmer av avvikelser och återapplicerar bulk-källkonfigurationer när klientorganisationens val förändras.

Klassificera

Regex först, AI sedan

Varje objekt passerar ett klientanpassat regex-förfilter (med ReDoS-skyddade tidsgränser). Endast objekt som passerar förfiltret skickas vidare till java_profiler för det tyngre PII-utfallet.

Agera

Blockera, karantänisera eller varna

Policyn mappar ett (källa, utfall)-par till en av fem åtgärder, samtliga utförda inom Microsoft 365: ta bort meddelandet, flytta det till karantän, redigera en fil, eller skicka ett informationsmeddelande via e-post eller Teams-kort.

Avsnitt 02Pipelinen

Från webhook till åtgärd

En förändring i Microsoft 365 resulterar i en avisering, en klassificeringsomgång, ett policybeslut och en granskningsrad. Pipelinen nedan är vad varje Teams-meddelande, OneDrive-uppladdning och SharePoint-redigering genomgår.

INGRESS DEDUP HÄMTNING KLASSIFICERING ÅTGÄRD SINK Microsoft Graph ändrings-webhook POST /webhooks/graph clientState validerad returnera 202 omedelbart Dedup in-process-karta nyckel = resurs TTL 60s dubbletter avvisas Hämta innehåll via Graph API teams: meddelandeinnehåll onedrive: fil sharepoint: fil exchange: karantän Klassificera tvåstegsbeslut regex-förfilter 1s tidsgräns per mönster java_profiler kretsbrytare, försök igen x3 Besluta + agera klientspecifik policy tillåt varna blockera grace_block karantän redigera Granska + avisera ES-index e-post + Teams en rad per objekt Graph lifecycle-webhook omautentisering, missad, borttagen POST /webhooks/graph/lifecycle Bakgrundsschemaläggare daemontrådar, periodiska profilerhälsa, webhookhälsa, driftavstämning, nådeperiod tillämpas Prenumerationsavvikelse tillämpa om på nytt vid ändring varje timme Nådeperiod tillämpas utgångna poster periodisk rensning Elasticsearch delat substrat: dlp_config, subscriptions, transport_rules, pattern_library, audit, exclusions, fingerprints läsningar + skrivningar
Huvud-pipelineväg Livscykel / villkorlig förgrening Beständigt / delat substrat
Avsnitt 03Källor

Fyra sätt som innehåll kan anlända

Varje källa har sin egen Graph-prenumeration, sitt eget format för resurssökvägar, sin egen innehållshämtare och sin egen uppfattning om vad blockering innebär. Processorn dirigerar baserat på den tolkade resursen och skickar vidare till rätt hämtare och rätt tillämpning.

KällaResurssökvägPrenumererar viaTillämpningsvektor
Teams/teams/{id}/channels/.../messagesGraph change webhookSvara med adaptivt kort, valfri borttagning
OneDrive/users/{id}/drive/rootGraph change webhookBlockera via Graph-filåtgärder, exkluderingslager
SharePoint/sites/{id}/drive/rootGraph change webhookBlockera via Graph-filåtgärder, ägare meddelas
Exchangetransport-rule quarantineEXO transport ruleSkanna-och-släpp-flöde, separat väg
Prenumerationer

Hur de hålls aktiva

  • Schemaläggaren övervakar prenumerationers utgångsdatum och förnyar via graph-management innan token löper ut.
  • Livscykelwebhooken hanterar reauthorizationRequired (förnya), missed (logga; administratör kan tillämpa om på nytt) och subscriptionRemoved (logga).
  • Ett driftavstämningsjobb tillämpar om den samlade prenumerationskonfigurationen varje timme för lägena ALL-users och GROUPS; läget SELECTED-ids lämnas oförändrat.
Exchange

Varför det har en egen hanteringsväg

Exchange är kopplat via en EXO-transportregel som sätter misstänkt e-post i karantän innan användaren ser den. DLP-tjänsten hämtar sedan meddelandet ur karantänen, klassificerar det och antingen levererar eller blockerar det. Exchange-aviseringar som inte rör karantän avvisas omedelbart — de är arv från äldre system eller felkonfiguration.

Avsnitt 04Klassificering

Två klassificerare, ett utslag

Klassificering sker i två steg så att det enklare steget filtrerar merparten och det kostsammare steget endast ser det som överlever.

Steg 1

Regex-förfilter

En per-klientorganisation lista med regex-mönster, kompilerade vid första användning och omkompilerade när mönsterlistan ändras. Varje matchning körs med en tidsgräns på 1 sekund mot ReDoS (via tredjepartsmodulen regex) så att ett enskilt problematiskt mönster inte kan blockera arbetaren.

första träff avgör. returnerar mönsternamn, eller None.
Steg 2

java_profiler

Om förfiltret inte kortsluter skickas texten till java_profiler:s /dlp/classify-endpoint. Klienten omsluter anropet med en kretsbrytare (5 fel, 60 s återställning) och ett tenacity-omförsök (3 försök, exponentiell backoff vid anslutnings-/tidsgränsfel). Vid totalt fel misslyckas det öppet som "ingen PII" snarare än att blockera oskyldigt innehåll.

förfrågan: text, name, type, companyId
svar: pii: true | false
AI-profilertjänsten är också kopplad (för dess NER- och ordlistestyrda kategorier) och delar samma hälsoövervakningsstruktur, men DLP:s snabbväg går via java_profiler:s specialbyggda /dlp/classify-endpoint, som är optimerad för binära blockera/tillåta-beslut.
Avsnitt 05Åtgärder

Från utslag till åtgärd

(Källa, utfall)-paret mappas till en av fem åtgärder av den klientspecifika policyn som lagras i dlp_config. Allow lämnar systemet tyst; de övriga fyra avslutas alla med en granskningsrad.

allow

Ingen åtgärd

Antingen identifierades ingen PII, eller så finns filen på klientens undantagslista för OneDrive / SharePoint. Ingenting skrivs, ingenting skickas.

alert

Endast avisering

Innehållet förblir på plats. Avsändaren (eller filägaren) får ett e-postmeddelande eller ett Teams-kort som anger att innehållet utlöste policyn. Användbart för kategorier med låg allvarlighetsgrad.

block

Omedelbar åtgärd

Tillämpningslagret vidtar åtgärd i källan: Teams-meddelandet döljs bakom ett kort, OneDrive / SharePoint-filen låses, Exchange-mejlet tas bort från karantän. Granskningsraden innehåller en återställningstoken så att åtgärden kan återkallas.

grace_block

Manuellt verifierad

Filen lämnas orörd och ägaren får ett e-postmeddelande med tre alternativ: tillämpa nu, avbryt (med valfri tillfällig eller permanent undantagshantering) eller gör ingenting. Efter respitfönstret hämtar schemaläggaren posten och tillämpar åtgärden automatiskt.

quarantine

Exchange-specifikt

Inkommande e-post som fångas upp av transportregeln placeras i karantän. DLP-tjänsten klassificerar det och väljer mellan release (leverera), keep (blockera) och notify (under granskning). En separat aviseringsväg för skanning och release håller avsändaren informerad.

revert

Ångra med ett klick

Varje block-klassåtgärd bäddar in en signerad återställnings-URL i aviseringen. Mottagaren klickar på den och revert_service läser reversal_data från granskningsraden för att ångra åtgärden och skriva en återställningsgranskningsrad bredvid.

Avsnitt 06Respitflöde

Formen på ett manuellt verifierat block

Ett grace_block är det mjuka alternativet för OneDrive och SharePoint: ingenting händer i källan förrän ägaren antingen fattar ett beslut eller respitfönstret löper ut.

PII identifierad grace_block-policy Granskningsrad: väntande grace_expires_at = +Nd E-post till ägaren tre signerade länkar tillämpa nu avbryt gör ingenting tillämpa nu skicka block, status: tillämpad, återställningslänk bevarad avbryt, valfritt undantag status: avbruten, undantag: inget | tillfälligt | permanent schemaläggaren tillämpar automatiskt när grace_expires_at < now()
Beslutsväg för blockering Avbrytsgren Utfall / granskningsstatus
Avsnitt 07Aviseringar

Nå ägaren där de redan befinner sig

Aviseringar riktas till den identitet som är relevant för källan (avsändaren i Teams, filägaren i OneDrive, webbplatsägarna i SharePoint). Transporten väljs per klient.

Teams

Adaptivt kort, i tråden

För Teams-aviseringar publicerar boten ett proaktivt svar i den ursprungliga tråden (eller ett DM om kanalsvaret misslyckas). Kortet visar åtgärden, ett motiveringsutdrag, en djuplänk till meddelandet och återställnings-URL:en.

E-post

Graph mail eller dm-notify

E-posttransporten väljs per klient: graph-management skickar från klientens egen postlåda när Graph mail-inställningar är konfigurerade, annars skickar dm-notify från plattformen. Mallar är per åtgärd med klientspecifika åsidosättningar för rubrik / brödtext / sidfot.

ÅtgärdÄmnesmallInkluderar
blockData Protection Policy: Content BlockedÅterställningslänk
grace_blockData Protection Policy: Action RequiredRespitfönster + tre signerade länkar
alertData Protection Policy: Content AlertedEndast rubrik / brödtext / sidfot
quarantine, under reviewData Protection Policy: Email Under Reviewn/a
quarantine, deliveredData Protection Policy: Email Deliveredn/a
quarantine, blockedData Protection Policy: Email BlockedÅterställningslänk

Exempel i verkligheten

Nedanstående mockups återger tre verkliga notifieringar som tjänsten skickar: ett Teams-adaptivt kort, ett e-postmeddelande av typen block och ett e-postmeddelande av typen alert. De är inramade i Field Manual-utställningskort men bär sin egen produktfärgidentitet så att läsaren ser vad deras användare faktiskt ser.

Utställning 01 | Teams-adaptivt kortkälla: bot proactive reply
Data & More DLP08.39
DATA PROTECTION ALERT

Innehållsvarning

Ert innehåll flaggades eftersom det kan innehålla känsliga uppgifter. Vänligen granska innan ni delar.


Innehåll
(ingen ämnesrad)
Tid
2026-06-03 06:39 UTC
Varför flaggades detta?

Analys: Dessa uppgifter innehåller personuppgifter enligt GDPR-reglerna. Strängen "mit cpr er 010101…" representerar sannolikt ett danskt CPR-nummer (Central Person Register), en unik identifierare för en individ, och faller därmed under definitionen av personuppgifter.

Detta är en informationsvarning. Ingen åtgärd har vidtagits för ert innehåll.

Utställning 02 | Block-e-postkälla: graph-management or dm-notify
GDPR ALERT

Innehåll blockerat

Ert innehåll blockerades av organisationens dataskyddspolicy. Kontrollera dlp-karantänen för att hitta det ursprungliga e-postmeddelandet.

Vidtagen åtgärdblock
Källaexchange
ÄmneDavid Junge shared "Red hat" with you
PlatsVisa flaggat innehåll
Termer som utlöste policyn:
  • red hat

Om ni anser att detta var ett misstag, vänligen kontakta er IT-administratör.

Utställning 03 | Alert-e-postkälla: graph-management or dm-notify

Innehållsvarning

Ert innehåll flaggades eftersom det kan innehålla känsliga uppgifter. Vänligen granska innan ni delar.

Åtgärd: Alert
Källa: Sharepoint
Innehåll: Document.docx
Tid: 2026-06-02 23:01 UTC
Varför flaggades detta?

Analys: Dessa uppgifter innehåller personuppgifter enligt GDPR-reglerna. De inkluderar namn ("Peter"), nationella identifierare ("NIN", "DNI", "número de identidad") samt identifikationsnummer kopplade till individer, tillsammans med uppgifter om familjemedlemmars identitetshandlingar, vilket tydligt fastställer förekomsten av personuppgifter.

Detta är en informationsvarning. Ingen åtgärd har vidtagits för ert innehåll.

Detta är ett automatiserat meddelande från organisationens system för förebyggande av dataförlust.
Avsnitt 08Bakgrund

Vad schemaläggaren alltid gör

Fyra daemon-trådar startar vid applikationsstart och stannar aldrig. De håller tjänsten i gott skick utan cron eller extern orkestrering.

Jobb 01

Profilerarens hälsa

Pingar java_profiler och AI-profileraren. Registrerar övergångar mellan upp- och nedläge och presenterar åtgärdsförslag.

Jobb 02

Webhookens hälsa

Var 15:e minut. Flaggar klienter vars Graph-prenumerationer har varit tysta för länge.

Jobb 03

Driftavstämning

Varje timme. Återapplicerar massprenumerationer för lägena ALL och GROUPS så att nya användare och gruppändringar fångas upp automatiskt.

Jobb 04

Nådetidens upprätthållande

Går igenom granskningsindexet efter grace_block poster vars tidsfönster har passerat och skickar ut den uppskjutna åtgärden.

Trådarna är daemons så att gunicorn-arbetaren kan avslutas på ett kontrollerat sätt. Tillståndet lagras i Elasticsearch, inte i minnet, så att vilken arbetare som helst kan fortsätta där en annan slutade.
Avsnitt 09Under huven

The stack

KörningsmiljöPython 3.12, uv, Flask + Gunicorn :8000
Webblager10 Flask-blueprints (health, webhook, settings, transport-rules, pattern-library, audit, revert, subscriptions, testing, teams bot)
Resilienspybreaker kretsbrytare, tenacity-omförsök, ReDoS-skyddad regex (regex module timeout)
Microsoft 365Graph change webhooks (Teams, OneDrive, SharePoint), EXO transportregler, graph-management proxy, Teams bot SDK
Klassificerarejava_profiler för snabb klassificering, AI-profilerare hälsoövervakad parallellt, in-process regex-förfilter
DatalagerElasticsearch via dm-lib basmodellen: dlp_config, subscriptions, transport_rules, pattern_library, audit, exclusions, fingerprints, azure_creds, azure_users, azure_sites, bot_chat_lookup, email_settings
Notifieringargraph-management /send-mail (klientorganisationens postlåda) eller dm-notify /email/send (plattform), Teams adaptiva kort via boten
BakgrundDaemon-trådar för hälsoövervakning, driftavstämning och respitperiodstillämpning
DriftsättningDocker, AWS ECR (eu-central-1), bash deploy.sh
På en radDess form

Prenumerera, deduplicera, klassificera, besluta, agera, granska.

Från en Graph-notifiering till en Exchange-karantänfrisläppning följer varje Microsoft 365-förändring ett strikt flöde, avgränsat till en klientorganisation, på kortare tid än det tar för användaren att byta flik. Varje åtgärd loggas, varje blockering är reversibel och varje klassificerare är fail-open av design, så att systemet aldrig håller tillbaka innehåll av fel anledning.

github.com/dataandmore/dlp