共享受策略保护的数据

数据共享使用者可以使用共享数据库角色来访问受掩码策略或行访问策略保护的共享数据。

概述

数据共享提供商可以共享数据库角色,以使数据共享使用者能够访问受策略保护的数据。提供商定义策略来调用 IS_DATABASE_ROLE_IN_SESSION 函数,以评估共享数据库角色或包含数据库角色的映射表列。这样会为提供商提供更多数据共享选项,并且允许使用者访问提供商提供的敏感数据。

提供商可以选择在单个数据库或不同数据库中对策略和共享对象进行分组。如果策略和受保护的表位于不同的数据库中,提供商必须执行以下操作:

  • 两个 数据库共享给使用者账户。

  • 在与受保护表相同的数据库中创建数据库角色。

  • 向包含受保护表的共享授予数据库角色。

当使用者从共享中创建数据库时,共享中的数据库角色将被授予从共享中创建数据库的角色。这样一来,使用者账户中的账户角色就能满足指定数据库角色的策略条件,且能访问共享数据。

要访问受策略保护的共享数据,使用者必须指定包含共享数据库角色的数据库,使共享数据库角色在当前会话中处于活动状态。在这种情况下,使数据库角色处于活动状态意味着数据库角色在用户当前角色的角色层次结构中可用。如果不指定此共享数据库,使用者账户中的用户就无法访问受策略保护的共享数据。您可以使用以下任一选项指定此数据库:

  • 使用 USE <object> 命令在会话中激活数据库,或在工作表中选择数据库。例如:

    USE DATABASE mounted_db;
    
    Copy

    其中,mounted_db 是使用者通过共享创建的数据库名称。

  • 对于特定查询,请使用与数据库角色在同一数据库中的对象的完全限定名称。例如:

    SELECT * FROM mounted_db.myschema.mytable;
    
    Copy

调用函数

在 IS_DATABASE_ROLE_IN_SESSION 函数中可以通过两种不同的方式来指定实参:字符串字面量或非字面量(即列名)。

  • 在 IS_DATABASE_ROLE_IN_SESSION 函数中 以字符串的形式指定数据库角色 时,函数的调用结果取决于函数的调用方式。例如:

    • 在工作表中,Snowflake 会查看会话使用的数据库或查询中指定的数据库。此数据库适用于提供商账户和使用者账户。

    • Snowflake 使用策略、UDF 或视图查看 包含受保护对象 的数据库。当这些对象非共享,并且数据库角色在不同的数据库中定义时,函数的计算结果为 False

  • 在 IS_DATABASE_ROLE_IN_SESSION 函数中 以实参的形式指定列名

    • 如果表查询调用该函数,则该列会映射到包含该列的表的表标识符。然后,Snowflake 会查看包含该表的数据库中的数据库角色。例如,将 AUTHZ_ROLE(即授权角色)列指定为实参:

      SELECT * FROM mydb.myschema.t WHERE IS_DATABASE_ROLE_IN_SESSION(AUTHZ_ROLE);
      
      Copy
    • 如果掩码策略、行访问策略或 UDF 调用该函数,则在包含受保护表的数据库中进行查找。

常规工作流程

使用策略中的 IS_DATABASE_ROLE_IN_SESSION 函数共享受策略保护的数据,需要采取与创建策略相同的步骤来调用函数和共享数据。概括如下:

  1. 提供商创建账户角色。

  2. 提供商创建策略,并在表或列上设置策略。

  3. 提供商使用账户角色测试策略。

  4. 提供商创建数据库角色,并使用数据库角色测试策略。

  5. 提供商创建共享并向共享授予权限,包括向共享授予数据库角色。

  6. 使用者从共享创建数据库(即 挂载数据库)。

  7. 使用者查询受策略保护的共享对象。

示例:同一数据库中的所有对象

在本示例中,数据库角色、掩码策略和受保护的表都位于名为 mydb 同一数据表中。

