Data & MoreEngineeringgithub.com/dataandmore/dlp

Stop lækagen
ved kilden.

En multi-tenant Flask-tjeneste, der abonnerer på Microsoft 365-ændringshændelser, scanner nye e-mails, Teams-chats, OneDrive- og SharePoint-indhold for personoplysninger og derefter blokerer, karantænesætter eller adviserer om det, før det spredes. Det samme revisionsforløb, der udløser blokeringen, giver dataejeren et enkelt-klik til at fortryde.

Overvåg hver ændring, klassificér på millisekunder, og handl, før siden er opdateret.

4Microsoft 365-kilder
5politikhandlinger pr. kilde
2klassificerere: regex + AI
60sdeduplikeringsvindue pr. ressource
Afsnit 01Oversigt

Hvad tjenesten gør

DLP-tjenesten befinder sig mellem Microsoft 365 og Data & More-platformens klassificeringsstak. Den abonnerer på Graph-ændringsbeskeder for de lejere, den betjener, deduplikerer dem, henter det berørte indhold, kører det igennem et hurtigt regex-prefilter og platformens profilere, og tilknytter derefter afgørelsen til en lejer-specifik politik og handler på den inden for kildesystemet. Hver handling skrives til et Elasticsearch-revisionsindeks, og hver blokering er koblet til et fortryd-link, som dataejeren kan anvende uden at forlade e-mailen.

Abonner

Lyt til M365

Graph-abonnementer holdes aktive af en baggrundsskemalægger, der fornyer tokens, afstemmer afvigelser og genanvender massekildekonfigurationer, når lejerens valg ændres.

Klassificér

Regex først, AI derefter

Hvert element gennemgår et lejer-tilpasset regex-prefilter (med ReDoS-beskyttede timeouts). Kun elementer, der passerer prefilteret, sendes videre til java_profiler for den mere omfattende PII-afgørelse.

Handl

Bloker, karantænesæt eller advarer

Politikken tilknytter et (kilde, afgørelse)-par til én af fem handlinger, som alle udføres inden for Microsoft 365: slet beskeden, flyt den til karantæne, redigér en fil, eller send blot en orienterende e-mail eller et Teams-kort.

Afsnit 02Pipelinen

Fra webhook til håndhævelse

Én ændring i Microsoft 365 resulterer i én besked, én klassificeringsrunde, én politikbeslutning og én revisionspost. Pipelinen nedenfor er det forløb, som enhver Teams-besked, OneDrive-upload og SharePoint-redigering gennemgår.

INDGANG DEDUP HENTNING KLASSIFICERING HANDLING AFLEVERING Microsoft Graph ændringwebhook POST /webhooks/graph clientState valideret returner 202 øjeblikkeligt Dedup in-process map key = resource TTL 60s dubletter fravalgt Hent indhold via Graph API teams: beskedindhold onedrive: fil sharepoint: fil exchange: karantæne Klassificér to-trins afgørelse regex prefilter 1s timeout pr. mønster java_profiler kredsløbsafbryder, gentag x3 Beslut + handl lejer-specifik politik tillad advarer bloker grace_block karantæne redigér Revision + besked ES-indeks e-mail + Teams én post pr. element Graph lifecycle webhook reauth, missed, removed POST /webhooks/graph/lifecycle Baggrundsskemalægger daemon-tråde, periodiske profilersundhed, webhook-sundhed, driftafstemning, håndhævelse af henstandsperiode Abonnementsdrift genanvend ved ændring hver time Håndhævelse af henstandsperiode udløbne poster periodisk oprydning Elasticsearch delt substrat: dlp_config, subscriptions, transport_rules, pattern_library, audit, exclusions, fingerprints læsninger + skrivninger
Primær pipeline-sti Livscyklus / betinget forgrening Persisteret / delt substrat
Afsnit 03Kilder

Fire måder indhold kan ankomme på

Hver kilde har sit eget Graph-abonnement, sit eget ressourcestiformat, sin egen indhentning af indhold og sin egen forståelse af, hvad blokering indebærer. Processoren ruter på den fortolkede ressource og videresender til den rette indhenter og den rette håndhævelse.

