Azure SQL Database: Always Encrypted Configuratie

💼 Management Samenvatting

Always Encrypted is een client-side versleutelingstechnologie voor Azure SQL Database die gevoelige gegevens versleutelt op kolomniveau, zowel in rust als tijdens gebruik. In tegenstelling tot Transparent Data Encryption die alleen data-at-rest beschermt, blijft data met Always Encrypted versleuteld in het geheugen, waardoor databasebeheerders en onbevoegde gebruikers met database-toegang nooit onversleutelde gevoelige gegevens kunnen zien, zelfs niet wanneer zij directe toegang hebben tot de database.

Aanbeveling
IMPLEMENTEER VOOR DATABASES MET HOOGST GEVOELIGE GEGEVENS
Risico zonder
High
Risk Score
8/10
Implementatie
12u (tech: 8u)
Van toepassing op:
Azure SQL Database
SQL Managed Instance

Traditionele databaseversleuteling zoals Transparent Data Encryption beschermt alleen data-at-rest, wat betekent dat gegevens worden ontsleuteld wanneer zij in het geheugen worden geladen voor query-uitvoering. Dit creëert een kritieke beveiligingsgap waarbij databasebeheerders, cloudbeheerders met hoogste privileges, of gecompromitteerde accounts met database-toegang volledige toegang hebben tot onversleutelde gevoelige gegevens in het geheugen. Voor hoogst gevoelige gegevens zoals persoonsgegevens, financiële informatie, gezondheidsgegevens of intellectueel eigendom is deze toegang onacceptabel. Zonder Always Encrypted kunnen databasebeheerders (DBAs) alle gevoelige gegevens lezen, zelfs wanneer zij deze niet nodig hebben voor hun werkzaamheden, wat het principe van least privilege schendt. Cloudbeheerders met SQL Server-beheerrechten kunnen directe databasequeries uitvoeren en alle gegevens bekijken, inclusief gevoelige persoonsgegevens die onder de AVG vallen. Gecompromitteerde accounts met database-toegang kunnen onversleutelde gegevens exfiltreren zonder dat dit wordt gedetecteerd door traditionele monitoringtools. Backups bevatten onversleutelde gevoelige gegevens, zelfs wanneer TDE is ingeschakeld, omdat TDE alleen de bestanden versleutelt maar niet de kolomdata zelf. Query logs en audit trails bevatten onversleutelde gevoelige gegevens, wat compliance-schendingen oplevert wanneer deze logs worden gedeeld met auditors of externe partijen. Memory dumps tijdens databasecrashes kunnen gevoelige gegevens bevatten in onversleutelde vorm. Always Encrypted lost al deze problemen op door client-side versleuteling waarbij gegevens worden versleuteld voordat zij de database bereiken en versleuteld blijven in het geheugen. Databasebeheerders zien alleen versleutelde waarden en kunnen deze niet ontsleutelen zonder toegang tot de versleutelingssleutels die buiten de database worden beheerd. Cloudbeheerders hebben geen toegang tot onversleutelde gegevens, zelfs niet met hoogste privileges. Gecompromitteerde accounts kunnen alleen versleutelde data exfiltreren, wat nutteloos is zonder de versleutelingssleutels. Backups bevatten alleen versleutelde gegevens, wat extra beveiliging biedt bovenop TDE. Query logs bevatten alleen versleutelde waarden, wat compliance-vereisten ondersteunt. Memory dumps bevatten geen onversleutelde gevoelige gegevens. Deze bescherming is essentieel voor compliance met AVG Artikel 32 dat vereist dat persoonsgegevens worden beschermd tegen ongeautoriseerde toegang, zelfs door beheerders. PCI-DSS Requirement 3.4 verplicht dat kaarthouderdata onleesbaar is voor onbevoegde personen, inclusief databasebeheerders. ISO 27001 controle A.10.1.1 vereist cryptografische maatregelen die ook bescherming bieden tijdens gebruik, niet alleen bij rust. NIS2 Artikel 21 vereist passende technische maatregelen voor kritieke systemen, waarbij Always Encrypted een extra beveiligingslaag biedt bovenop standaard versleuteling.

PowerShell Modules Vereist
Primary API: Azure API
Connection: Connect-AzAccount
Required Modules: Az.Sql, Az.KeyVault

Implementatie

Deze maatregel implementeert Always Encrypted voor Azure SQL Database waarbij gevoelige kolommen worden geïdentificeerd en geconfigureerd voor client-side versleuteling. Always Encrypted werkt met twee typen versleutelingssleutels: Column Encryption Keys (CEKs) die daadwerkelijk worden gebruikt om kolomdata te versleutelen, en Column Master Keys (CMKs) die worden gebruikt om CEKs te versleutelen. CMKs worden opgeslagen in Azure Key Vault, Windows Certificate Store, of andere externe key stores, terwijl CEKs worden opgeslagen in de database in versleutelde vorm. De implementatie begint met het identificeren van gevoelige kolommen die versleuteling vereisen, zoals persoonsgegevens (BSN, paspoortnummers), financiële gegevens (creditcardnummers, bankrekeningnummers), gezondheidsgegevens (medische dossiers, diagnoses), of intellectueel eigendom. Vervolgens moeten versleutelingssleutels worden geconfigureerd in Azure Key Vault met de juiste toegangsrechten voor applicaties. De databasekolommen worden gemarkeerd als encrypted met behulp van SQL Server Management Studio of PowerShell-scripts. Applicaties moeten worden aangepast om Always Encrypted te gebruiken via de juiste connection strings en client drivers die versleuteling en ontsleuteling afhandelen. De versleuteling ondersteunt twee modi: Deterministic Encryption waarbij dezelfde plaintext altijd dezelfde ciphertext produceert, wat equality searches mogelijk maakt maar minder beveiliging biedt, en Randomized Encryption waarbij elke versleuteling een unieke ciphertext produceert, wat maximale beveiliging biedt maar geen equality searches toestaat. De keuze tussen deze modi hangt af van de queryvereisten versus beveiligingsbehoeften. Always Encrypted vereist applicatiewijzigingen omdat versleuteling en ontsleuteling plaatsvinden in de client, niet in de database. De implementatie kost typisch 8-16 uur technisch werk inclusief applicatie-aanpassingen en is sterk aanbevolen voor databases met hoogst gevoelige gegevens waar zelfs databasebeheerders geen toegang mogen hebben tot onversleutelde data.