参考:

  • 数据库角色是 analyst_dbrolesupport_dbrole

  • 掩码策略定义如下:

    CREATE OR REPLACE MASKING POLICY mydb.policies.email_mask
      AS (val string) RETURNS string ->
      CASE
        WHEN IS_DATABASE_ROLE_IN_SESSION('ANALYST_DBROLE')
          THEN val
        WHEN IS_DATABASE_ROLE_IN_SESSION('SUPPORT_DBROLE')
          THEN REGEXP_REPLACE(val,'.+\@','*****@')
        ELSE '********'
      END
      COMMENT = 'use database role for shared data'
      ;
    
    Copy
  • EMAIL 列位于名为 mydb.tables.empl_info 的表中,掩码策略已在此列上设置。

完成以下步骤以共享数据库 mydb,并允许使用者使用共享数据库角色查询受共享掩码策略保护的共享数据。这些步骤假定提供商已经使用账户角色和数据库角色测试了 EMAIL 列上的掩码策略。

  1. 在提供商账户中,执行 CREATE SHARE 命令,为分析师数据库角色创建共享:

    USE ROLE r1;
    CREATE SHARE analyst_share;
    
    Copy
  2. 为共享授予权限。每个共享都需要相同的权限:

    USE ROLE r1;
    GRANT USAGE ON DATABASE mydb TO SHARE analyst_share;
    GRANT USAGE ON SCHEMA mydb.policies TO SHARE analyst_share;
    GRANT USAGE ON SCHEMA mydb.tables TO SHARE analyst_share;
    GRANT SELECT ON TABLE mydb.tables.empl_info TO SHARE analyst_share;
    GRANT DATABASE ROLE analyst_dbrole TO SHARE analyst_share;
    
    Copy
  3. 将使用者账户添加到共享中:

    ALTER SHARE analyst_share ADD ACCOUNTS = consumer_account;
    
    Copy
  4. 在使用者账户中,创建账户角色 r1 并授予该角色导入共享的权限:

    USE ROLE ACCOUNTADMIN;
    CREATE ROLE r1;
    
    GRANT USAGE ON WAREHOUSE my_warehouse TO ROLE r1;
    GRANT CREATE DATABASE ON ACCOUNT TO ROLE r1;
    GRANT IMPORT SHARE ON ACCOUNT TO ROLE r1;
    GRANT ROLE r1 TO ROLE ACCOUNTADMIN;
    
    Copy
  5. 导入共享:

    USE ROLE r1;
    CREATE DATABASE mounted_db FROM SHARE provider_account.analyst_share;
    
    Copy
  6. 验证数据库角色是否在会话中:

    USE DATABASE mounted_db;
    USE SCHEMA mounted_db.tables;
    
    SELECT IS_DATABASE_ROLE_IN_SESSION('ANALYST_DBROLE');
    
    Copy

    SELECT 语句应该返回 True

  7. 查询受保护的表:

    SELECT * FROM empl_info;
    
    Copy

    SELECT 语句应返回未掩码的电子邮件地址。

  8. 将数据库角色授予账户角色,这样具有这些角色的用户就可以根据掩码策略定义查询受保护的表并查看数据。

    重复上述两个步骤后,被授予 support_dbrole 数据库角色的用户应该可以看到部分掩码的电子邮件地址。

示例:不同数据库中的掩码策略和受保护的数据

当策略和受保护的表位于不同的数据库中时,必须与使用者共享这两个数据库。

例如:

  • mydb1 包含掩码策略和 analyst_dbrole 数据库角色。您必须将表和数据库角色归入相同的数据库。

  • mydb2 包含名为 mydb2.tables.empl_info 的表,其中包含 EMAIL 列。掩码策略已在此列上设置。

在创建共享、向共享授予权限和向共享授予数据库角色方面,提供商遵循与上例相同的过程。

