【问题标题】:Snowflake: Dynamic Data Masking Impact On query results雪花:动态数据屏蔽对查询结果的影响
【发布时间】:2021-06-04 04:55:10
【问题描述】:

我发现,如果屏蔽列是谓词或 JOIN 的一部分,则针对具有屏蔽策略的表的查询将根据角色返回不同的结果。

以下查询将不返回任何数据:

use role NO_READ_ROLE;

select  * 
from    customer_table
where   ssn = '***-**-0102';

但是如果使用的角色应用了掩码,它会返回结果集。

对于以下查询,仅当角色为 FULL READ(未屏蔽)时才返回结果集:

select  * 
from    customer_table
where   ssn = '100-10-0102';

同样,如果我们在掩码列上进行自联接,则返回的结果将取决于所使用的角色。

select  c1.customer_id
        , c2.first_name
        , c1.ssn
        , c2.ph_no
        , c1.email
from        customer_table c1
        inner join customer_table c2
            on c1.ssn = c2.ssn;

我曾希望/期望优化器将谓词和 JOIN 运算符一视同仁,而不管屏蔽策略的影响。相反,被屏蔽的列似乎也被屏蔽为查询计划的一部分。

根据上述发现,一个好的经验法则似乎是不要将屏蔽列用作谓词和/或 JOIN 的一部分,除非所使用的角色对列具有不受限制的读取访问权限。

在使用屏蔽列作为查询 JOIN 或 WHERE 子句的一部分时,是否有人有任何其他指导?

参考:

https://docs.snowflake.com/en/user-guide/security-column-intro.html#masking-policies-at-query-runtime

在运行时,Snowflake 会重写查询以将屏蔽策略表达式应用于屏蔽策略中指定的列。无论在 SQL 表达式中的何处引用该列,都将屏蔽策略应用于该列,包括:

  • 投影。
  • JOIN 谓词。
  • WHERE 子句谓词。
  • ORDER BY 和 GROUP BY 子句。

谢谢,

【问题讨论】:

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


    【解决方案1】:

    屏蔽将列值转换为适合运行查询的角色的屏蔽值;从角色的角度来看,潜在的价值实际上并不存在。

    如果不是这种情况,那么掩蔽将毫无意义。例如,我可以写一个这样的存储过程(伪代码):

    for n= 1 to 999999999
        select  c1.customer_id
                , c1.ssn
                , c1.email
                , n
        from customer_table c1
        where c1.ssn = n
    
    next n
    

    这将允许我列出每个客户的 ssn,绕过屏蔽政策。

    我不确定您在寻找什么指导,您只需要了解编写查询时的行为即可。

    【讨论】:

    • 谢谢尼克。完全同意这将允许窥探用户强行捕获被屏蔽的数据。我的总体看法似乎是,任何不能明确访问数据的角色都不应该在 JOIN 或 WHERE 谓词中包含被屏蔽的列。那么挑战......我们如何防止分析师将这些被屏蔽的属性包含在选择列表之外的任何内容中?只要角色不返回 NULL,就可以对满足 JOIN 运算符的列应用哈希。
    猜你喜欢
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2020-11-29
    相关资源
    最近更新 更多