Vereisten

De implementatie van Always Encrypted vereist een zorgvuldige voorbereiding en specifieke componenten voordat organisaties kunnen beginnen met de configuratie. De primaire vereiste is een Azure Key Vault die is geconfigureerd met de juiste beveiligingsinstellingen voor het opslaan van Column Master Keys. Deze Key Vault moet Soft Delete en Purge Protection hebben ingeschakeld om te voorkomen dat versleutelingssleutels permanent worden verwijderd, wat zou resulteren in onherstelbaar dataverlies. De Key Vault moet zich in dezelfde Azure-regio bevinden als de SQL Database om latency te minimaliseren en om te voldoen aan data residency-vereisten. Organisaties moeten ervoor zorgen dat de Key Vault is geconfigureerd met de juiste netwerkbeveiliging, bij voorkeur via Private Endpoints of firewallregels die alleen toegang toestaan vanaf geautoriseerde applicaties.

Een kritieke vereiste is dat applicaties moeten worden aangepast om Always Encrypted te ondersteunen. Dit betekent dat applicaties moeten gebruikmaken van client drivers die Always Encrypted ondersteunen, zoals de .NET Framework Data Provider voor SQL Server (versie 4.6 of hoger), ODBC Driver 17.1 of hoger, JDBC Driver 6.0 of hoger, of PHP Driver 5.3.1 of hoger. De connection strings moeten de parameter Column Encryption Setting=Enabled bevatten om Always Encrypted-functionaliteit te activeren. Applicaties moeten ook beschikken over de juiste Azure AD-authenticatie of Key Vault-toegangsrechten om versleutelingssleutels te kunnen ophalen en gebruiken. Voor .NET-applicaties betekent dit dat de Azure.Identity-bibliotheek moet worden geïnstalleerd en geconfigureerd voor Key Vault-toegang. Voor Java-applicaties moet de Azure Key Vault Java-bibliotheek worden geïntegreerd. Deze applicatiewijzigingen zijn essentieel omdat versleuteling en ontsleuteling plaatsvinden in de client, niet in de database-engine.

Databasebeheerders en ontwikkelaars moeten beschikken over de juiste tools en kennis om Always Encrypted te configureren en te beheren. SQL Server Management Studio (SSMS) versie 17.0 of hoger is vereist voor het configureren van Always Encrypted via de wizard, terwijl PowerShell-scripts kunnen worden gebruikt voor geautomatiseerde implementatie. Organisaties moeten een duidelijk proces hebben voor het identificeren van gevoelige kolommen die versleuteling vereisen, waarbij data classification wordt gebruikt om te bepalen welke gegevens als gevoelig worden beschouwd. Dit proces moet worden gedocumenteerd en goedgekeurd door zowel security teams als business stakeholders om ervoor te zorgen dat alle relevante gegevens worden beschermd zonder onnodige versleuteling die queryprestaties kan beïnvloeden.

Een belangrijk aspect om te overwegen is de impact op queryfunctionaliteit. Always Encrypted beperkt bepaalde queryoperaties omdat versleutelde gegevens niet kunnen worden gebruikt in WHERE-clauses, JOIN-operaties, of aggregatiefuncties zonder speciale configuratie. Deterministic Encryption maakt equality searches mogelijk, maar Randomized Encryption biedt betere beveiliging maar ondersteunt geen equality searches. Organisaties moeten een grondige analyse uitvoeren van hun queryvereisten om te bepalen welke kolommen Deterministic versus Randomized Encryption moeten gebruiken. Voor kolommen die worden gebruikt in WHERE-clauses of JOIN-operaties is Deterministic Encryption vaak noodzakelijk, maar dit moet worden afgewogen tegen de beveiligingsimplicaties. Organisaties moeten ook rekening houden met de prestatie-impact van Always Encrypted, omdat versleuteling en ontsleuteling plaatsvinden in de client, wat extra CPU-gebruik en latency kan introduceren.

Ten slotte moeten organisaties een formeel proces hebben voor sleutelbeheer, inclusief sleutelrotatie, backup-procedures en break-glass scenario's. Column Master Keys moeten regelmatig worden geroteerd volgens een gedefinieerd schema, typisch elke 90-180 dagen afhankelijk van de gevoeligheid van de gegevens. Organisaties moeten procedures hebben voor het back-uppen van versleutelingssleutels en voor het herstellen van toegang in noodsituaties. Deze procedures moeten worden gedocumenteerd, getest en regelmatig worden bijgewerkt om ervoor te zorgen dat organisaties in staat zijn om snel te reageren op beveiligingsincidenten of operationele problemen zonder dat dit resulteert in langdurige datatoegangsproblemen.

Implementatie

**FASE 1: Azure Key Vault Configureren voor Column Master Keys (Duur: 30 minuten)**

De eerste fase van de implementatie omvat het opzetten van een Azure Key Vault die zal worden gebruikt voor het opslaan van Column Master Keys (CMKs). Organisaties moeten via de Azure Portal navigeren naar Key Vaults en een nieuwe Key Vault aanmaken met een duidelijke naamgeving zoals 'kv-sql-always-encrypted-prod' om aan te geven dat deze Key Vault is bestemd voor Always Encrypted sleutels. De Key Vault moet worden geconfigureerd in dezelfde Azure-regio als de SQL Database om latency te minimaliseren en om te voldoen aan data residency-vereisten. Voor de pricing tier hebben organisaties de keuze tussen Standard en Premium, waarbij Premium HSM-backed keys biedt voor extra beveiliging in hoogst gereguleerde omgevingen.