KildeRessourcestiAbonneret viaHåndhævelsesvektor
Teams/teams/{id}/channels/.../messagesGraph change webhookSvar med adaptivt kort, valgfri sletning
OneDrive/users/{id}/drive/rootGraph change webhookBloker via Graph-filhandlinger, eksklusionslager
SharePoint/sites/{id}/drive/rootGraph change webhookBloker via Graph-filhandlinger, ejere notificeres
Exchangetransport-rule quarantineEXO-transportregelScan-og-frigivelsesflow, separat sti
Abonnementer

Sådan forbliver de sunde

  • Planlæggeren overvåger abonnementsudløb og fornyer via graph-management inden tokens udløber.
  • Livscyklus-webhook'en håndterer reauthorizationRequired (forny), missed (log; administrator kan genanvende) og subscriptionRemoved (log).
  • Et driftafstemningsjob genanvender den samlede abonnementskonfiguration hver time for ALL-users- og GROUPS-tilstand; SELECTED-ids-tilstand berøres ikke.
Exchange

Hvorfor det har sit eget spor

Exchange er forbundet via en EXO-transportregel, der sætter mistænkelig post i karantæne, inden brugeren ser den. DLP-tjenesten henter derefter meddelelsen ud af karantænen, klassificerer den og enten leverer eller blokerer den. Exchange-notifikationer uden for karantæne afvises straks – de er enten forældede eller udtryk for fejlkonfiguration.

Afsnit 04Klassificering

To klassificerere, én afgørelse

Klassificeringen forløber i to trin, så det billige trin filtrerer hovedparten, og det dyre trin kun ser det, der overlever.

Trin 1

Regex-forfilter

En lejerspecifik liste over regex-mønstre, der kompileres ved første brug og rekompileres, når mønsterlisten ændres. Hvert match afvikles med en ReDoS-beskyttet timeout på 1 sekund (via tredjepartsmodulet regex), så ét patologisk mønster ikke kan blokere arbejderen.

første match vinder. returnerer mønsternavn, eller None.
Trin 2

java_profiler

Hvis forfilteret ikke afkorter behandlingen, sendes teksten til java_profiler'ens /dlp/classify endpoint. Klienten omslutter kaldet med et kredsløbsafbryder (5 fejl, 60 sekunders nulstilling) og et tenacity-genforsøg (3 forsøg, eksponentiel backoff ved forbindelses-/timeoutfejl). Ved total fejl slår den åbent fejl som "ingen PII" frem for at blokere uskyldig indhold.

anmodning: text, name, type, companyId
svar: pii: true | false
AI-profilertjenesten er ligeledes integreret (for dens NER- og ordbogsdrevne kategorier) og deler den samme sundhedsovervågningsstruktur, men DLP's hurtige sti går gennem java_profiler'ens dedikerede /dlp/classify endpoint, som er optimeret til binære bloker/tillad-afgørelser.
Afsnit 05Handlinger

Fra afgørelse til handling

(Kilde, afgørelse)-parret mappes til én af fem handlinger af den lejerspecifikke politik, der er gemt idlp_config. Allow lader systemet forblive stille; de øvrige fire resulterer alle i en revisionspost.

allow

Ingen handling

Enten blev der ikke registreret personhenførbare oplysninger, eller filen er på lejerens udelukkelsesliste for OneDrive / SharePoint. Intet skrives, intet sendes.

alert

Kun orientering

Indholdet forbliver på sin plads. Afsenderen (eller filejeren) modtager en e-mail eller et Teams-kort, der angiver, at indholdet udløste politikken. Nyttigt for kategorier med lav alvorlighed.

block

Øjeblikkelig håndhævelse

Håndhævelseslag et handler i kilden: Teams-besked skjult bag et kort, OneDrive / SharePoint-fil låst, Exchange-mail fjernet fra karantæne. Revisionsposten indeholder et tilbageførselstoken, så handlingen kan fortrydes.

grace_block

Menneskelig verificering

Filen efterlades urørt, og ejeren modtager en e-mail med tre muligheder: håndhæv nu, annuller (med valgfri midlertidig eller permanent udelukkelse), eller gør intet. Efter respitperioden henter planlæggeren posten og håndhæver automatisk.

quarantine

