默认情况下,使用控件标记保护新表

本教程介绍如何在数据专员查看和分类新表的内容后自动锁定新表并释放它们。 它使用:

  • 架构级review_status控制标记,使得在架构中新建的表默认情况下都会被屏蔽。
  • 数据分类自动检测并使用class.*系统标记标记敏感列
  • 用于类型感知掩码的内置 system.data_classification.mask_value 函数
  • 两个策略:一个策略:一个在表处于等待审阅状态时屏蔽所有列,一个策略在审阅后仅屏蔽分类列

先决条件

  • Databricks Runtime 16.4 或更高版本,或无服务器计算。
  • 帐户管理员或工作区管理员权限(用于创建受治理的标记并启用数据分类)。
  • MANAGE 目标目录或架构的权限。
  • EXECUTE 在 UDF 上下功夫。
  • SQL 笔记本或查询编辑器。

Scenario

组织定期将新表添加到 Unity Catalog 架构,这些新表来自收购、合作伙伴集成或新产品功能。 默认情况下,具有 SELECT 架构的任何用户都可以立即查询新表,包括可能包含未分类 PII 的列。

控件标记模式解决了此问题:架构级 review_status = pending 标记会导致架构中的每个新表默认完全掩码。 数据分类在后台扫描表,并将 class.* 标签应用于检测到的敏感列。 在数据专员查看分类并更正任何误报后,他们会在表级别将 review_status 切换为 reviewed。 这会替代继承的架构标记,第二个策略开始生效:仅屏蔽class.*标记的列,同时使非敏感列可访问。

步骤 1:在目录中启用数据分类

数据分类扫描后台的表,并应用由系统管理的标签,例如class.*class.nameclass.email_address。 列级检测不需要自定义标记。

  1. 在目录资源管理器中,选择目录并转到“ 详细信息 ”选项卡。
  2. 数据分类旁边,单击“ 启用”。
  3. (可选)选择要包含的架构。

稍后在查看初始检测(步骤 6)后,从“数据分类结果”页启用自动标记。

有关完整详细信息,请参阅 数据分类

步骤 2:创建 review_status 受治理的标记

在目录浏览器用户界面中创建以下受治理标记(目录>治理>治理的标记>创建受治理标记):

标记键 允许的值
review_status pendingreviewed

Warning

标记数据以纯文本形式存储,可全局复制。 不要使用标记名称、值或描述符,这些标记名称或描述符可能会损害资源的安全性。 例如,不要使用包含个人或敏感信息的标记名称、值或描述符。

步骤 3:生成架构并应用控制标记

创建架构并将控件标记设置为 pending。 在此架构中创建的每个表都会自动继承此标记。

CREATE CATALOG IF NOT EXISTS abac_tutorial;
USE CATALOG abac_tutorial;

CREATE SCHEMA IF NOT EXISTS secure_default;

ALTER SCHEMA abac_tutorial.secure_default
  SET TAGS ('review_status' = 'pending');

步骤 4:创建待审核的评审策略

表具有 review_status = pending时,将屏蔽所有列。 MATCH COLUMNS TRUE 匹配每个列,不论标签。

system.data_classification.mask_value是由Azure Databricks提供的类型感知掩码函数。 它基于运行时数据类型返回安全占位符。 例如,它返回0供整数使用,DATE '1970-01-01'供日期使用,并为字符串返回一个SHA-256哈希。 不需要自定义 UDF。

CREATE POLICY review_pending_policy
ON SCHEMA abac_tutorial.secure_default
COLUMN MASK system.data_classification.mask_value
TO `account users`
FOR TABLES
WHEN has_tag_value('review_status', 'pending')
MATCH COLUMNS TRUE AS m ON COLUMN m;

注释

若要从策略中免除特定组,请添加 EXCEPT 子句。 例如,帐户用户“除”data_admins“外, TO \允许组的成员data\_admins\ 绕过掩码并查看未屏蔽的数据。

步骤 5:创建表并验证锁定

在架构中创建表。 它继承 review_status = pending 自架构,因此会立即屏蔽所有列。

CREATE OR REPLACE TABLE abac_tutorial.secure_default.employee_directory (
  id INT,
  full_name STRING,
  personal_email STRING,
  ssn_number STRING,
  phone STRING,
  office_location STRING,
  title STRING,
  team STRING
);

INSERT INTO abac_tutorial.secure_default.employee_directory VALUES
  (1, 'Alice Johnson',  'alice.j@gmail.com',    '123-45-6789', '555-0101', 'NYC HQ Floor 12',    'Staff Engineer',      'Platform'),
  (2, 'Bob Smith',      'bob.smith@yahoo.com',  '234-56-7890', '555-0202', 'LA Office Suite 4',  'Sales Director',      'Enterprise'),
  (3, 'Carol White',    'carol.w@outlook.com',  '345-67-8901', '555-0303', 'Chicago Rm 301',     'Senior Engineer',     'Platform'),
  (4, 'David Lee',      'david.lee@gmail.com',  '456-78-9012', '555-0404', 'Houston Floor 2',    'Marketing Lead',      'Growth'),
  (5, 'Eva Martinez',   'eva.m@hotmail.com',    '567-89-0123', '555-0505', 'Phoenix Building B', 'HR Business Partner', 'People');