Drie verplichte beveiligingsinstellingen moeten worden geactiveerd: Soft Delete met een retention periode van minimaal 90 dagen, Purge Protection om permanente verwijdering te voorkomen, en netwerkbeveiliging via Private Endpoints of firewallregels. Soft Delete zorgt ervoor dat verwijderde sleutels gedurende de retention periode behouden blijven, wat kritiek is voor business continuity. Purge Protection vormt een aanvullende beveiligingslaag die zelfs beheerders met hoogste privileges verhindert om sleutels definitief te verwijderen. Voor netwerkbeveiliging moeten organisaties publieke toegang uitschakelen en kiezen voor Private Endpoints of een firewall met IP-whitelisting die alleen toegang toestaat vanaf geautoriseerde applicaties en beheertools.

Diagnostische logging moet worden geconfigureerd om een compleet auditlogboek te bieden van alle sleuteloperaties. Organisaties moeten via de diagnostische instellingen van de Key Vault een nieuwe diagnostische instelling toevoegen die alle loggegevens streamt naar een Log Analytics-werkruimte. Deze logs registreren alle belangrijke operaties inclusief Get-operaties voor het ophalen van sleutels, Wrap Key-operaties voor het versleutelen van Column Encryption Keys, en Unwrap Key-operaties voor het ontsleutelen van Column Encryption Keys. Dit auditlogboek is essentieel voor compliance-doeleinden en voor forensisch onderzoek in het geval van beveiligingsincidenten. Voor toegangsbeheer moeten organisaties Azure RBAC gebruiken in plaats van verouderde toegangsbeleidsregels. De Key Vault moet worden geconfigureerd via toegangsconfiguratie om Azure op rollen gebaseerd toegangsbeheer te gebruiken, waarbij applicaties de rol Key Vault Secrets User krijgen voor het lezen van Column Master Keys.

**FASE 2: Column Master Key en Column Encryption Keys Aanmaken (Duur: 20 minuten)**

De tweede fase omvat het aanmaken van de versleutelingssleutels die zullen worden gebruikt voor Always Encrypted. Organisaties moeten eerst een Column Master Key (CMK) aanmaken in Azure Key Vault. Deze CMK kan een RSA-sleutel zijn met een minimum van 2048-bit, maar bij voorkeur 3072 of 4096-bit voor verhoogde beveiliging. De CMK wordt gebruikt om Column Encryption Keys (CEKs) te versleutelen, die op hun beurt worden gebruikt om daadwerkelijke kolomdata te versleutelen. Deze gelaagde aanpak zorgt ervoor dat CEKs kunnen worden geroteerd zonder de CMK te wijzigen, wat flexibiliteit biedt voor sleutelbeheer.

Na het aanmaken van de CMK moeten organisaties Column Encryption Keys (CEKs) genereren voor elke set kolommen die dezelfde versleutelingssleutel zullen delen. CEKs worden gegenereerd als 256-bit AES-sleutels en worden opgeslagen in de database in versleutelde vorm, versleuteld met de CMK. Organisaties kunnen meerdere CEKs gebruiken voor verschillende sets kolommen, wat flexibiliteit biedt voor verschillende beveiligingsniveaus of sleutelrotatie-strategieën. Het is belangrijk om te begrijpen dat CEKs worden opgeslagen in de database, maar alleen in versleutelde vorm, wat betekent dat zelfs databasebeheerders deze niet kunnen lezen zonder toegang tot de CMK in Azure Key Vault.

**FASE 3: Databasekolommen Configureren voor Always Encrypted (Duur: 1-2 uur afhankelijk van aantal kolommen)**

De derde fase omvat het daadwerkelijk configureren van databasekolommen voor Always Encrypted. Dit proces begint met het identificeren van gevoelige kolommen die versleuteling vereisen. Organisaties moeten een grondige analyse uitvoeren van hun database-schema om te bepalen welke kolommen gevoelige gegevens bevatten, zoals persoonsgegevens (BSN, paspoortnummers, rijbewijsnummers), financiële gegevens (creditcardnummers, bankrekeningnummers, salarisinformatie), gezondheidsgegevens (medische dossiers, diagnoses, medicatie), of intellectueel eigendom (patenten, handelsgeheimen, onderzoeksdata). Deze analyse moet worden gedocumenteerd en goedgekeurd door zowel security teams als business stakeholders.

Voor elke kolom die versleuteling vereist, moeten organisaties bepalen of Deterministic of Randomized Encryption moet worden gebruikt. Deterministic Encryption produceert dezelfde ciphertext voor dezelfde plaintext, wat equality searches mogelijk maakt maar minder beveiliging biedt omdat aanvallers patronen kunnen identificeren. Randomized Encryption produceert een unieke ciphertext voor elke versleuteling, wat maximale beveiliging biedt maar geen equality searches toestaat. Voor kolommen die worden gebruikt in WHERE-clauses, JOIN-operaties, of GROUP BY-statements is Deterministic Encryption vaak noodzakelijk, maar dit moet worden afgewogen tegen de beveiligingsimplicaties. Voor kolommen die alleen worden gebruikt voor opslag en niet voor query's, is Randomized Encryption de aanbevolen keuze voor maximale beveiliging.

De configuratie kan worden uitgevoerd via SQL Server Management Studio (SSMS) met behulp van de Always Encrypted Wizard, of via PowerShell-scripts voor geautomatiseerde implementatie. De wizard begeleidt beheerders door het proces van het selecteren van kolommen, het kiezen van versleutelingstypen, en het configureren van versleutelingssleutels. Tijdens het configuratieproces worden bestaande gegevens in de kolommen versleuteld, wat tijd kan kosten afhankelijk van de hoeveelheid data. Voor grote tabellen met miljoenen rijen kan dit proces uren duren, dus organisaties moeten dit plannen tijdens onderhoudsvensters. Na de configuratie worden nieuwe gegevens automatisch versleuteld wanneer zij worden ingevoegd of bijgewerkt, en worden automatisch ontsleuteld wanneer zij worden opgehaald door geautoriseerde applicaties.