Exchange-specifik

Indgående mail, der er fanget af transportreglen, befinder sig i karantæne. DLP-tjenesten klassificerer den og vælger mellem frigivelse (lever), tilbageholdelse (bloker) og underretning (under gennemgang). En separat sti til scan-og-frigiv-notifikationer holder afsenderen orienteret.

revert

Fortryd med ét klik

Enhver blokeringshandling indlejrer en signeret revert-URL i notifikationen. Modtageren klikker på den, ogrevert_servicelæserreversal_datafra revisionsposten for at fortryde handlingen og skrive en tilhørende revisionspost for tilbageførslen.

Afsnit 06Respitflow

Formen på enmenneskelig verificeret blokering

Engrace_blocker den blødere mulighed for OneDrive og SharePoint: der sker inget i kilden, indtil ejeren enten træffer en beslutning, eller respitperioden udløber.

PII registreret grace_block-politik Revisionspost: afventende grace_expires_at = +Nd E-mail til ejer tre signerede links håndhæv nu annuller gør intet håndhæv nu udsend blokering, status: håndhævet, revert-link bevaret annuller, valgfri udelukkelse status: annulleret, udelukkelse: ingen | midlertidig | permanent planlægger håndhæver automatisk når grace_expires_at < now()
Blokeringsbeslutningssti Annulleringsgren Resultat / revisionstilstand
Afsnit 07Notifikationer

Nå ejeren, der hvor deallerede befinder sig

Notifikationer adresseres til den identitet, der er relevant for kilden (afsender i Teams, filens ejer i OneDrive, webstedets ejere i SharePoint). Transporten vælges pr. lejer.

Teams

Adaptivt kort, i tråden

Ved Teams-notifikationer sender botten et proaktivt svar i den oprindelige tråd (eller en DM, hvis kanalsvaret mislykkes). Kortet viser handlingen, et begrundelsesudsnit, et deep link til beskeden samt revert-URL'en.

Email

Graph mail eller dm-notify

E-mailtransporten vælges pr. lejer:graph-managementsender som lejerens egen postkasse, når Graph mail-indstillingerne er konfigureret, ellers senderdm-notifyfra platformen. Skabeloner er pr. handling med lejerspecifikke tilsidesættelser for overskrift / brødtekst / sidefod.

HandlingEmne-skabelonIndeholder
blockData Protection Policy: Content BlockedRevert-link
grace_blockData Protection Policy: Action RequiredRespitperiode + tre signerede links
alertData Protection Policy: Content AlertedKun overskrift / brødtekst / sidefod
quarantine, under reviewData Protection Policy: Email Under Reviewi/t
quarantine, deliveredData Protection Policy: Email Deliveredi/t
quarantine, blockedData Protection Policy: Email BlockedRevert-link

Eksempler fra den virkelige verden

Nedenstående mockups gengiver tre faktiske notifikationer, som tjenesten sender: ét Teams-adaptivt kort, én e-mail af block-klassen og én e-mail af alert-klassen. De er indrammet i Field Manual-udstillingskort, men bærer deres egen produktfarveidentitet, så læseren ser, hvad deres brugere faktisk ser.

Udstilling 01 | Teams-adaptivt kortkilde: bot proaktivt svar
Data & More DLP08.39
DATABESKYTTELSESADVARSEL

Indholdsbeskед

Dit indhold blev markeret, fordi det muligvis indeholder følsomme data. Gennemgå venligst inden deling.


Indhold
(ingen emne)
Tidspunkt
2026-06-03 06:39 UTC
Hvorfor blev dette markeret?

Analyse: Disse data indeholder personoplysninger i henhold til GDPR-reglerne. Strengen "mit cpr er 010101…" repræsenterer sandsynligvis et dansk CPR-nummer (Det Centrale Personregister), en unik identifikator for en person, og falder dermed ind under definitionen af personoplysninger.

Dette er en informationsadvarsel. Der er ikke foretaget nogen handling på dit indhold.

Udstilling 02 | Block-e-mailkilde: graph-management eller dm-notify
GDPR-ADVARSEL

Indhold blokeret

Dit indhold blev blokeret af organisationens databeskyttelsespolitik. Tjek dlp-karantænen for at finde den originale mail.

