MOC — dny 1 a 2
1. Představení Azure Databricks 2. Výběr a konfigurace compute 3. Objekty v Unity Catalogu 4. Zabezpečení Unity Catalogu 5. Governance Unity Catalogu 6. Datové modelování 7. Ingest dat
MOC — pokračování
8. Čištění a transformace dat 9. Data quality constraints · mimo osnovu 10. Datové pipelines 11. Lakeflow Jobs 12. Vývojový lifecycle · mimo osnovu 13. Monitoring a optimalizace
🏠 Rozcestník kurzu
Pod čarou — den 3
14. Průřez Microsoft Fabric 15. Power BI + Fabric + Databricks 16. Migrace z Oracle
🏠 Rozcestník kurzu
DP-750 · Kapitola 4

Zabezpečení objektů Unity Catalogu

Privilege model, row filtering a column masking, secrets, service principals a managed identity
🗂 Zabezpečení a governance

Cíle kapitoly

  • Popsat, jak Unity Catalog vyhodnocuje dotaz — od odeslání přes kontrolu oprávnění až po scoped tokeny a filtrování výsledků.
  • Navrhnout strategii access control s využitím privilege modelu, dědičnosti oprávnění a skupin z Microsoft Entra ID.
  • Implementovat row filtering a column masking pomocí SQL UDF funkcí přímo na tabulce.
  • Bezpečně přistupovat k secrets přes Azure Key Vault-backed secret scope.
  • Rozhodnout, kdy použít service principal a kdy managed identity s access connectorem.
4.1

Query lifecycle: jak Unity Catalog vyhodnocuje dotaz

Než začneme rozdávat oprávnění, potřebujeme pochopit, co se vlastně děje, když uživatel spustí dotaz nad tabulkou spravovanou Unity Catalogem. Unity Catalog funguje jako control plane pro bezpečnost a governance: každý dotaz projde kontrolou oprávnění, zapíše se do audit logu a teprve pak dostane compute krátkodobý přístup k datům.

Kdo čeká, že cluster „prostě čte soubory ze storage", bude překvapen — compute nikdy nedostane trvalé přihlašovací údaje ke storage. Dostane jen scoped temporary access token platný pro konkrétní objekty v konkrétním dotazu.

Principal user / group / service principal Compute cluster / SQL warehouse Unity Catalog control plane 2. audit log + kontrola oprávnění 3. cloud credential → 4. token ADLS Gen2 abfss:// — managed i external data 7. Row + column filtry vyhodnoceno na compute 1. dotaz request 4. scoped token + URL 5. čtení s tokenem 6. data 8. výsledek
Životní cyklus dotazu v Unity Catalogu: control plane ověří oprávnění, vydá scoped token a compute čte data přímo ze storage — fine-grained filtry se aplikují až na compute před vrácením výsledku.

Celý cyklus má osm kroků:

1) Odeslání dotazu — principal (uživatel, skupina nebo service principal) spustí dotaz z notebooku na all-purpose clusteru, z jobu na job clusteru, přes Databricks SQL warehouse, nebo z připojeného BI nástroje. 2) Validace v Unity Catalogu — compute předá request Unity Catalogu, ten jej zapíše do audit logu a ověří oprávnění ke všem objektům v dotazu. Zamítnutí se také loguje. 3) Převzetí cloud credential — pro každý objekt Unity Catalog převezme příslušný cloud credential (u managed tabulek storage metastoru, u external objektů storage credential dané external location). 4) Vydání scoped tokenů — Unity Catalog vygeneruje krátkodobý token a zabezpečenou URL pro každý objekt. 5–6) Přístup k datům — compute čte přímo z ADLS Gen2 endpointů (abfss://). 7) Fine-grained filtrování — row filtry a column masky se vyhodnocují na compute, takže každý principal vidí jen svou podmnožinu dat. 8) Vrácení výsledku volajícímu.

⚠️
Pozor: pokud má storage account zapnutý firewall nebo VNet pravidla, musíte explicitně povolit přístup pro access connector / managed identity. I platný token bude odmítnut, když identitu nepustí síťová pravidla storage účtu.
Jak se liší dotaz přes legacy Hive metastore▼

Workspace připojený k Unity Catalogu vidí starý Hive metastore jako speciální katalog hive_metastore. Dotaz nad Hive tabulkou ale probíhá jinak: cluster ověří přístup přes table ACLs, z metastoru dostane jen cestu ke storage a autentizovat se musí sám — přes service principal, credential passthrough nebo instance profile, které musí administrátor předem nakonfigurovat (často včetně mount pointů a secrets).

Chybí centrální vydávání scoped tokenů i integrovaný audit. Dokumentace: „Hive metastore table access control is a legacy data governance model." — pro nové projekty jej nepoužívejte.

4.2

Strategie access control: privilege model a dědičnost

Access control v Unity Catalogu stojí na čtyřech doplňujících se mechanismech:

MechanismusPůsobí naPoužití
Privileges a ownershipcatalog, schema, tabulkyzákladní přístup — kdo smí co
ABAC (tagy + policies)otagované objekty napříč katalogycentrální politiky (viz kapitola 5)
Row filtry / column maskyjednotlivé tabulkyfiltrování a maskování přes UDF
Workspace bindingscatalog, external location, storage credentialomezení na konkrétní workspace

Základem je privilege model: grant říká, kdo (principal) smí provést jakou akci (privilege — SELECT, MODIFY, CREATE TABLE…) na jakém objektu (securable). Securables tvoří hierarchii metastore → catalog → schema → tabulka/view a oprávnění se z vyšších úrovní dědí dolů.

Klíčové pravidlo, na kterém padá většina začátečníků: SELECT na tabulce sám o sobě nestačí. Principal potřebuje projít celou cestou — USE CATALOG na katalogu, USE SCHEMA na schématu a teprve pak SELECT na tabulce. Chybí-li kterýkoli článek, dotaz selže.

Metastore Catalog: prodej Schema: finance Tabulky: objednavky, … Explicitní model USE CATALOG na katalogu + USE SCHEMA na schématu + SELECT na každé tabulce ✓ nejbezpečnější, nic navíc ✗ pracné u tisíců tabulek Dědičnost ze schématu USE CATALOG + USE SCHEMA SELECT na celém schématu všechny tabulky + views včetně budoucích objektů ✓ méně správy, širší přístup
Dva způsoby, jak dát skupině přístup k tabulkám: explicitní granty na každé úrovni, nebo dědičnost — grant na schématu (či katalogu) pokrývá všechny současné i budoucí objekty uvnitř.

Granty se zadávají standardním ANSI SQL (DCL), z notebooku, SQL editoru nebo přes Permissions tab v Catalog Exploreru:

SQL
-- cesta k tabulce: catalog -> schema -> tabulka
GRANT USE CATALOG ON CATALOG prodej TO `analysts`;
GRANT USE SCHEMA ON SCHEMA prodej.finance TO `analysts`;
GRANT SELECT ON TABLE prodej.finance.objednavky TO `analysts`;

-- varianta s dedicnosti: SELECT na urovni schematu
GRANT SELECT ON SCHEMA prodej.finance TO `analysts`;

-- pravo vytvaret tabulky ve schematu
GRANT CREATE TABLE ON SCHEMA prodej.finance TO `analysts`;

-- odebrani opravneni
REVOKE SELECT ON TABLE prodej.finance.objednavky FROM `analysts`;

Kontrolu proveďte příkazem SHOW GRANTS:

SQL
SHOW GRANTS ON TABLE prodej.finance.objednavky;
SHOW GRANTS `analysts` ON SCHEMA prodej.finance;
⚠️
Pozor: SHOW GRANTS na tabulce nemusí zobrazit oprávnění zděděná ze schématu nebo katalogu. Pro úplný obraz zkontrolujte granty na všech úrovních hierarchie.
💡
Tip: grantujte skupinám, ne jednotlivcům. Identity (users, groups, service principals) se spravují v Microsoft Entra ID a synchronizují do Databricks accountu — Unity Catalog nepodporuje workspace-local skupiny. Vestavěný principal account users reprezentuje všechny uživatele accountu.
ℹ️
Poznámka: ALL PRIVILEGES uděluje všechna aplikovatelná oprávnění na objektu — včetně privilegií, která Databricks přidá v budoucnu. Metastore je vázaný na region: workspace lze připojit jen k metastoru ve stejném Azure regionu a vždy maximálně k jednomu.
4.3

Fine-grained access control: pod úroveň tabulky

Granty z předchozí sekce fungují na principu „celá tabulka, nebo nic". V praxi ale často potřebujete z jedné kanonické tabulky ukázat různým skupinám jen část řádků nebo maskované hodnoty sloupců — regionální data jen regionálním týmům, PII jen compliance týmu. Duplikovat tabulky pro každé publikum je cesta do pekla: kopie zastarávají, synchronizace stojí orchestraci a bezpečnostní pravidla se rozjíždějí.

Unity Catalog nabízí dva manuální přístupy k fine-grained access control:

DimenzeRow a column securityDynamic views
Kde žije logikapřímo na tabulce (UDF)v definici view
Počet objektůtabulka + pár funkcíview pro každé publikum
Skládání více tabulekne — jen jedna tabulkaano, joiny přes více tabulek
Zápis do datčtení i zápis s aplikovanými pravidly (na dedicated compute zápisy až od DBR 16.3+)view je read-only
Abstrakce od zdrojestruktura tabulky viditelnákonzument zdrojové tabulky nevidí

Row a column security (row filtry + column masky) je preferovaný moderní přístup: pravidla jsou připojená k metadatům tabulky, platí všude, kde se tabulka použije, a nevzniká „zvěřinec" odvozených views. Dynamic views jsou starší vzor, který má stále smysl, když potřebujete složit data z více tabulek, vytvořit explicitní kontrakt mezi producentem a konzumentem, nebo konzumenty úplně odstínit od existence zdrojových tabulek.

⚠️
Pozor: zápisy do tabulky s row filtrem či column maskou mají na dedicated compute vlastní požadavky — od Databricks Runtime 16.3 výš jsou podporované, na DBR 15.4–16.2 jde jen o čtení. MERGE navíc nepodporuje tabulky, jejichž filtry nebo masky obsahují vnořené (nested) konstrukce, agregace, okenní funkce, LIMIT nebo nedeterministické funkce. A ještě jedna praktická past: nad tabulkou s row filtrem nebo column maskou nefunguje time travel — TIMESTAMP AS OF / VERSION AS OF dotaz selže, i když kapitola 6 time travel jinak doporučuje. Přesný stav podpory ověřte v dokumentaci.
ℹ️
Poznámka: oba přístupy jsou manuální, per-table. Třetí možností je ABAC — centrální policies navázané na governed tagy, které se aplikují automaticky na všechny otagované tabulky ve schématu či katalogu. Databricks jej dnes doporučuje pro většinu scénářů; věnujeme se mu v kapitole 5 (sekce 5.2).
Časté omyly při návrhu fine-grained zabezpečení▼

Duplikace tabulek pro každé publikum — vede k nesynchronizovaným kopiím a governance chaosu. Desítky téměř identických views místo jedné zobecněné maskovací logiky — těžko se auditují. Byznys transformace uvnitř maskovacích funkcí — transformace patří do pipeline, ne do security vrstvy. Nezabezpečené UDF funkce — funkce jsou securables jako každé jiné; kdo je smí měnit, může obejít celý model. A konečně over-masking: když zamaskujete víc, než je nutné, zablokujete legitimní analytiku.

4.4

Row filtering a column masking v praxi

Implementace je překvapivě jednoduchá: napíšete SQL UDF s rozhodovací logikou a připojíte ji k tabulce. Pro kontrolu členství ve skupině slouží funkce is_account_group_member().

UDF: region_filter(region) SET ROW FILTER … ON (region) UDF: email_mask(email) ALTER COLUMN email SET MASK Tabulka customers North | anna@firma.cz South | petr@firma.cz North | eva@firma.cz Člen skupiny admins — vidí vše North | anna@firma.cz South | petr@firma.cz North | eva@firma.cz Analytik North — filtr + maska North | REDACTED North | REDACTED stejný dotaz, různé výsledky
Row filter a column mask jsou UDF funkce připojené k tabulce — každý principal dostane ze stejného dotazu jen svou povolenou podmnožinu řádků a maskované hodnoty citlivých sloupců.

Column mask — funkce vrací buď skutečnou hodnotu, nebo náhradu, podle členství ve skupině:

SQL
-- maskovaci funkce pro telefonni cislo
CREATE OR REPLACE FUNCTION phone_mask(c_phone STRING)
  RETURN CASE WHEN is_account_group_member('metastore_admins')
    THEN c_phone
    ELSE 'REDACTED PHONE NUMBER'
  END;

ALTER TABLE customers
  ALTER COLUMN c_phone
  SET MASK phone_mask;

Row filter — funkce vrací true jen pro řádky, které mají být vidět:

SQL
-- admin vidi vse, ostatni jen nationkey = 21
CREATE OR REPLACE FUNCTION nation_filter(c_nationkey INT)
  RETURN IF(is_account_group_member('admin'), true, c_nationkey = 21);

ALTER TABLE customers
SET ROW FILTER nation_filter ON (c_nationkey);

Stejná pravidla vyjádřená v jednom view — zdrojová tabulka zůstává nedotčená a konzumenti dostanou grant jen na view:

SQL
CREATE OR REPLACE VIEW vw_customers AS
SELECT
  c_custkey, c_name, c_nationkey,
  CASE WHEN is_account_group_member('admins') THEN c_phone
       ELSE 'REDACTED PHONE NUMBER' END AS c_phone
FROM customers_new
WHERE CASE WHEN is_account_group_member('admins') THEN TRUE
           ELSE c_nationkey = 21 END;

GRANT SELECT ON VIEW vw_customers TO `account users`;
💡
Tip: na jednu tabulku lze připojit jen jeden row filter a na jeden sloupec jednu masku. Rozhodovací logiku „kdo vidí co" proto navrhujte uvnitř jedné funkce, ne skládáním více filtrů.
✓
Shrnutí: table-level controls (filtr + maska) volte pro striktní vynucení všude, kde se tabulka používá; dynamic views pro flexibilní, sdílené abstrakce nad více tabulkami.
4.5

Secrets přes Azure Key Vault: secret scopes

Hesla, API klíče ani connection stringy nikdy nepatří do kódu notebooku. Azure Databricks je organizuje do secret scopes — pojmenovaných kolekcí secrets, na jejichž úrovni se řídí přístup. Existují dva typy:

Databricks-backed scopeAzure Key Vault-backed scope
Uložení secretsšifrovaná DB spravovaná DatabricksAzure Key Vault (read-only rozhraní)
Správa secretsDatabricks CLI / APIAzure portal / CLI — v Key Vaultu
WRITE přes Databricksanone — jen čtení
Enterprise integraceomezenásíťová omezení, centrální rotace

Pro produkci v Azure je standardem Key Vault-backed scope: secrets žijí v Key Vaultu, zapadají do firemní security infrastruktury a po aktualizaci secretu jej všechny workspaces převezmou automaticky. dbutils.secrets.get() čte aktuální hodnotu při každém volání — po rotaci secretu tedy stačí kód spustit znovu. Restart clusteru potřebujete jen u secrets referencovaných ve Spark konfiguraci nebo v environment proměnných clusteru: ty se rozvinou při startu, a dokud cluster běží, drží starou hodnotu.

Scope se vytváří přes speciální URL https://<databricks-instance>#secrets/createScope (velké „S" je povinné — URL je case-sensitive). Budete potřebovat DNS Name a Resource ID Key Vaultu (najdete v Properties). Databricks si při vytvoření sám nastaví Get/List oprávnění na vault.

⚠️
Pozor: Key Vault musí používat permission model Vault access policy — RBAC model Databricks pro secret scopes nepodporuje. Novější verze Key Vault API přitom zakládají vaulty s RBAC jako výchozím modelem, takže vytvoření scope skončí chybou 403. Před vytvořením scope zkontrolujte Access configuration vaultu; přesný stav podpory ověřte v dokumentaci.

V notebooku pak secret čtete přes dbutils.secrets.get(), v SQL přes funkci secret():

PYTHON
# nacteni prihlasovacich udaju ze scope "jdbc"
username = dbutils.secrets.get(scope="jdbc", key="username")
password = dbutils.secrets.get(scope="jdbc", key="password")

df = (spark.read
  .format("jdbc")
  .option("url", "jdbc:sqlserver://server.database.windows.net:1433")
  .option("dbtable", "customers")
  .option("user", username)
  .option("password", password)
  .load()
)

# seznam klicu ve scope (bez hodnot)
dbutils.secrets.list("jdbc")
SQL
-- secret() v SQL; try_secret() vraci NULL misto chyby
SELECT secret('jdbc', 'username') AS db_username;

Výstupy notebooku hodnoty secrets automaticky nahrazují textem [REDACTED]. To ale chrání jen proti náhodnému úniku — kdokoli s právem spouštět kód na clusteru se k hodnotě programově dostane. Přístup proto řiďte ACL na scope (úrovně READ / WRITE / MANAGE) přes Databricks CLI:

BASH
# READ pro skupinu data-engineers na scope jdbc
databricks secrets put-acl jdbc data-engineers READ
databricks secrets list-acls jdbc
ℹ️
Poznámka: ACL na Key Vault-backed scope platí pro všechny secrets v celém vaultu. Potřebujete-li oddělit přístup k jednotlivým secrets, založte více Key Vaultů a k nim samostatné scopes. Omezení MANAGE jen na tvůrce scope vyžaduje Premium plán.
💡
Tip: secrets lze referencovat i ve Spark konfiguraci clusteru syntaxí {{secrets/storage/account-key}} nebo v environment proměnných. Pozor ale — každý s CAN ATTACH TO na clusteru si je přečte, i bez práv na scope.
4.6

Autentizace přes service principals

Service principal je identita pro aplikace a automatizaci — „uživatelský účet pro roboty". Joby a pipelines se s ním autentizují bez osobních přihlašovacích údajů, konzistentně napříč prostředími. Skládá se ze tří komponent: Application (client) ID, Directory (tenant) ID a client secret (heslo s expirací).

V Unity Catalogu se service principal typicky schová za storage credential: administrátor jej jednou zaregistruje a vy pak jen dotazujete tabulky — Unity Catalog za scénou převezme identitu, vyžádá si od Microsoft Entra ID dočasný token a předá jej compute. Do kódu se žádné credentials nedostanou a audit log zaznamená, kdo k čemu přistoupil.

Přímou konfiguraci v notebooku potkáte u storage, které v Unity Catalogu registrované není, nebo u legacy řešení — OAuth 2.0 client credentials flow přes Spark konfiguraci:

PYTHON
# client secret vzdy ze secret scope, nikdy natvrdo v kodu
service_credential = dbutils.secrets.get(scope="storage-secrets", key="sp-client-secret")

spark.conf.set("fs.azure.account.auth.type.<storage-account>.dfs.core.windows.net", "OAuth")
spark.conf.set("fs.azure.account.oauth.provider.type.<storage-account>.dfs.core.windows.net",
               "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
spark.conf.set("fs.azure.account.oauth2.client.id.<storage-account>.dfs.core.windows.net",
               "<application-id>")
spark.conf.set("fs.azure.account.oauth2.client.secret.<storage-account>.dfs.core.windows.net",
               service_credential)
spark.conf.set("fs.azure.account.oauth2.client.endpoint.<storage-account>.dfs.core.windows.net",
               "https://login.microsoftonline.com/<directory-id>/oauth2/token")

df = spark.read.parquet("abfss://<container>@<storage-account>.dfs.core.windows.net/path/to/data")
⚠️
Pozor: client secrets expirují a musí se rotovat. Když pipeline v pondělí ráno přestane číst data, expirovaný secret je jeden z prvních podezřelých. Domluvte si s administrátory rotační plán a vězte, na koho se obrátit.
💡
Tip: uplatňujte least privilege — každý service principal jen na ta úložiště, která skutečně potřebuje. Microsoft nicméně pro storage credentials doporučuje managed identities, kdykoli je to možné — bez secrets a s podporou síťově chráněných storage účtů. Detaily v následující sekci.
4.7

Managed identities a access connector

Managed identity je identita, jejíž životní cyklus spravuje Azure — žádný client secret, žádná expirace, žádná rotace. Unity Catalog ji používá prostřednictvím Azure Databricks access connectoru: first-party Azure resource, který funguje jako most mezi managed identitou a vaším Databricks accountem. Connector může nést buď system-assigned identitu (vzniká a zaniká s connectorem), nebo jednu či více user-assigned identit (existují nezávisle a lze je připojit k více connectorům).

Postup nasazení:

1) V Azure portálu vytvořte access connector (ideálně ve stejném regionu jako storage). 2) Managed identitě přidělte na ADLS Gen2 účtu roli Storage Blob Data Contributor; pro file event notifikace se hodí i Storage Queue Data Contributor. 3) V Catalog Exploreru vytvořte storage credential typu Azure Managed Identity s resource ID connectoru. 4) Nad credentialem definujte external locations — kombinace credentialu a konkrétní cesty abfss://, na kterou pak grantujete oprávnění.