**FASE 4: Applicaties Aanpassen voor Always Encrypted (Duur: 4-8 uur afhankelijk van applicatiecomplexiteit)**

De vierde fase is de meest complexe en omvat het aanpassen van applicaties om Always Encrypted te ondersteunen. Dit is essentieel omdat versleuteling en ontsleuteling plaatsvinden in de client, niet in de database-engine. Applicaties moeten gebruikmaken van client drivers die Always Encrypted ondersteunen, zoals de .NET Framework Data Provider voor SQL Server versie 4.6 of hoger, ODBC Driver 17.1 of hoger, JDBC Driver 6.0 of hoger, of PHP Driver 5.3.1 of hoger. De connection strings moeten de parameter Column Encryption Setting=Enabled bevatten om Always Encrypted-functionaliteit te activeren.

Voor .NET-applicaties betekent dit dat de Azure.Identity-bibliotheek moet worden geïnstalleerd en geconfigureerd voor Key Vault-toegang. Applicaties moeten worden geconfigureerd met de juiste Azure AD-authenticatie of Key Vault-toegangsrechten om versleutelingssleutels te kunnen ophalen. De DefaultAzureCredential-klasse kan worden gebruikt voor automatische authenticatie via verschillende methoden, inclusief Managed Identity voor applicaties die draaien in Azure, of Service Principal credentials voor on-premises applicaties. Voor Java-applicaties moet de Azure Key Vault Java-bibliotheek worden geïntegreerd, en voor Python-applicaties moet de azure-keyvault-bibliotheek worden gebruikt.

Applicatiecode moet worden aangepast om rekening te houden met de beperkingen van Always Encrypted. Query's die gebruikmaken van versleutelde kolommen in WHERE-clauses vereisen Deterministic Encryption, en zelfs dan zijn alleen equality comparisons mogelijk. LIKE-operaties, range queries, en aggregatiefuncties werken niet met versleutelde kolommen. Organisaties moeten hun applicatiecode analyseren om te identificeren welke query's moeten worden aangepast, en moeten alternatieve benaderingen overwegen zoals het ophalen van alle rijen en filteren in de applicatie, of het gebruik van niet-versleutelde indexkolommen voor query's. Deze aanpassingen kunnen significante wijzigingen vereisen in applicatie-architectuur en query-logica.

Uitgebreide testing is essentieel om ervoor te zorgen dat applicaties correct werken met Always Encrypted. Organisaties moeten testen uitvoeren voor alle gebruiksscenario's, inclusief data insert, update, delete, en query-operaties. Prestatie-testing is belangrijk omdat versleuteling en ontsleuteling extra CPU-gebruik en latency kunnen introduceren. Organisaties moeten meten wat de impact is op queryprestaties en moeten overwegen om query's te optimaliseren of caching te implementeren om prestatieverlies te minimaliseren.

⏱️ **Totale Implementatietijd**: 6-12 uur (Key Vault setup 30 min, sleutels aanmaken 20 min, kolomconfiguratie 1-2 uur, applicatie-aanpassingen 4-8 uur).

💰 **Kosten**: Key Vault-operaties circa €0,025 per 10.000 operaties, plus applicatie-ontwikkelingskosten voor Always Encrypted-integratie. Geen extra databasekosten.

Monitoring

Gebruik PowerShell-script always-encrypted-configuration.ps1 (functie Invoke-Monitoring) – Controleert Always Encrypted configuratie voor alle SQL databases.

Continue monitoring van Always Encrypted-configuratie is essentieel om ervoor te zorgen dat versleuteling correct blijft functioneren en dat er geen configuratiewijzigingen plaatsvinden die de beveiliging kunnen compromitteren. De primaire monitoring vindt plaats via Azure Key Vault diagnostische logs die alle sleuteloperaties registreren, inclusief Get-operaties voor het ophalen van Column Master Keys, Wrap Key-operaties voor het versleutelen van Column Encryption Keys, en Unwrap Key-operaties voor het ontsleutelen van Column Encryption Keys. Deze logs moeten regelmatig worden gecontroleerd op verdachte activiteiten zoals ongebruikelijke toegangspatronen of pogingen tot ongeautoriseerde sleuteloperaties.

Databasebeheerders moeten regelmatig controleren of Always Encrypted correct is geconfigureerd voor alle gevoelige kolommen. Dit kan worden gedaan via SQL Server Management Studio of via PowerShell-scripts die de Always Encrypted-configuratie valideren. Organisaties moeten een proces hebben voor het identificeren van nieuwe kolommen die versleuteling vereisen, bijvoorbeeld wanneer nieuwe tabellen worden toegevoegd of wanneer bestaande tabellen worden uitgebreid met nieuwe kolommen die gevoelige gegevens bevatten. Dit proces moet worden geïntegreerd in de change management-procedures om ervoor te zorgen dat nieuwe databasewijzigingen automatisch worden beoordeeld op Always Encrypted-vereisten.

Applicatie-monitoring is belangrijk om ervoor te zorgen dat applicaties correct werken met Always Encrypted. Organisaties moeten applicatielogs monitoren op fouten gerelateerd aan Always Encrypted, zoals authenticatiefouten bij Key Vault-toegang, of fouten bij het ophalen of gebruiken van versleutelingssleutels. Deze fouten kunnen wijzen op configuratieproblemen, verlopen credentials, of problemen met Key Vault-toegang. Prestatie-monitoring is ook belangrijk omdat Always Encrypted extra latency kan introduceren bij het ophalen en gebruiken van versleutelingssleutels. Organisaties moeten baseline-metingen uitvoeren en moeten alert zijn op prestatieverslechtering die kan wijzen op problemen met Key Vault-toegang of netwerkconnectiviteit.

