Martin Rylko
  • Služby
  • Blog
  • O mně
  • Kontakt
  • Spolupráce
Martin Rylko

Senior Cloud Architect & DevOps Engineer. Specializace na Microsoft Azure, IaC, Cloud Security a AI.

Navigace

  • Služby
  • Blog
  • O mně
  • Kontakt

Spolupráce

Hledáte zkušeného architekta pro Váš Azure projekt? Ozvěte se.

rylko@cloudmasters.cz

© 2026 Martin Rylko. Všechna práva vyhrazena.

Buduji v cloudu. Nasazuji přes Azure Static Web Apps.

Domů/Blog/Azure Data Collection Rules: Ingestion-time PII maskování v Log Analytics
Všechny článkyRead in English

Azure Data Collection Rules: Ingestion-time PII maskování v Log Analytics

20. 1. 2026 4 min
#Azure#Log Analytics#Security#DCR#GDPR

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 PII

Klíč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 AppTraces a jiná pro AppExceptions
  • 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 ClientHash

Trik 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:

  1. outputStream musí odpovídat cílové tabulce – pro AppTraces je to Microsoft-AppTraces, ne custom název
  2. Escaping backslashů v Bicepu – v multiline string literal ('''...''') musíte zdvojit zpětná lomítka, jinak Bicep parser regex rozbije
  3. 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:

  1. Vezměte 50 reálných řádků produkčního logu (sanitized export)
  2. Vložte do JSON formátu očekávaného streamem
  3. Spusťte transformaci v editoru
  4. Zkontrolujte, že žádný řádek nepropouští plné PII
  5. 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žadavekDCR 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.4Ano – [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.

Tagy:#Azure#Log Analytics#Security#DCR#GDPR
LinkedInX / Twitter

O autorovi

Martin Rylko

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.

Email LinkedInCelý profil

Nejcastejsi dotazy

Co je Data Collection Rule (DCR) a proč ho používat pro maskování?▾
Data Collection Rule je transformační vrstva mezi zdrojem logů a Log Analytics workspace. Umožňuje filtrovat, obohacovat a maskovat data v okamžiku ingestionu – tedy ještě před tím, než se zapíší do tabulky. Pro PII to znamená, že citlivé hodnoty (e-maily, čísla karet, jména klientů) nikdy do storage nedorazí v plné podobě a nemůže je tak nikdo vytáhnout ani s plnými oprávněními.
Funguje v DCR transformacích plný KQL?▾
Ne. DCR transformace podporují pouze podmnožinu KQL – konkrétně extend, project, where, parse a několik scalar funkcí jako replace, substring, strcat. Nepodporují join, summarize, ani replace_regex. Toto je nejčastější past při migraci pravidel z scheduled queries – musíte přepsat regexové transformace na kombinaci replace + extract.
Jaký je výkonový dopad DCR transformací na ingest?▾
V mých lab testech přidala středně složitá transformace (5 sloupců, dvě maska­ce přes replace) ingest latenci přibližně 8–12 sekund a CPU overhead na Azure Monitor Agent zhruba 3–5 %. Pro běžné objemy (desítky GB/den) je dopad zanedbatelný. Pro velkoobjemový ingest (1+ TB/den) doporučuji zvážit, zda transformace přesunout do Event Hubs preprocessoru.
Maskovaná data v DCR jsou opravdu nenávratně ztracená?▾
Ano, a to je celý smysl. Hodnota přepsaná v DCR transformaci se do Log Analytics nedostane ani v audit logu, ani v _Original poli – DCR neeviduje původní hodnoty. Pokud potřebujete pro forensní účely občas vidět originál, musíte zdvojit pipeline: jeden DCR maskuje a posílá do hlavního workspace, druhý posílá raw data do izolovaného workspace s Customer-Managed Keys a přísným RBAC.

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.

Číst

Azure 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.

Číst

Zero 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