教程:使用 SQL 配置 ABAC

本教程介绍如何使用 SQL 在 Unity 目录中配置行筛选器和列掩码 ABAC 策略。 有关基于目录资源管理器 UI 的版本,请参阅 教程:配置 ABAC

在此示例中,分析团队无法访问欧盟客户记录,并且始终屏蔽 SSN。 同意数据共享的客户会显示完整的电子邮件。 其他人仅看到屏蔽的版本。

本教程包括以下步骤:

  1. 创建受治理的标记
  2. 创建 Unity Catalog 目录、模式和表
  3. 将受治理的标记应用于列
  4. 创建 UDF 以检测欧盟地址
  5. 创建行筛选器策略
  6. 测试行筛选器
  7. 创建用于屏蔽 SSN 的 UDF
  8. 创建列掩码策略
  9. 测试列掩码

完成这些步骤后,可以选择使用条件电子邮件掩码扩展教程(步骤 10-12)。

先决条件

  • Databricks Runtime 16.4 或更高版本,或无服务器计算。
  • 帐户管理员或工作区管理员权限(用于创建受管理标记)。
  • MANAGE 目标目录或架构的权限。
  • EXECUTE 在 UDF 上下功夫。

运行较旧运行时的计算无法访问 ABAC 保护的表。

步骤 1:创建受管理标记

受治理的标记 是在帐户级别定义的键值对。 ABAC 策略使用它们来发现要筛选或掩码的列。 在本教程中,将创建两个受治理的标记:

  • 包含三个 pii 允许值的标记: ssnaddressemail
  • consent仅限键的标记(没有允许的值)用于标识同意列

若要创建受管理标记,必须在帐户级别具有受管理标记 CREATE 权限。 默认情况下,帐户和工作区管理员具有创建权限。

  1. 在 Azure Databricks 工作区中,单击 Data icon.Catalog
  2. 单击 “盾牌”图标。“治理 ”按钮。
  3. 在下拉菜单中,单击“受管标记”。
  4. 单击“ 创建受管理标记”。
  5. 对于标记键,请输入 pii
  6. 为受治理的标签输入说明。
  7. 对于允许的值,请输入: ssnaddressemail。 只能将这些值分配给此标记键。
  8. 单击 “创建”
  9. 重复步骤 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_numberhome_addressemail列标记为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 如果地址包含 EUE.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)的客户可以查看完整的电子邮件地址,而其他人只能看到电子邮件地址的第一个字符和域名。

此 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_policyDROP 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;

要删除piiconsent控制的标签,请使用目录资源管理器 UI。