Azure Data Collection Rules: Ingestion-time PII maskování v Log Analytics
Azure Data Collection Rules: Ingestion-time PII maskování v Log Analytics
V Christie's jsme měli klasický problém: aplikační logy obsahovaly e-maily klientů, telefonní čísla a občas i hodnoty draženého zboží. Vše tohle se dostávalo do Log Analytics workspace, kam má read přístup celý platform tým – tedy lidé, kteří nemají legitimní důvod vidět konkrétní PII. SOC zákazníka si toho všiml během compliance auditu a deadline na nápravu byl konec ledna.
Klasické řešení by bylo „upravte aplikaci, aby tohle nelogovala". V realitě? Třicet legacy aplikací, šest týmů, šest priorit – takže odpověď byla ingestion-time transformace přes Data Collection Rules.
Architektura: kde DCR sedí v pipeline
[Aplikace] → [AMA / Logs Ingestion API] → [DCR transformace] → [Log Analytics tabulka]
↑
Tady maskujeme PIIKlíčové vlastnosti, kvůli kterým jsme DCR vybrali místo logstash/splunk forwarderu:
- Nativní v Azure – žádný další serverový komponent k údržbě
- Per-tabulkové scope – jiná pravidla pro
AppTracesa jiná proAppExceptions - Audit DCR změn přes Azure Activity Log – kdokoliv změní transformaci, je to vidět
- Bez dopadu na schéma – transformace běží před zápisem, schema tabulky zůstává stabilní
Příklad 1: maskování e-mailových adres
První pravidlo, které jsme nasadili, bylo nejjednodušší. Najít e-mail v Message sloupci a nahradit lokální část hvězdičkami.
source
| extend Message = replace(
@'([a-zA-Z0-9._%+-]+)(@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})',
@'***\2',
Message
)Pozor: v DCR transformacích není dostupný replace_regex(). Musíte použít replace(), který v DCR variantě regex přijímá (na rozdíl od některých dokumentací). Toto byla nejnepříjemnější část onboardingu – KQL v DCR a v běžných queries se chová jinak.
Po nasazení vypadá v Log Analytics e-mail martin.rylko@example.com jako ***@example.com. Doména zůstane pro debug, lokální část je pryč. Pro forensní účely máme paralelní pipeline (viz sekce 6).
Příklad 2: kompletní vymazání čísel karet
Pro PCI data nejde o maskování, ale o úplné odstranění. Zde používáme prázdnou náhradu:
source
| extend Message = replace(
@'\b(?:\d[ -]*?){13,19}\b',
'[CARD_REDACTED]',
Message
)Regex pokrývá 13–19místné sekvence číslic s volitelnými mezerami/pomlčkami, což chytá Visa, Mastercard, AMEX i divočejší formáty.
Příklad 3: pojmenované entity z aplikační vrstvy
Některá data si aplikace logují strukturovaně – třeba clientId=CL-12345. Pro tyhle si můžeme dovolit hashovat místo maskovat, abychom zachovali možnost agregace:
source
| extend ClientHash = case(
Message has 'clientId=',
hash_sha256(extract(@'clientId=([A-Z0-9-]+)', 1, Message)),
''
)
| extend Message = replace(@'clientId=[A-Z0-9-]+', 'clientId=[HASHED]', Message)
| project-away ClientHashTrik je v case() – pokud řádek nemá clientId=, hash se nepočítá vůbec. To dramaticky snižuje CPU overhead na agentovi.
Nasazení DCR přes Bicep
Manuální tvorba přes Portal je dobrá pro první lab. Pro produkci jdeme Bicepem:
resource dcr 'Microsoft.Insights/dataCollectionRules@2023-03-11' = {
name: 'dcr-pii-masking-prod'
location: location
kind: 'Direct'
properties: {
streamDeclarations: {
'Custom-AppTraces': {
columns: [
{ name: 'TimeGenerated', type: 'datetime' }
{ name: 'Message', type: 'string' }
{ name: 'SeverityLevel', type: 'int' }
{ name: 'AppRoleName', type: 'string' }
]
}
}
destinations: {
logAnalytics: [
{
workspaceResourceId: workspaceId
name: 'la-destination'
}
]
}
dataFlows: [
{
streams: ['Custom-AppTraces']
destinations: ['la-destination']
transformKql: '''
source
| extend Message = replace(@'([a-zA-Z0-9._%+-]+)(@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})', @'***\\2', Message)
| extend Message = replace(@'\\b(?:\\d[ -]*?){13,19}\\b', '[CARD_REDACTED]', Message)
'''
outputStream: 'Microsoft-AppTraces'
}
]
}
}Tři věci, na kterých jsme se v Christie's spálili a které stojí za zmínku:
outputStreammusí odpovídat cílové tabulce – proAppTracesje toMicrosoft-AppTraces, ne custom název- Escaping backslashů v Bicepu – v multiline string literal (
'''...''') musíte zdvojit zpětná lomítka, jinak Bicep parser regex rozbije - AMA potřebuje DCR association, ne přímé přiřazení – musíte separátně vytvořit
Microsoft.Insights/dataCollectionRuleAssociations
Lab pattern: jak validovat transformaci před produkcí
Tohle je můj nejcennější tip. Microsoft poskytuje Invoke-AzOperationalInsightsQuery ekvivalent pro DCR transformace – DCR Sandbox v Azure Portal (Monitor → Data Collection Rules → vyberete DCR → Transformation editor → "Run").
Workflow:
- Vezměte 50 reálných řádků produkčního logu (sanitized export)
- Vložte do JSON formátu očekávaného streamem
- Spusťte transformaci v editoru
- Zkontrolujte, že žádný řádek nepropouští plné PII
- Diff oproti baseline pro regression check
V Christie's jsme tohle pověsili na CI – PR na DCR Bicep souboru spouští unit test, který vezme fixture s 200 řádky a ověří absence regex matchů na originální PII vzory ve výstupu.
Compliance: co to vlastně řeší (a co ne)
| Požadavek | DCR transformace pomáhá? |
|---|---|
| GDPR čl. 32 (pseudonymizace) | Ano – maskovaná data nejsou „osobní" ve smyslu GDPR |
| GDPR čl. 17 (právo na výmaz) | Částečně – z hlavního workspace OK, ale forensní pipeline musíte řešit zvlášť |
| PCI DSS Req. 3.4 | Ano – [CARD_REDACTED] je dostatečné maskování |
| NIS2 čl. 21 (logging) | Ano – stále máte plný audit, jen bez PII |
| Customer ask „nezobrazovat klienty supportu" | Ano – read RBAC vidí maskovaná data |
Co DCR neřeší: pokud aplikace pošle do Application Insights TrackException s plným stack trace obsahujícím PII, transformace v AppExceptions musí explicitně pokrýt i OuterMessage a Details. Snadno se zapomene.
Závěr
DCR transformace jsou v lednu 2026 nejčistší cesta, jak v Azure Monitoru splnit „PII nikdy v plné podobě nedorazí do log storage" požadavek bez přepisování aplikací. Cena: 30–40 hodin engineering času na první rule sadu, +10 % CPU na agentech, +10 sekund ingest latence.
Hodnota: kompliance audit bez nálezů a klid SOC týmu, kterému už nehrozí, že ho někdo zavolá kvůli e-mailu v logu.
Pokud řešíte podobný problém s logováním PII a chcete DCR pattern nasadit do vlastního prostředí, podívejte se na naše služby cloudové architektury nebo se ozvěte pro lab walkthrough.
O autorovi

