forked from paiml/databricks-governance
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpermission_model.sql
More file actions
65 lines (48 loc) · 2.8 KB
/
Copy pathpermission_model.sql
File metadata and controls
65 lines (48 loc) · 2.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
-- =============================================================================
-- Lesson 1.4: Access Control
-- Designing a Permission Model for Real-World Teams
-- =============================================================================
-- This script demonstrates a least-privilege permission model built around
-- groups rather than individual users, using row filters and column masks
-- for fine-grained data protection.
-- =============================================================================
-- ── Step 1: Grant catalog access to all teams (required for any deeper access) ─
GRANT USE CATALOG ON CATALOG GovernanceCatalog
TO `data-consumers`, `ml-engineers`, `etl-service-principal`, `data-admins`;
-- ── Step 2: Grant bronze access only to the ETL identity ──────────────────────
GRANT USE SCHEMA, SELECT, MODIFY ON SCHEMA GovernanceCatalog.bronze
TO `etl-service-principal`;
-- ── Step 3: Grant silver access to engineers and read-only to analysts ─────────
GRANT USE SCHEMA, SELECT, MODIFY ON SCHEMA GovernanceCatalog.silver
TO `data-engineers`;
GRANT USE SCHEMA, SELECT ON SCHEMA GovernanceCatalog.silver
TO `analysts`;
-- ── Step 4: Grant gold access broadly — this layer is designed for consumption ─
GRANT USE SCHEMA, SELECT ON SCHEMA GovernanceCatalog.gold
TO `data-consumers`, `analysts`, `ml-engineers`;
-- ── Step 5: Column mask for PII — hide raw email in silver for non-admins ───────
-- Create a masking function (requires Unity Catalog-enabled workspace)
CREATE OR REPLACE FUNCTION GovernanceCatalog.silver.mask_email(email STRING)
RETURNS STRING
RETURN CASE
WHEN is_account_group_member('data-admins') THEN email
ELSE regexp_replace(email, '(.).+(@.+)', '$1***$2')
END;
-- Attach the mask to the column
ALTER TABLE GovernanceCatalog.silver.events_clean
ALTER COLUMN user_id
SET MASK GovernanceCatalog.silver.mask_email;
-- ── Step 6: Row filter — analysts only see events from the last 90 days ─────────
CREATE OR REPLACE FUNCTION GovernanceCatalog.silver.recent_events_only(event_time TIMESTAMP)
RETURNS BOOLEAN
RETURN CASE
WHEN is_account_group_member('data-admins') THEN TRUE
WHEN is_account_group_member('data-engineers') THEN TRUE
ELSE event_time >= current_timestamp() - INTERVAL 90 DAYS
END;
ALTER TABLE GovernanceCatalog.silver.events_clean
SET ROW FILTER GovernanceCatalog.silver.recent_events_only ON (event_time);
-- ── Audit: verify the model looks correct ────────────────────────────────────
SHOW GRANTS ON CATALOG GovernanceCatalog;
SHOW GRANTS ON SCHEMA GovernanceCatalog.silver;
SHOW GRANTS ON TABLE GovernanceCatalog.silver.events_clean;