使用者从共享中创建数据库的步骤与上例相同。但是,使用者必须使用包含受保护表的数据库,才能激活数据库角色。然后,使用者可以通过指定表的完全限定名称来查询受保护的表。

  1. 在提供商账户中,执行 CREATE SHARE 命令,为每个数据库创建共享:

    USE ROLE r1;
    CREATE SHARE analyst_policy_share;
    CREATE SHARE analyst_table_share;
    
    Copy
  2. 向名为 analyst_policy_share 的共享授予权限:

    USE ROLE r1;
    GRANT USAGE ON DATABASE mydb1 TO SHARE analyst_policy_share;
    GRANT USAGE ON SCHEMA mydb1.policies TO SHARE analyst_policy_share;
    
    Copy
  3. 向名为 analyst_table_share 的共享授予权限:

    USE ROLE r1;
    GRANT USAGE ON SCHEMA mydb2.tables TO SHARE analyst_table_share;
    GRANT SELECT ON TABLE mydb2.tables.empl_info TO SHARE analyst_table_share;
    GRANT DATABASE ROLE analyst_dbrole TO SHARE analyst_table_share;
    
    Copy
  4. 将使用者账户添加到共享中:

    ALTER SHARE analyst_policy_share ADD ACCOUNTS = consumer_account;
    ALTER SHARE analyst_table_share ADD ACCOUNTS = consumer_account;
    
    Copy
  5. 在使用者账户中,创建账户角色 r1 并授予该角色导入共享的权限:

    USE ROLE ACCOUNTADMIN;
    CREATE ROLE r1;
    
    GRANT USAGE ON WAREHOUSE my_warehouse TO ROLE r1;
    GRANT CREATE DATABASE ON ACCOUNT TO ROLE r1;
    GRANT IMPORT SHARE ON ACCOUNT TO ROLE r1;
    GRANT ROLE r1 TO ROLE ACCOUNTADMIN;
    
    Copy
  6. 导入每个共享:

    USE ROLE r1;
    CREATE DATABASE mounted_db1 FROM SHARE provider_account.analyst_policy_share;
    CREATE DATABASE mounted_db2 FROM SHARE provider_account.analyst_table_share;
    
    Copy
  7. 验证数据库角色是否在会话中:

    USE DATABASE mounted_db2;
    USE SCHEMA mounted_db2.tables;
    
    SELECT IS_DATABASE_ROLE_IN_SESSION('ANALYST_DBROLE');
    
    Copy

    SELECT 语句应该返回 True

  8. 查询受保护的表:

    SELECT * FROM mounted_db2.tables.empl_info;
    
    Copy

    SELECT 语句应返回未掩码的电子邮件地址。

示例:无映射表的行访问策略

在本示例中,行访问策略调用 IS_DATABASE_ROLE_IN_SESSION 函数来查找 authz_role (授权角色)列中的角色名称。在包含受保护表的数据库中查找非字面语法和该函数。

创建策略:

CREATE OR REPLACE ROW ACCESS POLICY rap_authz_role AS (authz_role string)
RETURNS boolean ->
IS_DATABASE_ROLE_IN_SESSION(authz_role);
Copy

将策略添加到表中:

ALTER TABLE allowed_roles
  ADD ROW ACCESS POLICY rap_authz_role ON (authz_role);
Copy

如掩码策略示例所示,提供商可以选择在单个数据库或多个数据库中共享对象。使用者可遵循相同的过程从提供商提供的每个数据库的共享中创建数据库。

示例:具有映射表的行访问策略

在本示例中,行访问策略调用 IS_DATABASE_ROLE_IN_SESSION 函数,从名为 role_name 的映射表列中查找授权角色。在包含受保护表的数据库中查找非字面语法和该函数。在这种情况下,映射表必须与受保护表位于相同的数据库。创建策略后,将策略添加到包含 authz_role 列的表中。

创建策略:

CREATE OR REPLACE ROW ACCESS POLICY rap_authz_role_map AS (authz_role string)
RETURNS boolean ->
EXISTS (
  SELECT 1 FROM mapping_table m
  WHERE authz_role = m.key AND IS_DATABASE_ROLE_IN_SESSION(m.role_name)
);
Copy

将策略添加到表中:

ALTER TABLE allowed_roles
  ADD ROW ACCESS POLICY rap_authz_role_map ON (authz_role);
Copy

如掩码策略示例所示,提供商可以选择在单个数据库或多个数据库中共享对象。使用者可遵循相同的过程从提供商提供的每个数据库的共享中创建数据库。

语言: 中文