0

我有一个原始表,其中包含 json 数据的变体列。有一些普通视图(不是物化视图)和表是使用原始表中的 json 事件创建的。

当角色为 时,在原始表的变量列上使用 UDF 应用屏蔽策略后bi_analyst,我发现了两个问题:

  1. 从基础表派生的表不被bi_analyst角色屏蔽;
  2. 使用基础表派生的视图因bi_analyst角色变为空;

有谁知道为什么会这样?这个动态屏蔽功能不支持基础表上的视图吗?

我想做的是屏蔽底层数据,并且来自它的所有表和视图也被指定的角色屏蔽。处理这些表很容易,因为我也可以对它们应用屏蔽策略。

但是,我对这些观点一无所知。我如何仍然可以访问具有该角色的视图,该角色应该能够看到数据但不能看到敏感列?

UDF 是:

-- JavaScript UDF to mask pii data --
use role ACCOUNTADMIN;

CREATE OR REPLACE FUNCTION full_address_masking(V variant)
  RETURNS variant
  LANGUAGE JAVASCRIPT
  AS
  $$
    if ("detail" in V) {
        if ("latitude" in V.detail) {
            V.detail.latitude = "******";
        }
        if ("longitude" in V.detail) {
            V.detail.longitude = "******";
        }
        if ("customerAddress" in V.detail) {
            V.detail.customerAddress = "******";
        }
    }

    return V;
  $$;

屏蔽政策是:

-- Create a masking policy using JavaScript UDF --
create or replace masking policy json_address_mask as (val variant) returns variant ->
    CASE
      WHEN current_role() IN ('ACCOUNTADMIN') THEN val
      WHEN current_role() IN ('BI_ANALYST') THEN full_address_masking(val)
    ELSE full_address_masking(val)
    END;

对原始数据设置屏蔽策略的 sql 命令是:

-- Set masking policy --
use role ACCOUNTADMIN;
alter table DB.PUBLIC.RAW_DATA 
    modify column EVERYTHING 
    set masking policy json_address_mask;

屏蔽策略应用于变量列EVERYTHING,其数据结构如下所示:

  {
      "detail": {
        "customAddress": "******",
        "id": 1,
        "latitude": "******",
        "longitude": "******"
      },
      "source": "AAA"
    }

导数表是:

create or replace table DB.SCHEMA_A.TABLE_A
as 
select * from DB.PUBLIC.RAW_DATA 
where everything:source='AAA';

grant select on table DB.schema_A.table_A to role bi_analyst;

一个观点是:

create or replace  view DB.SCHEMA_A.VIEW_A  as ( 
select
everything:account::string as account,
everything:detail:latitude::float as detail_latitude,
everything:detail:longitude::float as detail_longitude,
from
DB.PUBLIC.RAW_DATA
where
everything:source::string = 'AAA'

grant select on view DB.SCHEMA_A.VIEW_A to role bi_analyst;

结果是RAW_DATA被屏蔽了,TABLE_A根本不被屏蔽,查询带角色的VIEW_A数据时返回0行。BI_ANALYST

4

2 回答 2

0

@Mike 在他的回答中很好地解释了表格未被掩盖的问题。解决方案可以只是使用受屏蔽策略限制的角色创建派生表。

视图的问题是关于掩码值“******”的类型,它是一个字符串类型,而实际的字段类型latitudelongitude浮点数。创建视图时,我仍然将latitudeandlongitude字段转换为 float 类型:

create or replace  view DB.SCHEMA_A.VIEW_A  as ( 
select
everything:account::string as account,
everything:detail:latitude::float as detail_latitude,
everything:detail:longitude::float as detail_longitude,
from
DB.PUBLIC.RAW_DATA
where
everything:source::string = 'AAA'

将“******”投射到浮动时存在隐藏错误,但雪花仍会继续创建视图。但是当我使用BI_ANALYST角色查询数据时,它返回 0 行。

所以解决方法是将这些字段转换为变体类型:

create or replace  view DB.SCHEMA_A.VIEW_A  as ( 
select
everything:account::string as account,
everything:detail:latitude::variant as detail_latitude,
everything:detail:longitude::variant as detail_longitude,
from
DB.PUBLIC.RAW_DATA
where
everything:source::string = 'AAA'

这并不完美,因为它完全改变了视图的定义,没有一个角色可以获取数据的实际浮点/数字类型,甚至包括accountadmin

于 2020-08-25T10:01:52.503 回答
0

#1 - 当您从具有屏蔽数据的表创建表时,您将获得创建新表的角色可以在屏蔽表中访问的数据。因此,在您的示例中, TABLE_A 具有未屏蔽的数据,因为它是由有权访问它的角色创建的。屏蔽策略不会自动应用于新表。

#2 - 至于 #2,我相信您唯一的问题是您示例中的 JSON 格式不正确,这就是您获得 NULL 值的原因。当我将此 json 修复为以下内容时,它可以使用您发布的相同功能和屏蔽策略正常工作:

{
"detail":{
"latitude": 132034034.00,
"longitude": 12393438583732,
"id": 1,
"customAddress" : "XXX Road, XXX city, UK"
},
"source": "AAA"
}

蒙面结果:

{
  "detail": {
    "customAddress": "XXX Road, XXX city, UK",
    "id": 1,
    "latitude": "******",
    "longitude": "******"
  },
  "source": "AAA"
}
于 2020-08-24T21:44:19.620 回答