教程:配置 ABAC

重要

此功能在 Beta 版中。

本教程介绍如何在 Unity 目录中配置行筛选器和列掩码基于属性的访问控制(ABAC)策略。

在此示例中,美国分析团队不应能够访问欧盟客户记录或 SSN,但是他们应该能够访问同一表中的其他客户和客户数据。 本教程包括以下内容:

  1. 启用标记策略和 ABAC 测试版
  2. 创建标记策略
  3. 创建 Unity Catalog 目录、模式和表
  4. 将受治理的标记应用于列
  5. 创建 UDF 以隐藏欧盟成员的数据
  6. 创建行筛选器策略
  7. 创建用于隐藏 SSN 的 UDF
  8. 创建列掩码策略
  9. 按照策略选择您的表格

步骤 1:启用标记策略和 ABAC Beta 版

  1. 作为帐户管理员,登录到帐户控制台。

  2. 在边栏中,单击“ 预览”。

  3. 标记策略切换为

  4. 作为工作区管理员,单击 Azure Databricks 工作区顶部栏中的用户名。

  5. 从菜单中选择 预览

  6. “基于属性的访问控制 ”开关设置为 “开”。

步骤 2:创建标记策略

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

  1. 在 Azure Databricks 工作区中,单击 “数据”图标。目录

  2. 在“ 快速访问 ”页上,单击“ 标记策略 > ”按钮。

  3. 单击“ 创建标记策略”。

  4. 输入标记键 pii

  5. 输入标记策略的描述。

  6. 输入标记的允许值: ssnaddress。 只能将这些值分配给此标记键。

    教程:创建标记策略。

  7. 单击 “创建”

重要

可以全局复制标记数据。 请勿使用可能损害资源安全性的标记名称或值。 例如,不要使用包含个人信息或敏感信息的标记名称。

步骤 3:创建客户表

若要执行这些步骤,您必须在 Unity Catalog 元存储上拥有 CREATE CATALOG 权限。 您可以在您有权限的 CREATE TABLE 架构中创建表。

  1. 在边栏中,单击“+ 新建”“笔记本”>
  2. 选择 SQL 作为笔记本语言。
  3. 单击“连接”并将笔记本附加到计算资源
  4. 将以下命令添加到笔记本并运行它们:
-- Create catalog (if not already exists)
CREATE CATALOG IF NOT EXISTS abac;
USE CATALOG abac;

-- Create schema
CREATE SCHEMA IF NOT EXISTS customers;
USE SCHEMA customers;

-- Create table
CREATE TABLE IF NOT EXISTS profiles (
    First_Name STRING,
    Last_Name STRING,
    Phone_Number STRING,
    Address STRING,
    SSN STRING
)
USING DELTA;

-- Insert data
INSERT INTO profiles (First_Name, Last_Name, Phone_Number, Address, SSN)
VALUES
('John', 'Doe', '123-456-7890', '123 Main St, NY', '123-45-6789'),
('Jane', 'Smith', '234-567-8901', '456 Oak St, CA', '234-56-7890'),
('Alice', 'Johnson', '345-678-9012', '789 Pine St, TX', '345-67-8901'),
('Bob', 'Brown', '456-789-0123', '321 Maple St, FL', '456-78-9012'),
('Charlie', 'Davis', '567-890-1234', '654 Cedar St, IL', '567-89-0123'),
('Emily', 'White', '678-901-2345', '987 Birch St, WA', '678-90-1234'),
('Frank', 'Miller', '789-012-3456', '741 Spruce St, WA', '789-01-2345'),
('Grace', 'Wilson', '890-123-4567', '852 Elm St, NV', '890-12-3456'),
('Hank', 'Moore', '901-234-5678', '963 Walnut St, CO', '901-23-4567'),
('Ivy', 'Taylor', '012-345-6789', '159 Aspen St, AZ', '012-34-5678'),
('Liam', 'Connor', '111-222-3333', '12 Abbey Street, Dublin, Ireland EU', '111-22-3333'),
('Sophie', 'Dubois', '222-333-4444', '45 Rue de Rivoli, Paris, France Europe', '222-33-4444'),
('Hans', 'Müller', '333-444-5555', '78 Berliner Str., Berlin, Germany E.U.', '333-44-5555'),
('Elena', 'Rossi', '444-555-6666', '23 Via Roma, Milan, Italy Europe', '444-55-6666'),
('Johan', 'Andersson', '555-666-7777', '56 Drottninggatan, Stockholm, Sweden EU', '555-66-7777');

步骤 4:将受治理的标记添加到 PII 列

  1. 将以下命令添加到笔记本并运行它:
-- Add the governed tag to ssn column
ALTER TABLE abac.customers.profiles
ALTER COLUMN SSN
SET TAGS ('pii' = 'ssn');

-- Add governed tag to address column
ALTER TABLE abac.customers.profiles
ALTER COLUMN Address
SET TAGS ('pii' = 'address');

步骤 5:创建 UDF 以查找欧盟地址

  1. 将以下命令添加到笔记本并运行它:
-- Determine if an address is not in the EU
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
);