Sleutelrotatie moet worden gemonitord om ervoor te zorgen dat Column Master Keys en Column Encryption Keys regelmatig worden geroteerd volgens het gedefinieerde schema. Organisaties moeten een proces hebben voor het plannen en uitvoeren van sleutelrotatie, inclusief het testen van de rotatieprocedure in een testomgeving voordat deze wordt uitgevoerd in productie. Na sleutelrotatie moeten organisaties verifiëren dat applicaties correct blijven werken en dat er geen datatoegangsproblemen optreden. Break-glass procedures moeten regelmatig worden getest om ervoor te zorgen dat organisaties in staat zijn om snel te reageren op noodsituaties zonder dat dit resulteert in langdurige datatoegangsproblemen.

Compliance en Auditing

Always Encrypted speelt een cruciale rol bij het voldoen aan verschillende compliance- en beveiligingsstandaarden die van toepassing zijn op Nederlandse overheidsorganisaties en bedrijven die werken met hoogst gevoelige gegevens. Deze compliancevereisten mandateren specifieke beveiligingscontroles die bescherming bieden tegen ongeautoriseerde toegang, zelfs door beheerders met hoogste privileges. Always Encrypted biedt deze bescherming door ervoor te zorgen dat gevoelige gegevens versleuteld blijven, zelfs wanneer zij in het geheugen worden geladen voor query-uitvoering.

De Algemene Verordening Gegevensbescherming (AVG), ook bekend als GDPR, bevat in Artikel 32 specifieke vereisten voor de beveiliging van persoonsgegevens. Dit artikel vereist dat organisaties passende technische en organisatorische maatregelen nemen om persoonsgegevens te beveiligen tegen ongeautoriseerde toegang, inclusief toegang door beheerders. Always Encrypted ondersteunt deze vereisten door ervoor te zorgen dat databasebeheerders en cloudbeheerders geen toegang hebben tot onversleutelde persoonsgegevens, zelfs wanneer zij directe database-toegang hebben. Tijdens AVG-audits kunnen organisaties aantonen dat zij Always Encrypted hebben geïmplementeerd om persoonsgegevens te beschermen tegen ongeautoriseerde toegang door beheerders, wat voldoet aan de vereisten van Artikel 32. Het ontbreken van adequate beveiligingsmaatregelen kan leiden tot boetes tot €20 miljoen of 4% van de wereldwijde jaaromzet.

PCI-DSS v4.0 Requirement 3.4 verplicht dat kaarthouderdata onleesbaar is voor onbevoegde personen, inclusief databasebeheerders en cloudbeheerders. Always Encrypted voldoet aan deze vereiste door ervoor te zorgen dat creditcardnummers en andere kaarthouderdata versleuteld blijven, zelfs wanneer zij in het geheugen worden geladen. Tijdens PCI-DSS-audits kunnen organisaties aantonen dat zij Always Encrypted hebben geïmplementeerd voor alle kolommen die kaarthouderdata bevatten, wat voldoet aan Requirement 3.4. Het niet voldoen aan deze vereiste resulteert in een directe PCI-DSS-compliance failure, wat betekent dat organisaties hun rechten verliezen om creditcardbetalingen te verwerken.

ISO 27001:2022 controle A.10.1.1 vereist cryptografische maatregelen voor gegevensbescherming die ook bescherming bieden tijdens gebruik, niet alleen bij rust. Always Encrypted voldoet aan deze vereiste door ervoor te zorgen dat gevoelige gegevens versleuteld blijven in het geheugen, wat bescherming biedt tegen ongeautoriseerde toegang tijdens query-uitvoering. Tijdens ISO 27001-certificering audits kunnen organisaties aantonen dat zij Always Encrypted hebben geïmplementeerd voor gevoelige gegevens, wat voldoet aan de vereisten van controle A.10.1.1. Het ontbreken van adequate cryptografische maatregelen is een van de meest voorkomende redenen voor ISO 27001-certificering failures.

De NIS2-richtlijn, die van toepassing is op kritieke entiteiten in Nederland, bevat in Artikel 21 specifieke vereisten voor passende technische maatregelen voor kritieke systemen. Always Encrypted biedt een extra beveiligingslaag bovenop standaard versleuteling, wat voldoet aan deze vereisten. Organisaties die onder NIS2 vallen moeten kunnen aantonen dat zij adequate beveiligingsmaatregelen hebben geïmplementeerd, en Always Encrypted kan worden gebruikt als bewijs van deze inspanningen. Het ontbreken van adequate beveiligingsmaatregelen kan leiden tot boetes en andere sancties van de toezichthouder.

De BIO Baseline Informatiebeveiliging Overheid bevat specifieke vereisten voor de beveiliging van gevoelige overheidsgegevens. Always Encrypted ondersteunt deze vereisten door ervoor te zorgen dat gevoelige gegevens worden beschermd tegen ongeautoriseerde toegang, zelfs door beheerders met hoogste privileges. Tijdens BIO-audits kunnen organisaties aantonen dat zij Always Encrypted hebben geïmplementeerd voor gevoelige gegevens, wat voldoet aan de vereisten van de BIO. Het niet voldoen aan BIO-vereisten kan leiden tot negatieve audit-rapportages en kan gevolgen hebben voor de financiering en het vertrouwen van burgers in de overheidsorganisatie.