SQL
-- external tabulka nad external location krytou managed identitou
CREATE TABLE prodej.bronze.sales_data
USING DELTA
LOCATION 'abfss://data@mystorageaccount.dfs.core.windows.net/sales/';

SELECT * FROM prodej.bronze.sales_data WHERE sale_date >= '2026-01-01';

Proč je to preferovaná cesta? Dokumentace shrnuje výhody proti service principalům: „They have the benefit of allowing Unity Catalog to access storage accounts protected by network rules, which isn't possible using service principals, and they remove the need to manage and rotate secrets." Jinými slovy — funguje i za firewallem storage účtu a nemá co expirovat.

ℹ️
Poznámka: k vytvoření storage credentialu potřebujete privilege CREATE STORAGE CREDENTIAL na metastoru (mají ji account a metastore admini). Jako data engineer typicky credentials nevytváříte — používáte existující přes external locations.
💡
Tip: external locations i storage credentials podporují workspace binding — produkční location připoutejte jen k produkčnímu workspace a dev prostředí se k produkčním datům nedostane ani omylem.
4.8

Lab 4: Secure Unity Catalog Objects (45 minut)

Fiktivní řetězec supermarketů NorthMart Retail se čtyřmi regiony (North, South, East, West) potřebuje zabezpečit zákaznická a věrnostní data: v labu vytvoříte skupinu retail-analysts a schema-level granty, row filter omezující záznamy podle regionu, column masku pro PII e-maily a Key Vault-backed secret scope retail-kv-scope pro bezpečné čtení API klíče v notebooku.

▶ Otevřít lab na GitHubu (EN) · Learn modul k tématu — s krátkými výukovými videy

ℹ️
Poznámka: na kurzu lab prochází lektor jako demo. Postup je krokový a samoobslužný — pokud se na něj v rámci dne nedostane, projdete si ho samostatně.
✓
Sebekontrola: 1) Jaká tři oprávnění potřebuje skupina, aby mohla dotazovat jednu tabulku explicitním modelem? 2) Jakým příkazem připojíte row filter funkci k tabulce a kolik filtrů může tabulka mít? 3) Proč musí Key Vault pro Databricks secret scope používat model Vault access policy a co se stane, když je nastavený RBAC?