如何对具有多层和/或数组的Json对象使用动态数据屏蔽

时间:2020-07-21 01:37:00

标签: snowflake-cloud-data-platform snowflake-data-masking

我能够使用以下内容为顶级键的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

如果object_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"}
]}]}'

2 个答案:

答案 0 :(得分: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;

以{mask}未指定的任何角色运行SELECT * FROM v_json_mask

FIRSTNAME   LASTNAME
John        *masked*
Anna        *masked*
Peter       *masked*

答案 1 :(得分: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