Voor alle deze compliance-standaarden is het essentieel dat organisaties niet alleen Always Encrypted implementeren, maar ook kunnen aantonen dat het correct is geconfigureerd en dat versleutelingssleutels worden beheerd volgens best practices. Dit betekent dat organisaties documentatie moeten bijhouden van hun Always Encrypted-configuratie, procedures moeten hebben voor sleutelrotatie en sleutelbeheer, en auditlogs moeten behouden van alle sleuteloperaties. Tijdens compliance-audits moeten organisaties kunnen demonstreren dat Always Encrypted actief is, dat versleutelingssleutels correct worden beheerd, en dat er procedures zijn voor het reageren op beveiligingsincidenten. Deze documentatie en procedures vormen het bewijs dat organisaties voldoen aan de relevante compliancevereisten en dat zij proactief werken aan het beschermen van hun gevoelige gegevens tegen ongeautoriseerde toegang.

Remediatie

Gebruik PowerShell-script always-encrypted-configuration.ps1 (functie Invoke-Remediation) – Configureert Always Encrypted voor gevoelige databasekolommen.

Wanneer Always Encrypted niet is geconfigureerd voor gevoelige databasekolommen, moet dit onmiddellijk worden hersteld omdat dit een kritieke beveiligings- en compliance-gap vertegenwoordigt. De remediatieprocedure begint met het identificeren van alle gevoelige kolommen die versleuteling vereisen. Dit kan worden gedaan via een grondige analyse van het database-schema, waarbij organisaties zoeken naar kolommen die persoonsgegevens, financiële gegevens, gezondheidsgegevens of andere gevoelige informatie bevatten. Data classification kan worden gebruikt om te bepalen welke gegevens als gevoelig worden beschouwd en versleuteling vereisen.

Voor elke kolom die versleuteling vereist, moeten organisaties bepalen of Deterministic of Randomized Encryption moet worden gebruikt, gebaseerd op de queryvereisten versus beveiligingsbehoeften. Vervolgens moeten versleutelingssleutels worden geconfigureerd in Azure Key Vault met de juiste toegangsrechten voor applicaties. De databasekolommen moeten worden gemarkeerd als encrypted met behulp van SQL Server Management Studio of PowerShell-scripts. Het is belangrijk om te begrijpen dat het versleutelen van bestaande kolommen tijd kan kosten, afhankelijk van de hoeveelheid data, en dat dit proces moet worden gepland tijdens onderhoudsvensters voor grote tabellen.

Na het configureren van Always Encrypted voor databasekolommen, moeten applicaties worden aangepast om Always Encrypted te ondersteunen. Dit betekent dat applicaties moeten gebruikmaken van client drivers die Always Encrypted ondersteunen, en dat connection strings moeten worden bijgewerkt met de parameter Column Encryption Setting=Enabled. Applicaties moeten ook worden geconfigureerd met de juiste Azure AD-authenticatie of Key Vault-toegangsrechten om versleutelingssleutels te kunnen ophalen en gebruiken. Uitgebreide testing is essentieel om ervoor te zorgen dat applicaties correct werken met Always Encrypted en dat er geen prestatieproblemen optreden.

Voor bestaande Always Encrypted-implementaties die configuratiefouten hebben, moeten organisaties de specifieke problemen identificeren en corrigeren. Als applicaties niet kunnen verbinden met versleutelde kolommen, moeten organisaties verifiëren dat de juiste client drivers zijn geïnstalleerd en dat connection strings correct zijn geconfigureerd. Als er authenticatiefouten optreden bij Key Vault-toegang, moeten organisaties verifiëren dat applicaties de juiste Azure AD-authenticatie of Key Vault-toegangsrechten hebben. Als er prestatieproblemen optreden, moeten organisaties overwegen om query's te optimaliseren of caching te implementeren om prestatieverlies te minimaliseren.

Na het voltooien van de remediatie, moeten organisaties het Always Encrypted-systeem testen om te verifiëren dat alles correct werkt. Voer testquery's uit op versleutelde kolommen en verifieer dat gegevens correct worden versleuteld en ontsleuteld. Test ook break-glass procedures om ervoor te zorgen dat organisaties in staat zijn om snel te reageren op noodsituaties zonder dat dit resulteert in langdurige datatoegangsproblemen. Documenteer alle configuratiewijzigingen en testresultaten voor auditdoeleinden. Zorg ervoor dat beveiligingsteams zijn getraind in het beheren van Always Encrypted en dat er procedures zijn voor het reageren op beveiligingsincidenten. Plan regelmatige reviews van Always Encrypted-configuraties om ervoor te zorgen dat nieuwe gevoelige kolommen worden geïdentificeerd en versleuteld, en dat versleutelingssleutels regelmatig worden geroteerd volgens het gedefinieerde schema.

Compliance & Frameworks

Automation

Gebruik het onderstaande PowerShell script om deze security control te monitoren en te implementeren. Het script bevat functies voor zowel monitoring (-Monitoring) als remediation (-Remediation).