此 UDF 检查给定字符串是否未显示引用欧洲或欧盟。 如果找到这些子字符串中的任何一个,则返回 FALSE(这意味着它是欧盟地址)。 如果未找到任何子字符串,则返回 TRUE(这意味着它不是欧盟地址)。

步骤 6:创建行筛选器策略

  1. 单击 “数据”图标。目录

  2. abac目录旁边,单击烤肉串菜单 Kebab 菜单图标。

  3. 单击在目录资源管理器中打开

  4. 单击“策略”选项卡。

  5. 单击“新建策略”。

  6. “常规”中,输入策略的名称 hide_eu_customers 和说明。

  7. 负责人中:

    • “应用于...”中,搜索并选择策略适用的主体。 在此示例中,可以使用组 所有帐户用户
    • 除了……保留为空。

    ABAC 填充了策略。

  8. Type 和 target 中:

    • “策略类型”中,选择 “行筛选器”。
    • 策略目标abac ,选择策略范围的目录。
    • 表级别条件 留空。
  9. Function 中,选择您在 is_not_eu_address 创建的函数 abac.customers

  10. “何时”列旁边,选择 具有标记值

  11. “键”中,选择 pii 并在 “值 ”中选择 address

    ABAC 行筛选器策略已经填充。

  12. 单击“创建策略”。

步骤 7:测试策略

  1. 返回到笔记本并运行以下命令:
SELECT DISTINCT * FROM abac.customers.profiles

仅返回非欧盟居民的数据行。

名字 姓氏 电话号码 地址 社会安全号码
恩典 威尔逊 890-123-4567 852 Elm St, NV 890-12-3456
爱丽丝 约翰生 345-678-9012 789 松树街,德克萨斯州 345-67-8901
常春藤 泰勒 012-345-6789 159 阿斯彭街, AZ 012-34-5678
弗兰克 磨坊主 789-012-3456 741 斯普鲁斯街, WA 789-01-2345
史密斯 234-567-8901 456 橡树街, CA 234-56-7890
John 母鹿 123-456-7890 123 主街, 纽约 123-45-6789
查理 戴维斯 567-890-1234 654 雪松街 伊利诺伊州 567-89-0123
艾米丽 白色 678-901-2345 987 伯奇街, 西澳大利亚州 678-90-1234
汉克 摩尔 901-234-5678 963 核桃街,科罗拉多州 901-23-4567
鲍勃 棕色 456-789-0123 321 枫叶街 佛罗里达州 456-78-9012

可以继续创建列掩码策略。

步骤 8:创建用于屏蔽 SSN 的 UDF

  1. 将以下命令添加到笔记本并运行它:
-- Masks any SSN input by returning a fully masked value
CREATE FUNCTION mask_SSN(ssn STRING)
RETURN '***-**-****' ;

此 UDF 返回完全掩码的 SSN 字符串 ('***-**-****'),

步骤 9:创建列掩码策略

  1. 单击 “数据”图标。目录

  2. abac目录旁边,单击烤肉串菜单 Kebab 菜单图标。

  3. 单击在目录资源管理器中打开

  4. 单击“策略”选项卡。

  5. 单击“新建策略”。

  6. “常规”中,输入策略的名称 mask_ssn 和说明。

  7. 负责人中:

    • “应用于...”中,搜索并选择策略适用的主体。 在此示例中,可以使用组 所有帐户用户
    • 除了……保留为空。

    ABAC 列掩码策略已填充。

  8. Type 和 target 中:

    • 策略类型中,选择 “列掩码”。
    • 策略目标abac ,选择策略范围的目录。
    • 表级别条件 留空。
  9. Function 中,选择您在 mask_SSN 创建的函数 abac.customers

  10. “何时”列旁边,选择 具有标记值

  11. “键”中,选择 pii 并在 “值 ”中选择 ssn

    ABAC 列掩码策略已填充。

  12. 单击“创建策略”。

步骤 10:测试策略

  1. 返回到笔记本并运行以下命令:
SELECT * FROM abac.customers.profiles

SSN 现在返回为 ***-***-***. 仅返回非欧盟居民,因为还启用了行筛选掩码。

名字 姓氏 电话号码 地址 社会安全号码
史密斯 234-567-8901 456 橡树街, CA ***-**-****
爱丽丝 约翰生 345-678-9012 789 松树街,德克萨斯州 ***-**-****
查理 戴维斯 567-890-1234 654 雪松街 伊利诺伊州 ***-**-****
恩典 威尔逊 890-123-4567 852 Elm St, NV ***-**-****
鲍勃 棕色 456-789-0123 321 枫叶街 佛罗里达州 ***-**-****
汉克 摩尔 901-234-5678 963 核桃街,科罗拉多州 ***-**-****
常春藤 泰勒 012-345-6789 159 阿斯彭街, AZ ***-**-****
艾米丽 白色 678-901-2345 987 伯奇街, 西澳大利亚州 ***-**-****
弗兰克 磨坊主 789-012-3456 741 斯普鲁斯街, WA ***-**-****
John 母鹿 123-456-7890 123 主街, 纽约 ***-**-****