ms-ai-architect/skills/ms-ai-security/references/ai-security-engineering/pii-detection-norwegian-context.md
Kjell Tore Guttormsen ddce43d8b2 feat(ms-ai-architect): Spor 1 — Port-1-substrat migrert på 4 ikke-advisor-skills (243 Source + 327 Type + 325 TOC + stale-verified poison fjernet) [skip-docs]
Steg 9 (R4): unified migrate-corpus.mjs --write over engineering/governance/
infrastructure/security. 327 filer mutert, verified=null, prosa byte-identisk
(fra første ## seksjon), advisor urørt (0 endringer).

To applier-fixes oppdaget under kjøring (TDD, RED→GREEN):
- insertHeaderFields: anker faller nå tilbake når en meta-linje selv passerer
  500B (2 filer pakket et avsnitt i **Status:** → Type/Source landet utenfor
  scan-vinduet, applierens post-write-assertion fanget + restaurerte).
- normalizeStaleVerified: fjerner nå ALLE stale non-date **Verified:** i
  500B-vinduet, inkl. stray body-dup rett under --- (9 mlops-genaiops-filer var
  ellers falskt "verified"/fresh, droppet fra worklist). Operatør-godkjent
  utvidelse av carve-out; kun stray metadata-linjer, aldri prosa.

test-transform-criterion: precondition oppdatert til post-migrasjons-sannhet
(fila bærer nå Source). Suite 728/728 grønn.
2026-07-04 10:19:11 +02:00

20 KiB
Raw Blame History

PII Detection and Masking in Norwegian Text

Last updated: 2026-06-19 Status: GA Category: AI Security Engineering Type: reference Source: https://learn.microsoft.com/azure/ai-services/language-service/personally-identifiable-information/overview


Innhold

Introduksjon

Beskyttelse av personopplysninger er ikke bare en teknisk nødvendighet, men en juridisk plikt i Norge. Azure AI Language tilbyr PII-deteksjon som kan identifisere og maskere sensitive opplysninger som fødselsnummer, D-nummer, adresser og telefonnummer i norsk tekst.

I norsk kontekst er PII-deteksjon spesielt viktig fordi:

  • Fødselsnummer (11 siffer) er den viktigste personidentifikatoren i Norge, brukt av NAV, Skatteetaten og alle offentlige systemer
  • D-nummer brukes for personer uten fødselsnummer (utlendinger, asylsøkere)
  • Organisasjonsnummer (9 siffer) må skilles fra personopplysninger
  • Adresser inneholder ofte gate, postnummer og poststed
  • NAV-nummer og andre fagsystem-identifikatorer

Azure AI Language støtter norsk språk (language: "no") og kan detektere både generelle PII-kategorier (navn, e-post, telefon) og nordiske ID-numre (NOIdentityNumber). Tjenesten bruker maskinlæring kombinert med regex-basert validering for høy presisjon.

Kjernekomponenter

Azure AI Language PII Detection

Azure AI Language grupperer PII i tre feature-typer (etter input-format og prosesseringsmodell):

Feature-type Bruksområde Format
Text PII Ustrukturert tekst (e-post, chat, notater, prompts, logger) Synkron, string-basert JSON payload
Conversation PII Transkribert tale fra møter og kundesenter Asynkron, tur-/transkriptbasert format
Document-based PII (tidl. «Native Document PII») .pdf, .docx, .txt-filer Asynkron, lagringsbasert; bevarer dokumentstruktur + JSON-metadata

Støttede entitetstyper (norsk kontekst)

Entitetstype Azure kategori Eksempel Validering
Fødselsnummer NOIdentityNumber 01019912345 11 siffer, kontrollsiffer
D-nummer NOIdentityNumber 41019912345 11 siffer, dag +40
Person Person Ola Nordmann ML-basert
E-post Email ola@example.no Format-validering
Telefon PhoneNumber +47 123 45 678 Regex
Adresse Address Storgata 1, 0123 Oslo ML-basert
Organisasjon Organization NAV, Skatteetaten ML-basert
EU Passport EUPassportNumber Norsk pass Format-validering
EU Drivers License EUDriversLicenseNumber Norsk saksbehandling Format-validering
Bank Account InternationalBankingAccountNumber IBAN Format-validering

Viktig: Azure detekterer norske fødselsnummer under kategorien NOIdentityNumber. Du må spesifisere language: "no" for optimal deteksjon.

Maskeringsstrategier (Verified MCP 2026-06)

API-versjoner (Text PII): GA er 2026-05-01; nyeste preview er 2026-05-15-preview. Redaction-policies, confidenceScoreThreshold, disableEntityValidation, entitySynonyms og valueExclusionPolicy er preview-funksjoner (først introdusert i 2025-11-15-preview, nå dokumentert under gjeldende preview). Bruk GA-versjonen for produksjon.

Azure AI Language tilbyr fire redaction policies (redactionPolicies):

Policy Output Bruksområde
CharacterMask (default) Min SSN er *********** Standard masking; støtter valgfri redactionCharacter (f.eks. -)
EntityMask Min SSN er [NOIdentityNumber_1] Logging, debugging
SyntheticReplacement Min SSN er 12345678901 Syntetiske testdata (tilfeldig valgte erstatningsverdier fra forhåndsdefinert sett)
NoMask Min SSN er 01019912345 Kun entitetsdeteksjon, ingen redactedText i respons

Anbefalt: CharacterMask for produksjon, EntityMask for logging (spesifiserer entitetstype), NoMask når du kun trenger deteksjon uten redaction.

Per-entity policy overrides: Du kan spesifisere ulike policies per entitetstype i samme request, med én defaultRedactionPolicy og entitetsspesifikke overrides. (Verified MCP 2026-06)

DisableEntityValidation: Mulighet til å deaktivere streng entitetsvalidering (default false) for å øke hastighet i scenarioer der validering ikke er nødvendig. (Verified MCP 2026-06)

EntitySynonyms og ValueExclusionPolicy: Tilpass PII-tjenesten til organisasjonens vokabular — definer egne synonymer for entitetstyper, og ekskluder spesifikke termer fra deteksjon (f.eks. "politimann", "vitne"). (Verified MCP 2026-06)

Confidence Threshold (Verified MCP 2026-06)

Med preview-API-et kan du konfigurere confidenceScoreThreshold med global default og per-entitet, per-språk overrides:

{
  "parameters": {
    "confidenceScoreThreshold": {
      "default": 0.9,
      "overrides": [
        { "value": 0.8, "entity": "NOIdentityNumber" },
        { "value": 0.6, "entity": "Person", "language": "no" }
      ]
    }
  }
}

Råd: Bruk 0.8+ global default for produksjon (minimerer false positives), 0.6+ for utviklingsmiljø. Per-entitet overrides gir finkornet kontroll. (Verified MCP 2026-04)

Arkitekturmønstre

Mønster 1: Pre-Processing Pipeline (anbefalt)

Bruksområde: Skjemaer, søknader, kundehenvendelser

Innkommende data → Azure AI Language PII → Maskert tekst → Lagring → Prosessering

Fordeler:

  • PII fjernes før lagring (comply-by-design)
  • Ingen PII i database eller logging
  • Enkel compliance-revidering

Ulemper:

  • Irreversibel masking (kan ikke gjenopprette originaltekst)
  • Latency på inbound-request

Implementasjon:

  • Azure Function med PII detection før Cosmos DB/SQL
  • Power Automate cloud flow med Azure AI Language connector

Mønster 2: Dynamic Masking (on-demand)

Bruksområde: Saksbehandlerportaler, kundesenterløsninger

Database (original) → Azure AI Language PII (on-demand) → Visning (maskert)

Fordeler:

  • Originaldata bevares (kan gjenopprettes ved autorisasjon)
  • Rollbasert tilgang (saksbehandler ser kun delvis masking)

Ulemper:

  • PII i database (krever kryptering, TDE)
  • Latency per visning

Implementasjon:

  • Azure SQL Dynamic Data Masking + Azure AI Language
  • Custom middleware i API-lag

Mønster 3: Pseudonymization (GDPR-compliant)

Bruksområde: Dataanalyse, maskinlæring

Original data → Azure AI Language PII → Pseudonymisering → Sekundær database → Analyse

Fordeler:

  • Analytikere kan jobbe med data uten PII-eksponering
  • Mulighet for re-identifikasjon ved autorisasjon (reverserbar mapping)

Ulemper:

  • Kompleks key management (mapping-tabell må sikres)
  • Risk for re-identifikasjon ved kobling med eksterne data

Implementasjon:

  • Azure Synapse Analytics + PII detection i ELT-pipeline
  • Mapping-tabell i Azure Key Vault managed secrets

Beslutningsveiledning

Når bruke Azure AI Language PII vs. andre løsninger?

Scenario Azure AI Language PII Alternativ Hvorfor
Norsk ustrukturert tekst ✅ Ja Azure SQL Dynamic Data Masking Azure AI Language forstår kontekst (ikke bare regex)
Real-time chat/kundesenter ✅ Ja Regex-basert filtrering Håndterer transkribert tale, dialekt-varianter
PDF/Word-dokumenter ✅ Ja (Native Document PII) Manuell ekstraksjon + regex Støtter native formater, bevarer layout
Strukturert database-data ❌ Nei Azure SQL Dynamic Data Masking Mer effektivt for kolonnebasert masking
Faste felt (f.eks. kun fødselsnummer) ❌ Nei Regex + checksumvalidering Billigere, raskere

Vanlige feil

Feil Konsekvens Løsning
Ikke spesifisere language: "no" Fødselsnummer ikke detektert Bruk language: "no", ikke "en"
Bruke default PII-kategorier Mangler norske identifikatorer Eksplisitt inkluder NOIdentityNumber
Ikke validere confidence score False positives i produksjon Bruk confidenceScoreThreshold: 0.8
Maskere all tekst (inkl. kontekst) Ikke-semantisk output Bruk selective masking (kun PII-entiteter)
Ikke teste med D-nummer D-nummer lekker Test med både fødselsnummer og D-nummer

Røde flagg

  • ⚠️ Fødselsnummer i URL-parametere → Bruk POST body, aldri GET query string
  • ⚠️ PII i logmeldinger → Masker før logging (Azure Monitor støtter custom processing)
  • ⚠️ Masking etter lagring → For sent! Bruk pre-processing pipeline
  • ⚠️ Ikke kryptere maskert data → Masked data er fortsatt sensitive metadata (entity types)
  • ⚠️ Gjenbruk maskerte datasett → Synthetic replacement er nødvendig for ML-training

Integrasjon med Microsoft-stakken

Microsoft Foundry (Verified MCP 2026-04)

Playground: Test PII-deteksjon i Microsoft Foundry portal:

  1. Naviger til Language → PII Detection
  2. Velg Extract PII from text
  3. Velg språk: Norwegian
  4. Lim inn tekst med fødselsnummer
  5. Se detekterte entiteter med confidence scores

Model deployment: Bruk modelVersion: "latest" for nyeste modell; velg GA-API 2026-05-01 for produksjon og 2026-05-15-preview for nye preview-features.

Merk: Microsoft Foundry (new) — ny portal med Foundry-prosjekter — og Foundry (classic) er begge tilgjengelige via https://ai.azure.com/. For opprettelse av Language-ressurs, bruk Azure Language in Foundry Tools. (Verified MCP 2026-06)

Copilot Studio

Custom PII masking i Copilot:

# I Copilot Studio, bruk Azure Function skill
- skill: "mask-pii"
  trigger: "before_store_message"
  action:
    - call: azure_function_url
    - parameters:
        text: "{user_message}"
        language: "no"

Beste praksis: Masker brukerinndata før de sendes til conversation history (unngå PII i Dataverse).

Power Automate

PII masking i cloud flow:

  1. Trigger: When a new form is submitted (Forms)
  2. Action: Azure AI Language - Detect PII
    • Text: {form_response}
    • Language: no
  3. Condition: If @{body('Detect_PII')?['entities']} is not empty
  4. Action: Store masked text: @{body('Detect_PII')?['redactedText']}

Tips: Bruk confidenceScoreThreshold: 0.8 i custom connector for høy presisjon.

Azure Synapse Analytics / Databricks

PII masking i ELT pipeline:

# PySpark UDF med Azure AI Language
from pyspark.sql.functions import udf
from azure.ai.textanalytics import TextAnalyticsClient

def mask_pii(text):
    client = TextAnalyticsClient(endpoint, credential)
    result = client.recognize_pii_entities([text], language="no")[0]
    return result.redacted_text

mask_pii_udf = udf(mask_pii)
df_masked = df.withColumn("text_masked", mask_pii_udf(df.text))

Optimalisering: Bruk batch processing (opptil 5000 dokumenter per request) for bedre throughput.

Azure API Management

PII masking i API gateway:

<policies>
  <inbound>
    <send-request mode="new" response-variable-name="pii-response">
      <set-url>https://{endpoint}/language/:analyze-text</set-url>
      <set-method>POST</set-method>
      <set-body>@{
        return JsonConvert.SerializeObject(new {
          kind = "PiiEntityRecognition",
          parameters = new { language = "no" },
          analysisInput = new { documents = new[] { new { id = "1", text = context.Request.Body.As<string>() } } }
        });
      }</set-body>
    </send-request>
    <set-body>@(((IResponse)context.Variables["pii-response"]).Body.As<JObject>()["results"]["documents"][0]["redactedText"].ToString())</set-body>
  </inbound>
</policies>

Offentlig sektor (Norge)

GDPR og Personopplysningsloven

Artikkel 32 - Sikkerhet ved behandling:

Behandlingsansvarlig og databehandler skal [...] iverksette egnede tekniske og organisatoriske tiltak for å sikre et sikkerhetsnivå som passer med risikoen.

PII-deteksjon oppfyller:

  • Pseudonymisering (Art. 25, 32)
  • Data minimization (Art. 5)
  • Privacy by design (Art. 25)

Dokumentasjon:

  • Logg alle PII-deteksjoner med tidsstempel, bruker, confidence score
  • ROS-analyse: Identifiser risiko for false negatives (PII ikke detektert)
  • DPIA: Dokumenter hvordan PII-masking reduserer risiko

Forvaltningsloven og Offentleglova

Innsyn i saksdokumenter (§ 13):

  • Masker PII i dokumenter før offentliggjøring
  • Bevar original i intern saksbehandling

Eksempel: Innsynskrav i NAV-sak → Masker andre personers fødselsnummer, behold søkerens.

Datatilsynets veiledning

Anbefalinger:

  • Bruk confidenceScoreThreshold: 0.8+ for å minimere false negatives
  • Test med norske edge cases: D-nummer, korte navn (Ola, Per), dialektuttrykk
  • Dokumenter hvilke PII-kategorier som detekteres (gi brukerne transparens)

Veiledning om automatiserte avgjørelser:

  • PII-masking er ikke en "automatisert individuell avgjørelse" (GDPR Art. 22), men påvirker datakvalitet
  • Sikre at maskerte data ikke forårsaker bias i AI-modeller

Digdir-prinsipper

Prinsipp 2: Sikkerhet og personvern:

  • PII-deteksjon skal integreres i alle digitale tjenester som håndterer personopplysninger
  • Bruk Azure AI Language som standardkomponent i sikker-by-design-arkitekturer

Prinsipp 4: Brukervennlighet:

  • Masker kun nødvendig data (unngå overmasking som ødelegger lesbarhet)
  • Gi brukere mulighet til å se originaltekst ved autorisasjon

Kostnad og lisensiering

Prismodell (Azure AI Language - Text Analytics)

Tier Pris (per 1000 text records) Inkluderer
Free (F0) 5000 records/måned gratis PII detection, NER, sentiment
Standard (S) $2 per 1000 records All features, SLA 99.9%

Norsk kontekst:

  • 1 text record = opptil 5120 tegn
  • Gjennomsnittlig norsk tekst (e-post, chat): 500-1000 tegn → 5-10 records per 1000 meldinger

Kostnadsestimering (NAV-eksempel):

  • 10 000 søknader/måned, 2000 tegn per søknad
  • (10 000 søknader × 2000 tegn) / 5120 tegn = ~4000 records
  • Kostnad: 4 × $2 = $8/måned (~80 NOK)

Optimaliseringstips

Teknikk Besparelse Trade-off
Batch processing (5000 docs/call) 40% lavere latency Kompleksitet i request-handling
Pre-filter med regex 50% færre API-kall Risk for false negatives
Selective field masking 30% færre records Må identifisere PII-felt på forhånd
Caching av resultater 60% besparelse ved re-prosessering Krever cache invalidation-strategi
Use Free tier for dev/test 100% besparelse (opptil 5K/måned) Ikke for produksjon

Beste praksis: Kombiner regex-filtrering (fødselsnummer-pattern) med Azure AI Language for edge cases (navn, adresser).

For arkitekten (Cosmo)

Spørsmål å stille kunden

  1. Datakilde og kontekst:

    • Hvilke typer dokumenter/meldinger inneholder PII? (e-post, PDF, strukturert skjema)
    • Hvor mange meldinger/dokumenter prosesseres per måned?
    • Hvilke PII-typer er kritiske? (fødselsnummer, D-nummer, helseopplysninger)
  2. Compliance og juridiske krav:

    • Er dette et offentlig eller privat system? (Forvaltningsloven gjelder ikke private)
    • Hvilke GDPR-artikler er relevante? (Pseudonymisering, data minimization)
    • Kreves det innsyn i originaldokumenter? (bevar original i sikker lagring)
  3. Teknisk arkitektur:

    • Skal PII maskeres før lagring (pre-processing) eller ved visning (on-demand)?
    • Brukes det eksisterende Azure-tjenester? (Synapse, Databricks, APIM)
    • Kreves det reversering av masking? (pseudonymisering med key management)
  4. Performance og skalerbarhet:

    • Hva er akseptabel latency? (<100ms = pre-filter med regex, <1s = batch API)
    • Støtter arkitekturen asynkron prosessering? (Native Document PII for batch)
  5. Testing og kvalitetssikring:

    • Hvordan testes false negatives? (PII som ikke detekteres)
    • Hvordan håndteres edge cases? (D-nummer, navn med spesialtegn)

Vanlige fallgruver

  1. Overforenklet regex-tilnærming:

    • Problem: Detekterer kun fødselsnummer-format, ikke kontekst (f.eks. organisasjonsnummer)
    • Løsning: Kombiner regex med Azure AI Language for kontekstuell validering
  2. Mangel på språkstøtte:

    • Problem: Bruker language: "en" (engelsk) for norsk tekst → norske navn ikke detekteres
    • Løsning: Alltid spesifiser language: "no"
  3. Ikke teste med D-nummer:

    • Problem: D-nummer har samme format som fødselsnummer, men dag +40 (f.eks. 41019912345)
    • Løsning: Test med D-nummer i alle testcases
  4. Ikke håndtere multi-tenant scenarier:

    • Problem: Maskeringsregler varierer per tenant (f.eks. kommune vs. statlig etat)
    • Løsning: Parameteriser piiCategories basert på tenant-konfigurasjon
  5. Ikke dokumentere confidence threshold-valg:

    • Problem: Uklar hvorfor 0.8 ble valgt (compliance-revidering)
    • Løsning: Dokumenter valg i ADR (Architecture Decision Record)

Cosmos anbefalinger

For offentlig sektor (NAV, Skatteetaten, kommuner):

  • ✅ Bruk Pre-Processing Pipeline (mønster 1) for å sikre PII aldri lagres
  • ✅ Kombiner Azure AI Language med Azure SQL TDE (Transparent Data Encryption)
  • ✅ Implementer audit logging for alle PII-deteksjoner (Azure Monitor)
  • ✅ Integrer med Microsoft Purview for data classification

For private bedrifter (bank, helse, forsikring):

  • ✅ Bruk Dynamic Masking (mønster 2) for kundesenterløsninger (rollbasert tilgang)
  • ✅ Implementer pseudonymisering (mønster 3) for dataanalyse/ML
  • ✅ Vurder Synthetic Replacement policy for syntetiske testdata

Red flags å unngå:

  • ❌ IKKE lagre PII i Application Insights eller andre loggingssystemer
  • ❌ IKKE bruk CharacterMask for ML-training (bruk SyntheticReplacement)
  • ❌ IKKE anta at Azure AI Language detekterer 100% av PII (test manuelt)
  • ❌ IKKE ignorer false positives (ødelegger brukeropplevelse)

Kilder og verifisering

Verified (fra Microsoft Learn MCP, re-verifisert 2026-06): (Verified MCP 2026-06)

  • Azure AI Language PII Detection Overview — Oppdatert: tre feature-typer (Text PII / Conversation PII / Document-based PII); bruker «Azure Language in Foundry Tools»-terminologi; Foundry (new) + (classic)
  • Recognized PII and PHI Entities — bekrefter dedikert kategori NOIdentityNumber («Norway Identity Number»)
  • How to: Redact Text PII — Text PII GA-API 2026-05-01, preview 2026-05-15-preview; redactionPolicies (4 typer), confidenceScoreThreshold-overrides, DisableEntityValidation, EntitySynonyms, ValueExclusionPolicy
  • Quickstart: Detect PII — Quickstart er nå for native document PII; link til text/conversation how-to-guides for tekst-PII
  • Transparency Note for PII (GDPR compliance, nå under Microsoft Foundry responsible AI)

Baseline (modellkunnskap):

  • Norsk fødselsnummer-format (11 siffer, mod11-checksumvalidering)
  • D-nummer (dag +40 i fødselsnummer)
  • Personopplysningsloven (norsk GDPR-implementering)
  • Datatilsynets veiledning om pseudonymisering

Konfidensnivå: 95% (Verified via Microsoft Learn MCP 2026-06, Baseline fra kjente standarder)