PowerShell
<# ================================================================================ AZURE POWERSHELL SCRIPT - Nederlandse Baseline voor Veilige Cloud ================================================================================ .SYNOPSIS Azure SQL: Always Encrypted Configuration .DESCRIPTION Controleert of Always Encrypted is geconfigureerd voor gevoelige kolommen in Azure SQL databases. Always Encrypted biedt client-side versleuteling op kolomniveau die data beschermt, zelfs wanneer deze in het geheugen wordt geladen. Waarom is deze control belangrijk? - Bescherming tegen databasebeheerder-toegang tot gevoelige data - Compliance met AVG, PCI-DSS, ISO 27001 vereisten - Data versleuteld in rust EN tijdens gebruik - Column-level encryption voor gevoelige gegevens .NOTES Filename: always-encrypted-configuration.ps1 Author: Nederlandse Baseline voor Veilige Cloud Version: 1.0 Related JSON: content/azure/databases/always-encrypted-configuration.json CIS Control: SQL Security - Column-level encryption #> #Requires -Version 5.1 #Requires -Modules Az.Accounts, Az.Sql, Az.KeyVault [CmdletBinding()] param( [Parameter()][switch]$WhatIf, [Parameter()][switch]$Monitoring, [Parameter()][switch]$Remediation, [Parameter()][switch]$Revert ) $ErrorActionPreference = 'Stop' $VerbosePreference = 'Continue' $PolicyName = "Azure SQL: Always Encrypted Configuration" function Connect-RequiredServices { try { if (-not (Get-AzContext)) { Connect-AzAccount | Out-Null } } catch { Write-Error "Failed to connect to Azure: $_" throw } } function Test-Compliance { Write-Verbose "Testing compliance for: $PolicyName..." $result = [PSCustomObject]@{ ScriptName = "always-encrypted-configuration" PolicyName = $PolicyName IsCompliant = $false TotalDatabases = 0 DatabasesWithAlwaysEncrypted = 0 DatabasesWithoutAlwaysEncrypted = 0 Details = @() Recommendations = @() } try { $sqlServers = Get-AzSqlServer -ErrorAction SilentlyContinue if (-not $sqlServers) { $result.Details += "Geen SQL servers gevonden" $result.IsCompliant = $true return $result } foreach ($server in $sqlServers) { $databases = Get-AzSqlDatabase -ResourceGroupName $server.ResourceGroupName ` -ServerName $server.ServerName -ErrorAction SilentlyContinue foreach ($database in $databases) { $result.TotalDatabases++ # Check if Always Encrypted is configured # Note: This requires querying the database metadata # For production, this would require database connection and query execution # This is a simplified check that verifies Key Vault configuration try { # Check if database has Always Encrypted metadata # In a real implementation, this would query sys.column_encryption_keys # and sys.column_master_keys system views # For now, we check if Key Vault has keys that could be used for Always Encrypted $keyVaults = Get-AzKeyVault -ErrorAction SilentlyContinue $hasAlwaysEncryptedKeys = $false foreach ($kv in $keyVaults) { $keys = Get-AzKeyVaultKey -VaultName $kv.VaultName -ErrorAction SilentlyContinue if ($keys) { # Check if keys have naming convention or tags indicating Always Encrypted usage foreach ($key in $keys) { if ($key.Tags -and $key.Tags.ContainsKey('Purpose') -and $key.Tags['Purpose'] -eq 'AlwaysEncrypted') { $hasAlwaysEncryptedKeys = $true break } } } } if ($hasAlwaysEncryptedKeys) { $result.DatabasesWithAlwaysEncrypted++ $result.Details += "✓ Database '$($database.DatabaseName)' op server '$($server.ServerName)' heeft mogelijk Always Encrypted geconfigureerd" } else { $result.DatabasesWithoutAlwaysEncrypted++ $result.Details += "✗ Database '$($database.DatabaseName)' op server '$($server.ServerName)' heeft geen Always Encrypted configuratie gedetecteerd" $result.Recommendations += "Configureer Always Encrypted voor gevoelige kolommen in '$($database.DatabaseName)'" } } catch { $result.Details += "⚠ Database '$($database.DatabaseName)': Kon configuratie niet verifiëren - $($_.Exception.Message)" } } } $result.IsCompliant = ($result.DatabasesWithoutAlwaysEncrypted -eq 0 -and $result.TotalDatabases -gt 0) } catch { $result.Details += "ERROR: $($_.Exception.Message)" } return $result } function Invoke-Remediation { Write-Host "`nStarting remediation for: $PolicyName..." -ForegroundColor Cyan Write-Host "`n⚠️ OPMERKING: Always Encrypted configuratie vereist handmatige stappen:" -ForegroundColor Yellow Write-Host " 1. Azure Key Vault configureren voor Column Master Keys" -ForegroundColor Yellow Write-Host " 2. Column Master Keys en Column Encryption Keys aanmaken" -ForegroundColor Yellow Write-Host " 3. Databasekolommen configureren via SSMS Always Encrypted Wizard" -ForegroundColor Yellow Write-Host " 4. Applicaties aanpassen voor Always Encrypted-ondersteuning" -ForegroundColor Yellow Write-Host "`nZie content/azure/databases/always-encrypted-configuration.json voor gedetailleerde instructies.`n" -ForegroundColor Yellow try { # Check if Key Vault exists for Always Encrypted $keyVaults = Get-AzKeyVault -ErrorAction SilentlyContinue $alwaysEncryptedKeyVault = $keyVaults | Where-Object { $_.VaultName -like '*always-encrypted*' -or $_.Tags -and $_.Tags.ContainsKey('Purpose') -and $_.Tags['Purpose'] -eq 'AlwaysEncrypted' } if (-not $alwaysEncryptedKeyVault) { Write-Host "`n[INFO] Geen dedicated Key Vault gevonden voor Always Encrypted" -ForegroundColor Yellow Write-Host " Maak een Key Vault aan met Soft Delete en Purge Protection" -ForegroundColor Yellow Write-Host " Zie implementatie-instructies in het JSON-artikel.`n" -ForegroundColor Yellow } else { Write-Host "`n[OK] Key Vault gevonden: $($alwaysEncryptedKeyVault.VaultName)" -ForegroundColor Green } Write-Host "`n[INFO] Always Encrypted configuratie vereist:" -ForegroundColor Cyan Write-Host " - SQL Server Management Studio (SSMS) versie 17.0+" -ForegroundColor White Write-Host " - Database-verbinding met beheerdersrechten" -ForegroundColor White Write-Host " - Applicatie-aanpassingen voor Always Encrypted-ondersteuning" -ForegroundColor White Write-Host "`nGebruik de Always Encrypted Wizard in SSMS voor kolomconfiguratie.`n" -ForegroundColor Yellow } catch { Write-Error "Remediation check failed: $_" } } function Invoke-Monitoring { $result = Test-Compliance Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "$PolicyName" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan Write-Host "Totaal databases: $($result.TotalDatabases)" -ForegroundColor White Write-Host "Met Always Encrypted: $($result.DatabasesWithAlwaysEncrypted)" -ForegroundColor Green Write-Host "Zonder Always Encrypted: $($result.DatabasesWithoutAlwaysEncrypted)" -ForegroundColor $(if ($result.DatabasesWithoutAlwaysEncrypted -gt 0) { 'Red' } else { 'Green' }) if ($result.Details) { Write-Host "`nDetails:" -ForegroundColor Yellow $result.Details | ForEach-Object { Write-Host " $_" -ForegroundColor Gray } } if ($result.Recommendations) { Write-Host "`nAanbevelingen:" -ForegroundColor Yellow $result.Recommendations | ForEach-Object { Write-Host " - $_" -ForegroundColor Gray } } return $result } function Invoke-Revert { Write-Host "`n⚠️ Always Encrypted uitschakelen wordt niet aanbevolen" -ForegroundColor Yellow Write-Host " Dit zou gevoelige gegevens blootstellen aan ongeautoriseerde toegang.`n" -ForegroundColor Yellow } try { Connect-RequiredServices if ($Monitoring) { Invoke-Monitoring } elseif ($Remediation) { if ($WhatIf) { Write-Host "`n=== WHATIF MODE ===" -ForegroundColor Yellow $result = Test-Compliance Write-Host "Zou Always Encrypted configuratie controleren voor $($result.TotalDatabases) database(s)" -ForegroundColor Yellow Write-Host "Zie JSON-artikel voor implementatie-instructies.`n" -ForegroundColor Yellow } else { Invoke-Remediation } } elseif ($Revert) { Invoke-Revert } else { $result = Test-Compliance Write-Host "`nCompliance Check: $PolicyName" -ForegroundColor Cyan if ($result.IsCompliant) { Write-Host "Status: [OK] COMPLIANT" -ForegroundColor Green } else { Write-Host "Status: [FAIL] NON-COMPLIANT ($($result.DatabasesWithoutAlwaysEncrypted) databases zonder Always Encrypted)" -ForegroundColor Red } } } catch { Write-Error $_ exit 1 }