Foretaget handlingblokering
Kildeexchange
EmneDavid Junge shared "Red hat" with you
PlaceringVis markeret indhold
Udtryk der udløste politikken:
  • red hat

Hvis De mener, at dette var en fejl, bedes De kontakte Deres IT-administrator.

Udstilling 03 | Alert-e-mailkilde: graph-management eller dm-notify

Indholdsbeskед

Dit indhold blev markeret, fordi det muligvis indeholder følsomme data. Gennemgå venligst inden deling.

Handling: Advarsel
Kilde: Sharepoint
Indhold: Document.docx
Tidspunkt: 2026-06-02 23:01 UTC
Hvorfor blev dette markeret?

Analyse: Disse data indeholder personoplysninger i henhold til GDPR-reglerne. De omfatter navne ("Peter"), nationale identifikatorer ("NIN", "DNI", "número de identidad") samt identifikationsnumre tilknyttet enkeltpersoner, tillige med oplysninger om familiemedlemmers identifikationsdokumenter, hvilket klart fastslår tilstedeværelsen af personoplysninger.

Dette er en informationsadvarsel. Der er ikke foretaget nogen handling på dit indhold.

Dette er en automatisk besked fra Deres organisations system til forebyggelse af datatab.
Afsnit 08Baggrund

Hvad scheduleren altid gør

Fire daemon-tråde starter ved app-opstart og stopper aldrig. De holder tjenesten sund uden nogen cron eller ekstern orkestrator.

Job 01

Profilersundhed

Pinger java_profiler og AI-profilerne. Registrerer op/ned-overgange og fremviser afhjælpningshandlinger.

Job 02

Webhook-sundhed

Hvert 15. minut. Markerer lejere, hvis Graph-abonnementer har været inaktive for længe.

Job 03

Driftsafstemning

Hver time. Genanvender masseabonnementer for ALL- og GROUPS-tilstandene, så nye brugere og gruppeændringer registreres automatisk.

Job 04

Nådeperiodhåndhævelse

Gennemgår revisionsindekset for grace_block poster, hvis vindue er udløbet, og afsender den udsatte håndhævelse.

Trådene er daemons, så gunicorn-arbejderen kan afslutte korrekt. Tilstand opbevares i Elasticsearch og ikke i hukommelsen, så enhver arbejder kan fortsætte, hvor en anden slap.
Afsnit 09Under motorhjelmen

stakken

KørselsmiljøPython 3.12, uv, Flask + Gunicorn :8000
Weblag10 Flask-blueprints (health, webhook, settings, transport-rules, pattern-library, audit, revert, subscriptions, testing, teams bot)
Robusthedpybreaker-kredsløbsafbrydere, tenacity-genforsøg, ReDoS-beskyttet regex (regex modultimeout)
Microsoft 365Graph change webhooks (Teams, OneDrive, SharePoint), EXO transportregler, graph-management proxy, Teams bot SDK
Klassifikatorerjava_profiler til hurtig klassificering, AI-profiler sundhedsovervåget sideløbende, in-process regex prefilter
DatalagerElasticsearch via dm-lib basismodellen: dlp_config, subscriptions, transport_rules, pattern_library, audit, exclusions, fingerprints, azure_creds, azure_users, azure_sites, bot_chat_lookup, email_settings
Notifikationergraph-management /send-mail (lejer-postkasse) eller dm-notify /email/send (platform), Teams adaptive cards via bot'en
BaggrundDaemon-tråde til sundhedsovervågning, driftsafstemning og håndhævelse af henstandsperioder
UdrulningDocker, AWS ECR (eu-central-1), bash deploy.sh
I én linjeDens form

Abonner, deduplikér, klassificér, beslut, handl, auditér.

Fra en Graph-notifikation til en frigivelse fra Exchange-karantæne følger enhver Microsoft 365-ændring én stramt defineret sløjfe, afgrænset til én lejer, på kortere tid end det tager brugeren at skifte fane. Hver handling logges, hver blokering kan fortrydes, og hver klassifikator er fail-open by design, så systemet aldrig tilbageholder indhold af den forkerte årsag.

github.com/dataandmore/dlp