1

我能够使用以下内容为顶级键的 json 列创建数据屏蔽策略,但无法找到更深层的 json。有人做过吗?

CREATE OR REPLACE MASKING POLICY json_mask_test AS
(val variant) returns variant ->
CASE
WHEN invoker_role()='ADMIN' THEN val
ELSE object_insert(
     object_insert(
     object_insert(val, 'pii_field', '***', true),
         'address','***', true),
         'lastName','***', true)
END

Ifobject_insert是在 json 字段上创建屏蔽策略的唯一方法,看起来它仅限于顶级键。

我正在使用On Variant Data的示例

同样作为副作用,当原始字段中不存在键时,此策略会将键插入 json 字段。能够消除这一点将是可取的。

编辑:

我在上面的例子中使用了这个 json {"regular_field": "regular data", "pii_field": "pii data"}

我试图在 json 中屏蔽 LastNames,如下所示

'{"root":[{"employees":[
   {"firstName":"John", "lastName":"Doe"},
   {"firstName":"Anna", "lastName":"Smith"},
   {"firstName":"Peter", "lastName":"Jones"}
]}]}'
4

2 回答 2

0

在上面的例子中,我们创建视图来扁平化 json 字段以供消费。

为了满足要求,可以对视图应用屏蔽策略。

查看定义:

CREATE OR REPLACE VIEW v_json_mask AS 
SELECT n.value:firstName::string firstName, n.value:lastName::string lastName
FROM json_test,
lateral flatten (input => v:root) r,
lateral flatten (input => r.value) e,
lateral flatten (input => e.value) n

我为姓氏屏蔽创建了另一个屏蔽策略并应用于视图

CREATE OR REPLACE MASKING POLICY lastName_mask AS
(lastName text) returns text ->
CASE
WHEN invoker_role()='ADMIN' THEN lastName
ELSE '*masked*'
END;

ALTER VIEW v_json_mask MODIFY COLUMN lastName SET MASKING POLICY lastName_mask;

SELECT * FROM v_json_mask以屏蔽策略返回中未指定的任何角色运行

FIRSTNAME   LASTNAME
John        *masked*
Anna        *masked*
Peter       *masked*
于 2020-07-23T16:44:11.570 回答
0

这也有效,并且是在 Snowflake 创建数据屏蔽策略之前屏蔽数据的推荐做法。只需使用 RBAC 来控制对 JSON 表的访问并使用安全视图。

CREATE OR REPLACE SECURE VIEW v_json_mask AS 
SELECT n.value:firstName::string firstName, 
       CASE WHEN current_role()='ADMIN' THEN n.value:lastName::string
            ELSE '*masked*'
       END as lastName
FROM json_test,
lateral flatten (input => v:root) r,
lateral flatten (input => r.value) e,
lateral flatten (input => e.value) n
于 2020-07-23T18:01:55.607 回答