本教程介绍如何使用 SQL 在 Unity 目录中配置行筛选器和列掩码 ABAC 策略。 有关基于目录资源管理器 UI 的版本,请参阅 教程:配置 ABAC。
在此示例中,分析团队无法访问欧盟客户记录,并且始终屏蔽 SSN。 同意数据共享的客户会显示完整的电子邮件。 其他人仅看到屏蔽的版本。
本教程包括以下步骤:
- 创建受治理的标记
- 创建 Unity Catalog 目录、模式和表
- 将受治理的标记应用于列
- 创建 UDF 以检测欧盟地址
- 创建行筛选器策略
- 测试行筛选器
- 创建用于屏蔽 SSN 的 UDF
- 创建列掩码策略
- 测试列掩码
完成这些步骤后,可以选择使用条件电子邮件掩码扩展教程(步骤 10-12)。
先决条件
- Databricks Runtime 16.4 或更高版本,或无服务器计算。
- 帐户管理员或工作区管理员权限(用于创建受管理标记)。
-
MANAGE目标目录或架构的权限。 -
EXECUTE在 UDF 上下功夫。
运行较旧运行时的计算无法访问 ABAC 保护的表。
步骤 1:创建受管理标记
受治理的标记 是在帐户级别定义的键值对。 ABAC 策略使用它们来发现要筛选或掩码的列。 在本教程中,将创建两个受治理的标记:
- 包含三个
pii允许值的标记:ssn、address和email -
consent仅限键的标记(没有允许的值)用于标识同意列
若要创建受管理标记,必须在帐户级别具有受管理标记 CREATE 权限。 默认情况下,帐户和工作区管理员具有创建权限。
- 在 Azure Databricks 工作区中,单击
Catalog。
- 单击
“治理 ”按钮。
- 在下拉菜单中,单击“受管标记”。
- 单击“ 创建受管理标记”。
- 对于标记键,请输入
pii。 - 为受治理的标签输入说明。
- 对于允许的值,请输入:
ssnaddress和email。 只能将这些值分配给此标记键。 - 单击 “创建” 。
- 重复步骤 4-8,使用键
consent创建第二个受治理标记。 将允许的值留空(仅键标记)。
Warning
标记数据以纯文本形式存储,可全局复制。 不要使用标记名称、值或描述符,这些标记名称或描述符可能会损害资源的安全性。 例如,不要使用包含个人或敏感信息的标记名称、值或描述符。
步骤 2:创建客户表
创建带有客户档案的目录、架构和表。 该 has_consent 列稍后用于条件电子邮件掩码。 已授予同意(TRUE)的客户会显示其完整电子邮件。
在附加到 Databricks Runtime 版本 16.4 或更高的计算环境的笔记本中运行以下命令:
-- Create catalog (if not already exists)
CREATE CATALOG IF NOT EXISTS abac_tutorial;
USE CATALOG abac_tutorial;
-- Create schema
CREATE SCHEMA IF NOT EXISTS customers;
USE SCHEMA customers;
CREATE OR REPLACE TABLE profiles (
first_name STRING,
last_name STRING,
email STRING,
phone_number STRING,
home_address STRING,
ssn_number STRING,
has_consent BOOLEAN
);
INSERT INTO profiles (first_name, last_name, email, phone_number, home_address, ssn_number, has_consent)
VALUES
('John', 'Doe', 'john.doe@example.com', '123-456-7890', '123 Main St, NY', '123-45-6789', TRUE),
('Jane', 'Smith', 'jane.smith@example.com', '234-567-8901', '456 Oak St, CA', '234-56-7890', FALSE),
('Alice', 'Johnson', 'alice.j@example.com', '345-678-9012', '789 Pine St, TX', '345-67-8901', TRUE),
('Bob', 'Brown', 'bob.brown@example.com', '456-789-0123', '321 Maple St, FL', '456-78-9012', FALSE),
('Charlie', 'Davis', 'charlie.d@example.com', '567-890-1234', '654 Cedar St, IL', '567-89-0123', TRUE),
('Emily', 'White', 'emily.w@example.com', '678-901-2345', '987 Birch St, WA', '678-90-1234', FALSE),
('Frank', 'Miller', 'frank.m@example.com', '789-012-3456', '741 Spruce St, WA', '789-01-2345', TRUE),
('Grace', 'Wilson', 'grace.w@example.com', '890-123-4567', '852 Elm St, NV', '890-12-3456', TRUE),
('Hank', 'Moore', 'hank.moore@example.com', '901-234-5678', '963 Walnut St, CO', '901-23-4567', FALSE),
('Ivy', 'Taylor', 'ivy.taylor@example.com', '012-345-6789', '159 Aspen St, AZ', '012-34-5678', TRUE),
('Liam', 'Connor', 'liam.c@example.com', '111-222-3333', '12 Abbey Street, Dublin, Ireland EU', '111-22-3333', TRUE),
('Sophie', 'Dubois', 'sophie.d@example.com', '222-333-4444', '45 Rue de Rivoli, Paris, France Europe', '222-33-4444', FALSE),
('Hans', 'Müller', 'hans.m@example.com', '333-444-5555', '78 Berliner Str., Berlin, Germany E.U.', '333-44-5555', TRUE),
('Elena', 'Rossi', 'elena.r@example.com', '444-555-6666', '23 Via Roma, Milan, Italy Europe', '444-55-6666', FALSE),
('Johan', 'Andersson', 'johan.a@example.com', '555-666-7777', '56 Drottninggatan, Stockholm, Sweden EU', '555-66-7777', TRUE);
步骤 3:向列添加受治理标记
将ssn_number、home_address和email列标记为pii受治理标记。 ABAC 策略按标记而不是按名称匹配列。
该 has_consent 列使用 consent 受管理标记进行标记。 这是步骤 11 中具有许可感知功能的掩码策略所必需的,该策略通过 has_consent 传递到 USING COLUMNS UDF。
ALTER TABLE abac_tutorial.customers.profiles
ALTER COLUMN ssn_number
SET TAGS ('pii' = 'ssn');
ALTER TABLE abac_tutorial.customers.profiles
ALTER COLUMN home_address
SET TAGS ('pii' = 'address');
ALTER TABLE abac_tutorial.customers.profiles
ALTER COLUMN email
SET TAGS ('pii' = 'email');
ALTER TABLE abac_tutorial.customers.profiles
ALTER COLUMN has_consent
SET TAGS ('consent' = '');
步骤 4:创建 UDF 以检测欧盟地址
此 UDF 接收标记为 pii = address 的每一列的值,并返回:
-
FALSE如果地址包含EU、E.U.、或Europe—— 该行将被隐藏。 -
TRUE否则,该行将被显示。
CREATE OR REPLACE FUNCTION is_not_eu_address(address STRING)
RETURNS BOOLEAN
RETURN (
SELECT CASE
WHEN LOWER(address) LIKE '%eu%'
OR LOWER(address) LIKE '%e.u.%'
OR LOWER(address) LIKE '%europe%'
THEN FALSE
ELSE TRUE
END
);
注释
这是一个简化的检查,用于演示目的。 在生产环境中,使用更可靠的方法,例如国家/地区代码列或查阅表格来确定区域。
步骤 5:创建行筛选器策略
若要创建策略,必须具有 MANAGE 该对象的对象或所有权。 若要将 UDF 添加到策略中,您必须在 UDF 上具有 EXECUTE。
CREATE POLICY hide_eu_customers
ON SCHEMA abac_tutorial.customers
ROW FILTER is_not_eu_address
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag_value('pii', 'address') AS addr_col
USING COLUMNS (addr_col);
还可以通过目录资源管理器 UI 创建策略。 有关详细信息,请参阅 创建和管理行筛选器和列掩码策略 。
步骤 6:测试行筛选器
运行以下查询以验证行筛选器策略是否正常工作。
SELECT * FROM abac_tutorial.customers.profiles;
仅返回 10 条非欧盟居民的数据行。 五位欧盟客户(利亚姆、苏菲、汉斯、埃琳娜和约翰)被隐藏。
步骤 7:创建用于屏蔽 SSN 的 UDF
此 UDF 为传递给它的任何 SSN 值返回完全编辑的占位符。
CREATE OR REPLACE FUNCTION redact_ssn(ssn STRING)
RETURNS STRING
RETURN '***-**-****';
步骤 8:创建列掩码策略
创建一个策略,以标记 pii = ssn 的所有列为目标,并将 redact_ssn 函数应用于每个列。
CREATE POLICY redact_ssn_policy
ON SCHEMA abac_tutorial.customers
COLUMN MASK redact_ssn
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag_value('pii', 'ssn') AS ssn_col
ON COLUMN ssn_col;
步骤 9:测试列掩码
运行以下查询,验证行筛选器和列掩码是否处于活动状态。
SELECT * FROM abac_tutorial.customers.profiles;
SSN 现在返回为 ***-**-****. 仅回送非欧盟居民,因为行筛选器也已经激活。
扩展:条件电子邮件掩码
以下步骤通过同意感知电子邮件掩码来扩展教程。 选择加入(has_consent = TRUE)的客户可以查看完整的电子邮件地址,而其他人只能看到电子邮件地址的第一个字符和域名。
步骤 10:创建同意感知电子邮件掩码 UDF
此 UDF 接受两个参数:
-
email:匹配列中的实际电子邮件值 -
consent:同一行中has_consent列的值
CREATE OR REPLACE FUNCTION mask_email_by_consent(email STRING, consent BOOLEAN)
RETURNS STRING
RETURN CASE
WHEN consent = TRUE THEN email
ELSE CONCAT(LEFT(email, 1), '***@', SUBSTRING_INDEX(email, '@', -1))
END;
步骤 11:创建条件电子邮件掩码策略
此策略针对标记为 pii = email 的列,并将 has_consent 列传递给 UDF。
注释
该has_consent列在consent 中使用受管理标记进行标记。 这是必需的,因为 USING COLUMNS 只能引用通过 MATCH COLUMNS 匹配的列。 即使 has_consent 未屏蔽,也必须对其进行标记,以便策略可以将其值传递给 UDF。
CREATE POLICY mask_email_by_consent_policy
ON SCHEMA abac_tutorial.customers
COLUMN MASK mask_email_by_consent
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag_value('pii', 'email') AS email_col,
has_tag('consent') AS consent_col
ON COLUMN email_col
USING COLUMNS (consent_col);
步骤 12:测试条件电子邮件掩码
运行以下查询,验证这三个策略是否协同工作。
SELECT * FROM abac_tutorial.customers.profiles;
具有 has_consent = TRUE 的客户将显示完整的电子邮件。 拥有has_consent = FALSE的客户会看到屏蔽版本。 社会安全号码(SSNs)仍然完全屏蔽,仅向非欧盟客户提供。
| first_name | 已获得同意 | 电子邮件 | ssn_number |
|---|---|---|---|
| John | 正确 | john.doe@example.com | ***-**-**** |
| Jane | 假 | j***@example.com | ***-**-**** |
| 爱丽丝 | 正确 | alice.j@example.com | ***-**-**** |
| 鲍勃 | 假 | b***@example.com | ***-**-**** |
| 查理 | 正确 | charlie.d@example.com | ***-**-**** |
| 艾米丽 | 假 | e***@example.com | ***-**-**** |
| 弗兰克 | 正确 | frank.m@example.com | ***-**-**** |
| 恩典 | 正确 | grace.w@example.com | ***-**-**** |
| 汉克 | 假 | h***@example.com | ***-**-**** |
| 常春藤 | 正确 | ivy.taylor@example.com | ***-**-**** |
总结
本教程演示了三种 ABAC 模式:
- 行筛选:根据受控标签匹配的列值隐藏行
- 列掩码:屏蔽受治理标记匹配的列
-
条件掩码:基于同一行另一列的值,通过标记上下文列并通过
USING COLUMNS将其传递给UDF,对列进行屏蔽。
清理
若要删除在本教程中创建的所有对象,请运行以下命令。 如果跳过了条件电子邮件掩码步骤,则 DROP POLICY mask_email_by_consent_policy 和 DROP FUNCTION mask_email_by_consent 语句将失败,这是预期的。
DROP POLICY hide_eu_customers ON SCHEMA abac_tutorial.customers;
DROP POLICY redact_ssn_policy ON SCHEMA abac_tutorial.customers;
DROP POLICY mask_email_by_consent_policy ON SCHEMA abac_tutorial.customers;
DROP FUNCTION IF EXISTS abac_tutorial.customers.is_not_eu_address;
DROP FUNCTION IF EXISTS abac_tutorial.customers.redact_ssn;
DROP FUNCTION IF EXISTS abac_tutorial.customers.mask_email_by_consent;
DROP TABLE IF EXISTS abac_tutorial.customers.profiles;
DROP SCHEMA IF EXISTS abac_tutorial.customers CASCADE;
要删除pii和consent控制的标签,请使用目录资源管理器 UI。