运行以下查询以确认所有列均已屏蔽。

SELECT * FROM abac_tutorial.secure_default.employee_directory;

步骤 6:查看分类并启用自动标记

一旦数据分类在启用后的24小时内完成对表的扫描,您应查看检测结果并启用自动标记功能,以便 class.* 标签同时应用于现有和未来的检测结果。

  1. 在目录资源管理器中,选择目录并转到“ 详细信息 ”选项卡。
  2. 在数据分类旁边,单击“查看结果”。
  3. 单击错误检测旁边的 “排除 ”图标,查看检测并提供有关任何错误的反馈。
  4. 为要应用的分类标记启用自动标记。 标签将在下次扫描中生成(在 24 小时内)。

有关数据分类 UI 和自动标记的详细信息,请参阅“查看分类结果”和“启用自动标记”。

对于本教程,请运行以下命令来模拟 class.* 自动标记将应用的标记,以便你可以看到端到端流,而无需等待后台扫描。

-- Simulate Data Classification tags (in production, these are applied automatically)
ALTER TABLE abac_tutorial.secure_default.employee_directory
  ALTER COLUMN full_name SET TAGS ('class.name' = '');
ALTER TABLE abac_tutorial.secure_default.employee_directory
  ALTER COLUMN personal_email SET TAGS ('class.email_address' = '');
ALTER TABLE abac_tutorial.secure_default.employee_directory
  ALTER COLUMN ssn_number SET TAGS ('class.us_ssn' = '');
ALTER TABLE abac_tutorial.secure_default.employee_directory
  ALTER COLUMN phone SET TAGS ('class.phone_number' = '');

步骤 7:创建已审阅的政策

当一个表被标记为 reviewed 时,只有标有 class.* 标签的列会被屏蔽。 非分类列变为可见。

CREATE POLICY review_complete_policy
ON SCHEMA abac_tutorial.secure_default
COLUMN MASK system.data_classification.mask_value
TO `account users`
FOR TABLES
WHEN has_tag_value('review_status', 'reviewed')
MATCH COLUMNS (
  has_tag('class.name')
  OR has_tag('class.email_address')
  OR has_tag('class.us_ssn')
  OR has_tag('class.phone_number')
  OR has_tag('class.credit_card')
  OR has_tag('class.date_of_birth')
) AS m
ON COLUMN m;

步骤 8:翻转控件标记并验证

将表标记为已审阅。 表级 reviewed 标记会覆盖继承的架构级 pending 标记,因此挂起的策略不再适用,而审阅的策略则开始生效。

ALTER TABLE abac_tutorial.secure_default.employee_directory
  SET TAGS ('review_status' = 'reviewed');

运行以下查询以确认更改。 带有class.*full_namepersonal_emailssn_numberphone标记的列将保持屏蔽状态。 非分类列(id、、office_locationtitleteam)现在可见。

SELECT * FROM abac_tutorial.secure_default.employee_directory;

步骤 9:验证新表的自动继承

在同一架构中创建另一个表。 它继承 review_status = pending 并自动完全锁定。 不需要任何其他配置。

CREATE OR REPLACE TABLE abac_tutorial.secure_default.transaction_log (
  txn_id INT, account_holder STRING, amount DOUBLE, txn_date DATE, description STRING
);

INSERT INTO abac_tutorial.secure_default.transaction_log VALUES
  (1001, 'Alice Johnson', 2500.00, '2026-01-15', 'Wire transfer'),
  (1002, 'Bob Smith',     1800.00, '2026-01-16', 'Direct deposit'),
  (1003, 'Carol White',   4200.00, '2026-01-17', 'Invoice payment');

运行以下查询以确认新表已完全屏蔽。 数据分类扫描后,只有 class.*标记的列在切换到 reviewed后仍保持屏蔽状态。

SELECT * FROM abac_tutorial.secure_default.transaction_log;

清理

若要删除在本教程中创建的所有对象,请运行以下命令。

DROP POLICY review_pending_policy ON SCHEMA abac_tutorial.secure_default;
DROP POLICY review_complete_policy ON SCHEMA abac_tutorial.secure_default;
DROP TABLE IF EXISTS abac_tutorial.secure_default.employee_directory;
DROP TABLE IF EXISTS abac_tutorial.secure_default.transaction_log;
DROP SCHEMA IF EXISTS abac_tutorial.secure_default CASCADE;
DROP CATALOG IF EXISTS abac_tutorial;

若要删除受治理的 review_status 标记,请使用目录资源管理器 UI。