Data Governance in 2026: Waarom Nu Meer dan Ooit
De datawereld staat nooit stil. In 2026 beheren organisaties petabytes aan gevoelige data verspreid over meerdere clouds, on-premises systemen en SaaS-platforms. De AVG (GDPR) is inmiddels strenger gehandhaafd dan ooit — boetes van tientallen miljoenen euro's zijn geen uitzondering meer voor Nederlandse ondernemingen die hun databeleid niet op orde hebben. Tegelijkertijd eisen business-units snelle, zelfbedienings-analytics zonder weken te wachten op data-toegangsverzoeken.
Twee platformen domineren momenteel het debat rond enterprise data governance: AWS Lake Formation voor organisaties die zwaar inzetten op het AWS-ecosysteem, en Databricks Unity Catalog voor teams die werken met een multi-cloud of Spark-georiënteerde stack. Beide beloven fine-grained access control, centrale beheersbaarheid en compliance-ondersteuning — maar hun aanpak verschilt wezenlijk.
In dit artikel duiken we diep in beide oplossingen: hoe ze werken, wanneer je welke kiest, en hoe je ze productie-waardig implementeert. Met concrete codevoorbeelden, een eerlijke vergelijking en praktische tips voor Nederlandse data-engineers en architecten.
Kernbegrippen
Unity Catalog: De gecentraliseerde governance-laag van Databricks die data-assets (tabellen, views, volumes, modellen) beheert over meerdere workspaces en clouds heen via één unified metastore.
AWS Lake Formation: AWS-service die fine-grained toegangscontrole biedt op data die is opgeslagen in Amazon S3, beheerd via een centrale permissie-laag bovenop de bestaande IAM-structuur.
Fine-grained access control (FGAC): Toegangsbeheer op rij- en kolomniveau, in tegenstelling tot grove S3-bucket of database-niveau permissies.
Unity Catalog: Architectuur en Werking
Unity Catalog introduceert een drielaags namespace: catalog.schema.table.
Dit klinkt simpel, maar de consequenties zijn enorm. Waar je voorheen per Databricks-workspace een aparte
metastore had (Hive Metastore), beheer je nu alle data-assets centraal — inclusief Delta-tabellen, externe tabellen,
views, functies, ML-modellen en volumes.
Account-level Metastore
Eén Unity Catalog metastore per regio, gelinkt aan je Databricks Account. Alle workspaces binnen die regio delen dezelfde governance-laag. Data staat in je eigen cloud storage (S3, ADLS of GCS) — Databricks slaat geen klantdata op.
Catalogs als Isolatie-eenheid
Een catalog is de hoogste namespace en is ideaal voor omgeving-scheiding (dev/test/prod) of business-unit isolatie. Elke catalog heeft een eigen storage root en kan afzonderlijk worden beheerd.
Schemas, Tabellen en Volumes
Binnen een catalog maak je schemas (vergelijkbaar met databases). Tabellen kunnen managed of external zijn. Volumes zijn voor ongestructureerde bestanden — ideaal voor raw-landing zones.
Identity Federation & Groepen
Unity Catalog synchroniseert met je identity provider (Azure AD, Okta, AWS SSO) via SCIM. Groepen definieer je eenmalig op account-niveau en wijs je toe aan catalogs, schemas of tabellen.
Row Filters en Column Masks
De kroon op het werk: dynamische row-level security en column masking zonder views te hoeven aanmaken. Een Python/SQL-functie evalueert bij elke query welke rijen en kolommen een gebruiker mag zien.
Unity Catalog in de Praktijk: SQL-configuratie
-- Stap 1: Catalog aanmaken en rechten toewijzen
CREATE CATALOG IF NOT EXISTS prod_financials
MANAGED LOCATION 's3://mijn-bedrijf-unity/prod-financials/';
GRANT USE CATALOG ON CATALOG prod_financials TO `data-analysts`;
GRANT USE CATALOG ON CATALOG prod_financials TO `data-engineers`;
-- Stap 2: Schema en tabel aanmaken
CREATE SCHEMA IF NOT EXISTS prod_financials.transactions
COMMENT 'Financiële transactiedata - AVG-gevoelig';
CREATE TABLE prod_financials.transactions.betalingen (
transactie_id BIGINT NOT NULL,
klant_id STRING NOT NULL,
bsn_hash STRING COMMENT 'Gehashte BSN - pseudoniem',
bedrag DECIMAL(12,2),
valuta STRING,
land STRING,
aanmaak_datum TIMESTAMP,
verwerkt BOOLEAN
)
USING DELTA
TBLPROPERTIES (
'delta.enableChangeDataFeed' = 'true',
'classification' = 'confidential',
'data_owner' = 'finance-team@bedrijf.nl'
);
-- Stap 3: Granulaire permissies
GRANT SELECT ON TABLE prod_financials.transactions.betalingen
TO `data-analysts`;
-- Engineers mogen alles
GRANT ALL PRIVILEGES ON SCHEMA prod_financials.transactions
TO `data-engineers`;
Row-Level Security met Row Filters
-- Row filter functie: analisten zien alleen transacties uit eigen regio
CREATE OR REPLACE FUNCTION prod_financials.transactions.filter_regio(land STRING)
RETURNS BOOLEAN
LANGUAGE SQL
COMMENT 'Beperkt rijen tot de regio van de ingelogde gebruiker'
AS $$
CASE
WHEN IS_MEMBER('nl-analysts') THEN land = 'NL'
WHEN IS_MEMBER('be-analysts') THEN land = 'BE'
WHEN IS_MEMBER('data-engineers') THEN TRUE -- volledige toegang
ELSE FALSE
END
$$;
-- Filter toepassen op de tabel
ALTER TABLE prod_financials.transactions.betalingen
SET ROW FILTER prod_financials.transactions.filter_regio ON (land);
-- Column mask voor BSN-hash: alleen security-team ziet de waarde
CREATE OR REPLACE FUNCTION prod_financials.transactions.mask_bsn(bsn_hash STRING)
RETURNS STRING
LANGUAGE SQL
AS $$
CASE
WHEN IS_MEMBER('security-team') THEN bsn_hash
ELSE '***MASKED***'
END
$$;
ALTER TABLE prod_financials.transactions.betalingen
ALTER COLUMN bsn_hash SET MASK prod_financials.transactions.mask_bsn;
Pro Tip: Audit Logging
Unity Catalog logt automatisch elke datalezing en schrijfoperatie naar de Databricks System Tables
(catalog: system.access.audit). Voor AVG-compliance kun je hier direct op querien: wie heeft welke
persoonsgegevens bekeken, wanneer, en via welk notebook of job? Stel een alert in als ongebruikelijke patronen
worden gedetecteerd.
-- AVG Audit: wie heeft klantdata bekeken in de afgelopen 7 dagen?
SELECT
user_identity.email AS gebruiker,
request_params.table_full_name AS tabel,
COUNT(*) AS aantal_queries,
MIN(event_time) AS eerste_toegang,
MAX(event_time) AS laatste_toegang
FROM system.access.audit
WHERE action_name IN ('commandSubmit', 'runCommand')
AND request_params.table_full_name LIKE 'prod_financials.transactions%'
AND event_date >= CURRENT_DATE - INTERVAL 7 DAYS
GROUP BY 1, 2
ORDER BY aantal_queries DESC;
AWS Lake Formation: Architectuur en Werking
Lake Formation positioneert zich als de centrale permissie-broker bovenop het AWS data-ecosysteem. In plaats van direct S3-bucket policies en IAM-rollen te beheren, delegeer je alle data-toegang aan Lake Formation. Services als Athena, Glue, Redshift Spectrum, EMR en QuickSight respecteren deze permissies automatisch.
Glue Data Catalog Integratie
Lake Formation werkt naadloos samen met de AWS Glue Data Catalog als metadataopslag. Tabellen, databases en partities gedefinieerd in Glue worden automatisch beveiligd via Lake Formation policies.
Data Filters (Row & Column)
Net als Unity Catalog ondersteunt Lake Formation row- en column-level security via Data Filters. Deze filters zijn declaratief en worden geëvalueerd op query-tijd door de aangeroepen service.
Cross-Account Data Sharing
Met Lake Formation Resource Links en RAM (Resource Access Manager) deel je data over AWS-accounts heen. Essentieel voor data mesh-architecturen waarbij producenten en consumenten in aparte accounts opereren.
Lake Formation Configuratie via AWS CLI & CloudFormation
# Lake Formation data location registreren
aws lakeformation register-resource \
--resource-arn arn:aws:s3:::mijn-data-lake-bucket \
--use-service-linked-role \
--region eu-west-1
# Database aanmaken in Glue Catalog
aws glue create-database \
--database-input '{
"Name": "financiele_data",
"Description": "AVG-gevoelige financiële transacties",
"Parameters": {
"classification": "confidential",
"data_owner": "finance-team@bedrijf.nl"
}
}'
# Lake Formation permissies toekennen: SELECT op specifieke kolommen
aws lakeformation grant-permissions \
--principal DataLakePrincipalIdentifier=arn:aws:iam::123456789012:role/DataAnalystRole \
--resource '{
"TableWithColumns": {
"DatabaseName": "financiele_data",
"Name": "betalingen",
"ColumnWildcard": {
"ExcludedColumnNames": ["bsn_hash", "rekeningnummer_raw"]
}
}
}' \
--permissions SELECT \
--permissions-with-grant-option []
# CloudFormation: Lake Formation Data Filter voor rij-niveau beveiliging
Resources:
NLOnlyDataFilter:
Type: AWS::LakeFormation::DataCellsFilter
Properties:
TableCatalogId: !Ref AWS::AccountId
DatabaseName: financiele_data
TableName: betalingen
Name: nl_transactions_only
RowFilter:
FilterExpression: "land = 'NL'"
ColumnWildcard:
ExcludedColumnNames:
- bsn_hash
- rekeningnummer_raw
AnalystPermission:
Type: AWS::LakeFormation::PrincipalPermissions
Properties:
Principal:
DataLakePrincipalIdentifier: !Sub
"arn:aws:iam::${AWS::AccountId}:role/NLDataAnalystRole"
Resource:
DataCellsFilter:
TableCatalogId: !Ref AWS::AccountId
DatabaseName: financiele_data
TableName: betalingen
Name: nl_transactions_only
Permissions:
- SELECT
PermissionsWithGrantOption: []
Unity Catalog vs. Lake Formation: Eerlijke Vergelijking
| Criterium | Unity Catalog | AWS Lake Formation |
|---|---|---|
| Multi-cloud | ✅ AWS, Azure, GCP | ❌ AWS-only |
| Engine-afhankelijkheid | Optimaal met Databricks/Spark; beperkte externe integraties | Breed: Athena, Redshift, EMR, Glue, QuickSight, SageMaker |
| Row-level security | ✅ Dynamische SQL-functies (Python/SQL) | ✅ Declaratieve FilterExpression |
| Column masking | ✅ Functies met is_member() logica | ✅ Via ColumnWildcard excludes (minder dynamisch) |
| Delta Lake / Iceberg | ✅ Native Delta; Iceberg via UniForm | ✅ Iceberg native; Delta via Athena/EMR |
| Data lineage | ✅ Automatische kolom-niveau lineage | ⚠️ Beperkt; via AWS Glue DataBrew of DataZone |
| ML-model governance | ✅ MLflow-modellen in Unity Catalog | ❌ Niet van toepassing (SageMaker Model Registry apart) |
| Prijs | Inbegrepen bij Databricks Premium/Enterprise | Gratis service; kosten via onderliggende services |
| AVG-audit logging | ✅ System Tables (direct querybaar) | ✅ CloudTrail + Lake Formation logs naar S3/CloudWatch |
| Data sharing extern | ✅ Delta Sharing protocol (open standaard) | ✅ Lake Formation cross-account + AWS Data Exchange |
| Leercurve | Gemiddeld (SQL-first, vertrouwd voor analisten) | Hoog (IAM + LF-permissies interactie complex) |
| Geschikt voor | Databricks-heavy shops, multi-cloud, DS/ML-teams | AWS-native organisaties, brede service-integratie |
Let op: IAM-complexiteit bij Lake Formation
Een veelgemaakte fout bij Lake Formation: IAM-rollen blijven directe S3-toegang houden naast Lake Formation-permissies. Zorg dat je S3-bucket policies alleen de Lake Formation service-role toestaan, en alle andere principals weigeren. Anders omzeilen gebruikers via de AWS SDK de governance-laag volledig. Voeg dit toe aan je S3-bucket policy:
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::mijn-data-lake-bucket/*",
"Condition": {
"StringNotLike": {
"aws:PrincipalArn": [
"arn:aws:iam::*:role/aws-service-role/lakeformation.amazonaws.com/*",
"arn:aws:iam::123456789012:role/DataLakeAdmin"
]
}
}
}
Hybride Aanpak: Lake Formation + Unity Catalog
In 2026 kiezen veel Nederlandse organisaties niet voor óf/óf maar voor een hybride governance-model: AWS Lake Formation als de authoritative permissie-laag op S3-niveau, gecombineerd met Unity Catalog als de Databricks-governance-laag die external locations gebruikt.
Praktijkcase: Nederlandse Retailer met Multi-Cloud Data Platform
Een Nederlandse retailer met 200+ winkels gebruikt AWS als primaire cloud voor operationele data, maar Databricks op Azure voor advanced analytics en ML. Hun governance-architectuur:
- S3 (AWS): Lake Formation beheert toegang voor Athena, Glue ETL en QuickSight dashboards. Business users en BI-teams werken hier.
- Unity Catalog: Data engineers en scientists op Databricks lezen via External Locations vanuit S3 (cross-cloud via S3-compatible API op Azure). Governance op kolom-niveau via Unity Catalog.
- Synchronisatie: Een dagelijkse reconciliatie-job vergelijkt Lake Formation en Unity Catalog permissies en escaleert afwijkingen via PagerDuty.
Resultaat: AVG-audit is volledig aantoonbaar, time-to-access voor nieuwe analisten daalde van 3 weken naar 4 uur, en het aantal data-incidenten daalde met 78% in het eerste jaar.
Unity Catalog External Location naar S3
-- External Location aanmaken in Unity Catalog die verwijst naar S3
-- (vereist een Storage Credential met AWS IAM Role)
CREATE STORAGE CREDENTIAL aws_s3_prod
WITH AWS IAM ROLE arn:aws:iam::123456789012:role/DatabricksUnityRole
COMMENT 'Productie S3 toegang voor Unity Catalog';
CREATE EXTERNAL LOCATION prod_s3_financials
URL 's3://mijn-data-lake-bucket/financials/'
WITH (STORAGE CREDENTIAL aws_s3_prod)
COMMENT 'Financiële data opgeslagen in AWS S3';
GRANT READ FILES ON EXTERNAL LOCATION prod_s3_financials TO `data-engineers`;
-- External tabel registreren vanuit S3
CREATE TABLE prod_financials.transactions.betalingen_external
USING DELTA
LOCATION 's3://mijn-data-lake-bucket/financials/delta/betalingen/';
-- Verificatie: Unity Catalog enforce de permissies,
-- onderliggende S3 is beschermd via Lake Formation + IAM
DESCRIBE EXTENDED prod_financials.transactions.betalingen_external;
AVG Compliance: Concrete Maatregelen
Voor Nederlandse organisaties is AVG-compliance geen nice-to-have maar een wettelijke verplichting. Beide governance-platforms bieden bouwstenen, maar de implementatie vereist bewuste keuzes.
Classificeer je data first
Gebruik Unity Catalog Tags of Lake Formation LF-Tags om kolommen te labelen:
pii=true, special_category=true, retention_days=365.
Maak governance-beleid afhankelijk van deze tags, niet van hardcoded tabelnamen.
Recht op vergetelheid automatiseren
Implementeer een GDPR Erasure Service: bij een verwijderverzoek triggert een API een DELETE op Delta-tabellen op basis van klant-ID. Log de actie in een audit-tabel. Delta Lake's VACUUM verwijdert daarna de fysieke bestanden na retentieperiode.
Pseudonimisering in de pipeline
Verwerk persoonsgegevens nooit in plain text in je Gold-laag. Hash BSN, e-mail en telefoon in de Bronze→Silver transformatie. Bewaar de mapping-tabel in een aparte, streng beveiligde catalog.
Data retentie afdwingen
Definieer retentiebeleid als tabel-eigenschappen en implementeer een Databricks Workflow of AWS Glue job die wekelijks verlopen data verwijdert. Log deleties voor de Functionaris Gegevensbescherming.
-- Unity Catalog: AVG-tags toewijzen aan kolommen
ALTER TABLE prod_financials.transactions.betalingen
ALTER COLUMN klant_id SET TAGS ('pii' = 'true', 'data_subject' = 'klant');
ALTER TABLE prod_financials.transactions.betalingen
ALTER COLUMN bsn_hash SET TAGS ('pii' = 'true', 'special_category' = 'false',
'pseudonymized' = 'true');
-- Query: welke kolommen zijn PII in onze productie-catalogs?
SELECT
catalog_name,
schema_name,
table_name,
column_name,
tag_name,
tag_value
FROM system.information_schema.column_tags
WHERE tag_name = 'pii'
AND tag_value = 'true'
AND catalog_name LIKE 'prod_%'
ORDER BY catalog_name, table_name;
-- GDPR Erasure: verwijder alle data van klant
DELETE FROM prod_financials.transactions.betalingen
WHERE klant_id = :klant_id_param;
-- Loggen van de erasure actie
INSERT INTO prod_governance.audit.erasure_log VALUES (
current_timestamp(),
:klant_id_param,
'betalingen',
current_user(),
'GDPR_ERASURE_REQUEST',
:ticket_id
);
Best Practices voor Productie-implementatie
Governance as Code
Beheer al je Unity Catalog- en Lake Formation-permissies via Terraform (Databricks Provider / AWS LF Provider). Sla in Git op, review via pull requests, en deploy via CI/CD. Nooit meer handmatige UI-klikken in productie.
Groepen, niet Individuen
Ken permissies altijd toe aan groepen, nooit aan individuele gebruikers of service principals. Zo scale je governance mee met je organisatie en hoef je bij rol-wijzigingen maar één plek aan te passen.
Least Privilege by Default
Begin met nul permissies en voeg toe op basis van aantoonbare business-behoefte. Implementeer een Access Request Portal zodat gebruikers zelf een verzoek indienen, goedgekeurd door de data owner.
Terraform: Unity Catalog Infrastructure as Code
# terraform/unity_catalog/main.tf
terraform {
required_providers {
databricks = {
source = "databricks/databricks"
version = "~> 1.38"
}
}
}
# Catalog aanmaken
resource "databricks_catalog" "prod_financials" {
name = "prod_financials"
comment = "Productie financiële data - AVG-gevoelig"
storage_root = "s3://mijn-bedrijf-unity/prod-financials/"
properties = {
data_classification = "confidential"
data_owner = "finance-team@bedrijf.nl"
gdpr_applicable = "true"
}
}
# Schema
resource "databricks_schema" "transactions" {
catalog_name = databricks_catalog.prod_financials.name
name = "transactions"
comment = "Transactiedata"
}
# Groep: data-analysts
resource "databricks_group" "data_analysts" {
display_name = "data-analysts"
}
# Permissies: analisten mogen catalog en schema gebruiken
resource "databricks_grants" "catalog_usage" {
catalog = databricks_catalog.prod_financials.name
grant {
principal = databricks_group.data_analysts.display_name
privileges = ["USE_CATALOG"]
}
}
resource "databricks_grants" "schema_usage" {
schema = "${databricks_catalog.prod_financials.name}.${databricks_schema.transactions.name}"
grant {
principal = databricks_group.data_analysts.display_name
privileges = ["USE_SCHEMA", "SELECT"]
}
}