Snowflake Dynamic Masking 屏蔽了所有角色的列,包括我未屏蔽的角色

Posted

技术标签:

【中文标题】Snowflake Dynamic Masking 屏蔽了所有角色的列,包括我未屏蔽的角色【英文标题】:Snowflake Dynamic Masking masks the column for all roles including the one I have unmasked 【发布时间】:2020-07-17 01:19:55 【问题描述】:

我能够成功创建屏蔽策略并将其应用于表中的列。但是,该列最终被所有角色屏蔽,包括我取消屏蔽该列的角色。我写的代码见下文。 PII_ROLE 不应看到表中的屏蔽值,但该角色也可以看到屏蔽值。任何帮助我找出错误所在的帮助将不胜感激:

CREATE or replace masking policy masking_policies.ddm_policies.email_mask AS (val string) 
returns string ->

CASE 
        WHEN current_role() IN ('PII_ROLE') THEN val    
        ELSE '*MASKED*'
END;

【问题讨论】:

【参考方案1】:

您在 when 子句中输入的条件似乎失败,这可能与您指定的角色名称 PII_ROLE 不匹配。检查它是否应该是正确的名称。这是一个小型 POC,您可以使用它来验证您的步骤。

//Start of the POC 

use role accountadmin; //You can set any role that you want
 
create or replace database mydbtest;
use schema public;

create or replace table pinfo

(   FirstName  varchar(20),
    LastName   varchar(20),
    email      varchar(50) 
);

insert into pinfo values 
('Sarah', 'Janes','sarah.janes@hotmail.com'),
('Richard', 'Hays','richard.hays@gmail.com'),
('Maria', 'Khan','maria.khan@wow.com');

// masking policy to mask email column. Only ACCOUNTADMIN role can see the actual values
// all other will see the masked

create or replace masking policy email_mask as (val string) returns string ->
  case
    when current_role() in ('ACCOUNTADMIN') then val
    else '*MASKED*'
  end;
// Modify table and apply the policy   
alter table pinfo modify column email set masking policy email_mask;
// Query table you will see actual values in email column  
select * from pinfo;

// Now grant object access to role public
grant usage on database mydbtest to public;
grant usage on schema mydbtest.public to public;
grant select on pinfo to public;

// Set the role to public
use role public;
use schema public;
// Now Query table you will see the masked values in email column
select * from pinfo;
[Masked Values][1]
//Change the role back to ACCOUNTADMIN
use role accountadmin;
// You will see the actual values    
select * from pinfo;
[Actual Values][2]

【讨论】:

我今天解决了!我写的代码很好。我需要将该角色应用于 SYSADMIN 以外的用户。我创建了一个新用户,分配了角色,一切都很完美。新的动态数据屏蔽非常简单。我只是没有意识到管理员角色具有“最严格的类型安全性”,这就是它需要新用户/角色的原因。

以上是关于Snowflake Dynamic Masking 屏蔽了所有角色的列,包括我未屏蔽的角色的主要内容,如果未能解决你的问题,请参考以下文章

Azure SQL Database (23) Azure SQL Database Dynamic Data Masking动态数据掩码

Bit Masking

[LeetCode] Masking Personal Information 给个人信息打码

Unity Shader------遮罩反射(Masking Reflection)

Matplotlib masking - 根据当前颜色值重置像素的 zorder?

检测车道线——2.选择兴趣区域 Region Masking