Risico zonder implementatie

Risico zonder implementatie
High: Zonder Always Encrypted voor Azure SQL Database hebben databasebeheerders en cloudbeheerders met hoogste privileges volledige toegang tot onversleutelde gevoelige gegevens, zelfs wanneer deze in het geheugen worden geladen voor query-uitvoering. Dit creëert een kritieke beveiligingsgap waarbij gevoelige persoonsgegevens, financiële informatie, gezondheidsgegevens of intellectueel eigendom kunnen worden gelezen door personen die deze toegang niet nodig hebben voor hun werkzaamheden, wat het principe van least privilege schendt. Gecompromitteerde accounts met database-toegang kunnen onversleutelde gevoelige gegevens exfiltreren zonder dat dit wordt gedetecteerd door traditionele monitoringtools. Backups bevatten onversleutelde gevoelige gegevens, zelfs wanneer TDE is ingeschakeld, omdat TDE alleen de bestanden versleutelt maar niet de kolomdata zelf. Query logs en audit trails bevatten onversleutelde gevoelige gegevens, wat compliance-schendingen oplevert wanneer deze logs worden gedeeld met auditors of externe partijen. Memory dumps tijdens databasecrashes kunnen gevoelige gegevens bevatten in onversleutelde vorm. Compliance-audits kunnen falen omdat auditors vereisen dat gevoelige gegevens worden beschermd tegen ongeautoriseerde toegang, inclusief toegang door beheerders: AVG Artikel 32 vereist bescherming tegen ongeautoriseerde toegang door beheerders, PCI-DSS Requirement 3.4 verplicht dat kaarthouderdata onleesbaar is voor databasebeheerders, ISO 27001 controle A.10.1.1 vereist cryptografische maatregelen die ook bescherming bieden tijdens gebruik. Het risico is hoog voor databases met hoogst gevoelige gegevens zoals persoonsgegevens, financiële informatie, gezondheidsgegevens of intellectueel eigendom, en sterk aanbevolen voor gereguleerde sectoren waar compliance-vereisten mandateren dat zelfs beheerders geen toegang mogen hebben tot onversleutelde gevoelige gegevens.

Management Samenvatting

Always Encrypted voor Azure SQL Database is een client-side versleutelingstechnologie die gevoelige gegevens versleutelt op kolomniveau, zowel in rust als tijdens gebruik. In tegenstelling tot TDE die alleen data-at-rest beschermt, blijft data met Always Encrypted versleuteld in het geheugen, waardoor databasebeheerders en onbevoegde gebruikers met database-toegang nooit onversleutelde gevoelige gegevens kunnen zien. Always Encrypted werkt met Column Encryption Keys (CEKs) die daadwerkelijk worden gebruikt om kolomdata te versleutelen, en Column Master Keys (CMKs) die worden gebruikt om CEKs te versleutelen. CMKs worden opgeslagen in Azure Key Vault, terwijl CEKs worden opgeslagen in de database in versleutelde vorm. De versleuteling ondersteunt twee modi: Deterministic Encryption waarbij dezelfde plaintext altijd dezelfde ciphertext produceert (equality searches mogelijk maar minder beveiliging), en Randomized Encryption waarbij elke versleuteling een unieke ciphertext produceert (maximale beveiliging maar geen equality searches). Deze maatregel is sterk aanbevolen voor databases met hoogst gevoelige gegevens waar zelfs databasebeheerders geen toegang mogen hebben tot onversleutelde data, verplicht voor compliance met AVG Artikel 32, PCI-DSS Requirement 3.4, en ISO 27001 controle A.10.1.1. Implementatie: Azure Key Vault configureren voor CMKs, CEKs en CMKs aanmaken, databasekolommen configureren voor Always Encrypted, applicaties aanpassen voor Always Encrypted-ondersteuning. Kosten: Key Vault-operaties circa €0,025 per 10.000 operaties, plus applicatie-ontwikkelingskosten. Return on investment komt van: compliance audit-succes, bescherming tegen insider threats, en bescherming tegen gecompromitteerde accounts met database-toegang.