Martin Rylko
Senior Cloud Architect & DevOps Engineer
Více než 14 let v IT – od on-premises datacenter a Hyper-V clusteringu po cloudovou infrastrukturu v Microsoft Azure. Specializuji se na Landing Zones, IaC automatizaci, Kubernetes a bezpečnostní compliance.
Nejcastejsi dotazy
Co je Data Collection Rule (DCR) a proč ho používat pro maskování?▾
Funguje v DCR transformacích plný KQL?▾
Jaký je výkonový dopad DCR transformací na ingest?▾
Maskovaná data v DCR jsou opravdu nenávratně ztracená?▾
Mohlo by vás zajímat
Foundational CSPM přestane být default: co dopsat do subscription vendingu do 27. října 2026
Od 27. října 2026 se Foundational CSPM na nových Azure subskripcích nezapne sám. Není to problém bezpečnostního týmu, ale vaší landing zone továrny. Bicep, policy a ARG dotaz na audit.
ČístAzure Private Endpoints všude: Refactor serverless pipeline z APIM na PE-only
Praktický refactor serverless e-mailové pipeline z APIM-fronted architektury na private endpoint-only end state. Shared PE subnet, Function Apps Premium, Service Bus a Log Analytics bez veřejného povrchu.
ČístZero Trust v Azure: Navrh Conditional Access politik
Zero Trust identitni architektura s Entra ID Conditional Access. Vynuceni MFA, device compliance, session controls a pojmenovane lokace pro Azure prostredi.
Číst