了解列级安全性¶
本主题总体概述了列级安全性,并描述了动态数据掩码和 External Tokenization 所共有的功能和支持。
要了解有关使用带有标签的掩码策略的更多信息,请参阅 基于标签的掩码策略。
什么是列级安全性?¶
Snowflake 中的列级安全性允许将掩码策略应用到表或视图中的列。目前,列级安全性包括两个功能:
动态数据掩码是一种列级安全功能,它使用掩码策略在查询时有选择地对表和视图列中的纯文本数据进行掩码处理。
通过 External Tokenization,账户能够在将数据加载到 Snowflake 之前对数据进行标记化,并在查询运行时对数据进行去标记化。令牌化是通过用无法破译的令牌替换敏感数据来移除敏感数据的过程。External Tokenization 使用带有 外部函数 的掩码策略。
什么是掩码策略?¶
Snowflake 支持将掩码策略作为架构级对象,以保护敏感数据免遭未经授权的访问,同时允许授权用户在查询运行时时访问敏感数据。这意味着 Snowflake 中的敏感数据不会在现有表中进行修改(即没有静态掩码)。相反,当用户执行应用掩码策略的查询时,掩码策略条件可确定未经授权的用户是否看到掩码后的数据、部分掩码后的数据、模糊的数据或标记化的数据。掩码策略作为架构级对象还可以灵活选择集中式、分散式或混合管理方法。有关更多信息,请参阅 管理列级安全性 (本主题内容)。
掩码策略可以包括条件和函数,以便在满足这些条件的情况下,在查询运行时时转换数据。策略驱动的方法支持职责分离,允许安全团队定义可以限制敏感数据暴露的策略,即使是对象的所有者(即具有对象 OWNERSHIP 权限的角色,如表或视图),他们通常对底层数据具有完全访问权限。
例如,掩码策略管理员可以实施掩码策略,以便分析人员(即具有自定义 ANALYST 角色的用户)只能查看电话号码的最后四位数字,而不能查看任何社会安全号码,而客户支持代表(即具有自定义 SUPPORT 角色的用户)可以查看用于客户验证的完整电话号码和社会安全号码。
掩码策略由单个 数据类型、一个或多个条件以及一个或多个掩蔽函数组成。
您可以将掩码策略应用于具有相符数据类型的一个或多个表/视图列。例如,您可以为电子邮件地址定义一次策略,然后将其应用于数据库和架构中的数千个电子邮件列。
掩码策略条件可以通过 条件表达式函数 函数和 上下文函数 函数表示,也可以通过查询自定义授权表表示。您可以将上下文函数 INVOKER_ROLE 和 INVOKER_SHARE 分别用于视图和共享。
掩码函数可以是任何内置函数(例如 REGEXP_REPLACE、 SHA2、SHA2_HEX)、 用户定义函数概述 或 编写外部函数 (用于通过 External Tokenization 提供程序进行去令牌化)。
虽然 Snowflake 提供了 安全视图 来限制敏感数据的访问权限,但由于每个视图都有大量视图和衍生的商业智能 (BI) 仪表板,因此安全视图带来了管理挑战。通过避免要管理的视图和仪表板爆炸式增长,掩码策略解决了这一管理难题。
通过策略管理员与对象所有者的角色分离,掩码策略支持职责分离 (SoD)。安全视图没有 SoD,这严重限制了其实用性。这种角色分离导致以下默认设置:
对象所有者(即具有对象的 OWNERSHIP 权限的角色)没有取消设置掩码策略的权限。
对象所有者无法查看应用掩码策略的列数据。
有关管理角色和权限的更多信息,请参阅 管理列级安全性 (本主题内容)和 访问控制权限。
掩码策略如何运作?¶
动态数据掩码和 External Tokenization 的掩码策略采用相同的结构和格式,但有一个值得注意的例外:External Tokenization 的掩码策略需要在掩码策略主体中使用 编写外部函数。
出现此例外的原因是 External Tokenization 需要第三方标记化提供程序在将数据加载到 Snowflake 之前对数据进行标记化。在查询运行时,Snowflake 使用外部函数对标记化提供程序进行 REST API 调用,然后由该提供程序评估标记化策略(在 Snowflake 外部创建),以根据掩码策略条件返回标记化的数据或去标记化的数据。请注意,Snowflake 和令牌化提供程序中必须存在角色映射,以确保可以从给定查询返回正确的数据。
Snowflake 支持使用 CREATE MASKING POLICY 创建掩码策略。例如:
-- Dynamic Data Masking
CREATE MASKING POLICY employee_ssn_mask AS (val string) RETURNS string ->
CASE
WHEN CURRENT_ROLE() IN ('PAYROLL') THEN val
ELSE '******'
END;
-- External Tokenization
CREATE MASKING POLICY employee_ssn_detokenize AS (val string) RETURNS string ->
CASE
WHEN CURRENT_ROLE() IN ('PAYROLL') THEN ssn_unprotect(VAL)
ELSE val -- sees tokenized data
END;
其中:
employee_ssn_mask
动态数据掩码策略的名称。
employee_ssn_detokenize
External Tokenization 策略的名称。
AS (val string) RETURNS string
指定输入和输出数据类型。数据类型必须匹配。
->
将策略签名与其主体分开。
case ... end;
指定掩码策略主体(即 SQL 表达式)条件。
在这两个示例中,如果查询运算符在当前会话中使用 PAYROLL 自定义角色,则该运算符将看到未掩码的值/去标记化的值。否则,会看到固定的掩码值/标记化的值。
ssn_unprotect
对标记化数据进行操作的外部函数。
小技巧
如果您想要更新现有的掩码策略,并需要查看该策略的当前定义,请调用 GET_DDL 函数或运行 DESCRIBE MASKING POLICY 命令。
然后可以使用 ALTER MASKING POLICY 命令更新掩码策略定义。如果在列上设置了掩码策略,则此命令不需要从列中取消设置掩码策略。因此,在更新策略定义时,受策略保护的列仍然受到保护。
有关使用掩码策略的更多详细信息,请参阅:
对表和视图使用列级安全性 (本主题内容)
IS_ROLE_IN_SESSION (对于角色层次结构和角色激活很重要的策略示例)
使用条件列¶
条件掩码使用掩码策略,根据一个或多个不同列中的值,有选择地保护表或视图中的列数据。
使用其他列来确定是否应保护给定列中的数据,让策略管理员(即具有 POLICY_ADMIN
自定义角色的用户)更自由地创建策略条件。
请注意两个代表性策略示例之间的差异:
- 掩码策略:
该策略可用于动态数据掩码。
CREATE MASKING POLICY email_mask AS (val string) RETURNS string -> CASE WHEN CURRENT_ROLE() IN ('PAYROLL') THEN val ELSE '******' END;
该策略仅指定一个实参
val
,它表示包含字符串数据的任何列。此策略可以创建一次,可应用于包含字符串数据的任何列。只有 CURRENT_ROLE 是PAYROLL
自定义角色的用户才能查看列数据。否则,Snowflake 会在查询结果中返回固定的掩码值。有关更多信息,请参阅 CREATE MASKING POLICY。
- 条件掩码策略:
在此示例中,请注意实参
(email varchar, visibility string)
。CREATE MASKING POLICY email_visibility AS (email varchar, visibility string) RETURNS varchar -> CASE WHEN CURRENT_ROLE() = 'ADMIN' THEN email WHEN VISIBILITY = 'PUBLIC' THEN email ELSE '***MASKED***' END;
此策略指定了两个实参
email
和visibility
,这些实参是列名。第一列 总是 指定要进行掩码处理的列。第二列是条件列,用于评估是否应对第一列进行掩码处理。可以指定多个条件列。在此策略中,用户的 CURRENT_ROLE 是ADMIN
自定义角色,该用户可以查看电子邮件地址。如果电子邮件地址的可见性列值为Public
,则该电子邮件地址将在查询结果中可见。否则,Snowflake 将返回一个查询结果,其中包含电子邮件列的固定掩码值。此策略可用于多个表和视图,前提是表或视图中的列结构与策略中指定的列匹配。有关更多信息,请参阅 CREATE MASKING POLICY。
由于每个代表性示例使用相同的对象类型,因此策略的整体行为应该相似,包括但不限于:
查询运行时评估。
实用程序(例如,使用 上下文函数 保护敏感数据)。
权限结构。
使用不同的管理方法来支持职责分离 (SoD)。
- 限制:
除了现有的 掩码策略限制,条件掩码策略还有以下限制:
- 注意事项:
除了现有的一般 掩码策略注意事项,在使用条件掩码策略之前,请评估以下几点:
确保 CREATE MASKING POLICY 语句中指定的所有列都位于同一个表或视图中。
尽量减少策略定义中列实参的数量。Snowflake 必须在查询运行时评估每一列。指定更少的列可以提高整体性能。
通过调用 Information Schema 表函数 POLICY_REFERENCES,跟踪掩码策略中条件列的使用情况。
有关使用条件列设置掩码策略的更多详细信息,请参阅 对列应用条件掩码策略 (本主题内容)。
查询运行时的掩码策略¶
在运行时,Snowflake 重写查询,以便将掩码策略表达式应用到掩码策略中指定的列。无论在 SQL 表达式中的哪个位置引用该列,掩码策略都将应用于该列,包括:
预测。
JOIN 谓词。
WHERE 子句谓词。
ORDER BY 和 GROUP BY 子句。
重要
在 SQL 构造引用相关列的任何位置上会特意应用掩码策略,以防止通过创造性查询包括掩码后的列数据来实现数据的去匿名化。
因此,如果执行查询导致一列或多列中出现掩码后的数据,则查询输出可能无法提供预期值,因为掩码后的数据会阻止在所需上下文中评估所有查询输出数据。
使用嵌套对象的掩码策略:
Snowflake 支持嵌套掩码策略,例如表上的掩码策略和同一个表的视图上的掩码策略。在查询运行时,Snowflake 按以下顺序评估与给定查询相关的所有掩码策略:
适用于表的掩码策略始终首先执行。
在评估表的策略之后执行视图的策略。
如果存在嵌套视图(例如
table_1
»view_1
»view_2
» ...view_n
),策略从左到右按顺序应用。无论查询中的数据存在多少掩码策略,这种模式都会持续下去。下图说明了查询执行者、表、视图和策略之间的关系。
用户查询:
以下示例显示了用户提交的查询,随后是 Snowflake 运行时查询重写,其中掩码策略(即
sql_expression
)仅适用于 email 列。SELECT email, city FROM customers WHERE city = 'San Mateo'; SELECT <SQL_expression>(email), city FROM customers WHERE city = 'San Mateo';
在 WHERE 子句谓词(反模式)中使用受保护列进行查询:
以下示例显示了用户提交的查询,随后是 Snowflake 运行时查询重写,其中掩码策略(即
sql_expression
) 仅适用于比较的一方(例如电子邮件列,但不适用于与电子邮件列进行比较的字符串)。查询的结果 不是 用户预期的结果。仅对比较的一方进行掩码处理是一种常见的反模式。SELECT email FROM customers WHERE email = 'user@example.com'; SELECT <SQL_expression>(email) FROM customers WHERE <SQL_expression>(email) = 'user@example.com';
在 JOIN 谓词(反模式)中使用受保护列进行查询:
SELECT b.email, d.city FROM sf_tuts.public.emp_basic AS b JOIN sf_tuts.public.emp_details AS d ON b.email = d.email; SELECT <SQL_expression>(b.email), d.city FROM sf_tuts.public.emp_basic AS b JOIN sf_tuts.public.emp_details AS d ON <SQL_expression>(b.email) = <SQL_expression>(d.email);
查询运行时注意事项¶
Snowflake 建议,在尝试预测对列应用掩码策略的效果,以及查询运算符是否看到掩码后的数据时,注意以下因素:
- 当前会话:
使用 CURRENT_ROLE 的掩码策略条件。
- 执行角色:
使用 INVOKER_ROLE 的掩码策略条件。
- 角色层次结构:
使用 IS_ROLE_IN_SESSION 和 IS_GRANTED_TO_INVOKER_ROLE 的掩码策略条件。
- 数据共享:
是否使用 Secure Data Sharing 来共享数据。有关详细信息,请参阅 数据共享 (本主题内容)。
- 复制:
请参阅 复制 (本主题内容)。
- 子查询:
掩码策略可以引用策略定义中的子查询,但是 Snowflake 中的子查询支持存在限制。有关更多信息,请参阅 使用子查询。
- 掩码策略中的 UDFs:
确保列的数据类型 UDF 和掩码策略匹配。有关更多信息,请参阅 掩码策略中的用户定义函数 (本主题内容)。
- 搜索优化服务:
搜索优化服务可以提高使用掩码或行访问策略的表的查询性能。
有关详细信息,请参阅 在搜索优化服务中支持具有掩码策略和行访问策略的表。
前三项在 高级列级安全主题 中进行了更详细的解释。数据共享仅适用于动态数据掩码,因为无法在共享上下文中调用外部函数。
最终,具体用例决定动态数据掩码或 External Tokenization 是否最合适。
选择动态数据掩码或 External Tokenization¶
要选择最能满足组织需求的正确功能,请评估数据的主要用例以及相关注意事项和限制。以下两节总结了这两个功能之间的优势和局限。
优势¶
下表比较了动态数据掩码和 External Tokenization 的优点。
因素 |
动态数据掩码 |
External Tokenization |
备注 |
---|---|---|---|
去识别化后保留分析值。 |
✔ |
由于标记化为给定的字符集提供了唯一的值,因此可以按标记化的值对记录进行分组,而不会泄露敏感信息。 例如,按诊断代码对医疗记录进行分组,并对患者诊断代码进行标记化。然后,数据分析人员可以查询诊断代码的视图,以获取具有唯一诊断代码的患者数量。 |
|
预加载标记化数据。 |
✔ |
未经授权的用户永远看不到真正的数据值。需要第三方令牌化提供程序。 |
|
预加载未进行掩码的数据。 |
✔ |
只需内置 Snowflake 功能,无需第三方。 |
|
数据共享。 |
✔ |
有关详细信息,请参阅 数据共享 (本主题内容)。 |
|
易于使用和变更管理。 |
✔ |
✔ |
编写一次策略并将其应用于数据库和架构中的数千个列。 |
数据管理和 SoD。 |
✔ |
✔ |
安全或隐私官决定保护哪些列,而不是对象所有者决定。 掩码策略易于管理并支持集中式和分散式管理模型。 |
数据授权和治理。 |
✔ |
✔ |
|
按角色或自定义权利访问上下文数据。 |
✔ |
✔ |
支持安全或隐私官实施的数据治理,并可以禁止拥有 ACCOUNTADMIN 或 SECURITYADMIN 系统角色的授权用户在不必要的情况下查看数据。 |
数据库复制和账户对象复制。 |
✔ |
✔ |
请参阅:复制 (本主题内容)。 |
限制¶
下表描述了列级安全性的当前限制。复选标记(即 ✔)表示该功能存在限制或当前缺乏支持。
限制 |
动态数据掩码 |
External Tokenization |
备注 |
---|---|---|---|
物化视图 (MV)。 |
✔ |
✔ |
有关完整摘要,请参阅 物化视图 (本主题内容)。 |
✔ |
✔ |
在删除策略之前,请使用 ALTER TABLE ...ALTER COLUMN 或 ALTER VIEW 命令从表或视图列中取消设置策略。 |
|
✔ |
✔ |
删除数据库或架构要求掩码策略及其映射在数据库或架构中是独立的。 例如, |
|
外部表。 |
✔ |
✔ |
无法将外部表作为查找表(即在子查询中)引用,以确定是否应对列值进行掩码处理。有关更多信息,请参阅 外部表 (本主题内容) |
策略定义的输入和输出中的不同数据类型。 |
✔ |
✔ |
掩码策略定义的输入和输出必须具有相同的数据类型。换句话说,作为代表性示例,不能将输入数据类型定义为时间戳并返回字符串。 |
掩码策略变更管理。 |
✔ |
✔ |
可以选择在所选的版本控制系统中存储和跟踪掩码策略更变更 。 |
未来授权。 |
✔ |
✔ |
不支持对掩码策略进行 未来授权。 为解决此问题,请向自定义角色授予 APPLY MASKING POLICY 权限,以允许该角色对表或视图列应用掩码策略。 |
注意事项¶
将值从对源列具有掩码策略的源列插入到对目标列没有掩码策略的目标列时,请务必小心。由于在源列上设置了掩码策略,因此查看未掩码列数据的角色可以将未掩码数据插入到另一列中,其中任何对表或视图具有足够权限的角色都可以看到该值。
如果在源列中看到掩码后的数据的角色将这些值插入到目标列中,则插入的值将保持已掩码状态。如果未在目标列上设置掩码策略,则对表或视图具有足够权限的用户可能会在目标列中看到掩码后的值和未掩码的值的组合。因此,作为最佳实践:
对列应用掩码策略时请务必小心。
在将表和视图提供给用户之前,请使用具有掩码策略的列验证查询。
确定可能出现源列中数据的其他表和视图(即目标列)。
有关更多信息,请参阅 获取具有掩码策略的列 (本主题内容)。
当带有版本控制的架构中存在掩码策略时,为 Snowflake Native App 创建设置脚本时需谨慎。有关详细信息,请参阅 版本架构注意事项。
在表和视图上使用列级安全性¶
Snowflake 支持对表和视图使用掩码策略。下面介绍掩码策略如何影响 Snowflake 中的表和视图。
小技巧
调用 POLICY_CONTEXT 函数,模拟对受掩码策略保护的列、受行访问策略保护的表或视图的查询,或者对这两种策略的查询。
活动角色层次结构和映射表¶
策略条件可以直接评估用户在会话中活跃的主要角色和次要角色,在映射表中查找活跃角色,或者根据策略管理员编写策略的方式来执行这两种操作。如果策略包含映射表查找,请创建一个集中式映射表,并将映射表存储在受保护的表所在的数据库中。如果策略调用 IS_DATABASE_ROLE_IN_SESSION 函数,则这一点尤为重要。有关详细信息,请参阅函数 使用说明。
对于这些用例,Snowflake 建议根据要指定账户角色还是数据库角色,来编写调用 IS_ROLE_IN_SESSION 或 IS_DATABASE_ROLE_IN_SESSION 函数的策略条件。有关示例,请参阅:
IS_ROLE_IN_SESSION 函数中的 示例 部分。
IS_DATABASE_ROLE_IN_SESSION
有关使用上下文函数和掩码策略的其他示例,请参阅 高级列级安全主题。
将掩码策略应用于列¶
当列不受掩码策略保护时,有两个选项可将掩码策略应用于表或视图中的列:
对于 新的 表或视图,请将策略应用于具有 CREATE TABLE 语句的表列或具有 CREATE VIEW 语句的视图列。
对于 现有的 表或视图,请将策略应用于具有 ALTER TABLE ...ALTER COLUMN 语句的表列或具有 ALTER VIEW 语句的视图列。
对于 新的 表或视图,请执行以下语句:
-- table CREATE OR REPLACE TABLE user_info (ssn string masking policy ssn_mask); -- view CREATE OR REPLACE VIEW user_info_v (ssn masking policy ssn_mask_v) AS SELECT * FROM user_info;
对于 现有的 表或视图,执行以下语句:
-- table ALTER TABLE IF EXISTS user_info MODIFY COLUMN ssn_number SET MASKING POLICY ssn_mask; -- view ALTER VIEW user_info_v MODIFY COLUMN ssn_number SET MASKING POLICY ssn_mask_v;
有关语法和用法的更多信息,请参阅 ALTER TABLE ...ALTER COLUMN 和 ALTER VIEW。
如果掩码策略使用 UDF,请参阅 掩码策略中的用户定义函数 (本主题内容)。
对列应用条件掩码策略¶
使用 条件列 创建 掩码策略后,当列尚未受掩码策略保护时,有两个选项可在列上设置条件掩码策略:
对于 新的 表或视图,请将策略应用于具有相应 CREATE 语句的表或视图列。
有关语法和用法的更多信息,请参阅:
对于 新的 表或视图,请执行以下语句:
-- table CREATE OR REPLACE TABLE user_info (email string masking policy email_visibility) USING (email, visibility); --view CREATE OR REPLACE VIEW user_info_v (email masking policy email_visibility) USING (email, visibility) AS SELECT * FROM user_info;
对于 现有的 表或视图,请在具有相应 ALTER 语句的表或视图列上设置策略。
有关语法和用法的更多信息,请参阅:
对于 现有的 表或视图,执行以下语句:
-- table ALTER TABLE IF EXISTS user_info MODIFY COLUMN email SET MASKING POLICY email_visibility USING (EMAIL, VISIBILITY); -- VIEW ALTER VIEW user_info_v MODIFY COLUMN email SET MASKING POLICY email_visibility USING (email, visibility);
替换列上的掩码策略¶
一旦在列上设置了掩码策略,就有两种不同的途径可以用不同的掩码策略替换该列上的掩码策略,而无需替换整个表或视图。
这些示例使用 ALTER TABLE 命令。同样的方法适用于带有 ALTER VIEW 命令的视图:
在一个语句中取消设置表列中的策略,然后在另一语句中对该列设置新策略:
ALTER TABLE t1 MODIFY COLUMN c1 UNSET MASKING POLICY; ALTER TABLE t1 MODIFY COLUMN c1 SET MASKING POLICY p2;
使用
FORCE
关键字来替换单个语句中的策略:ALTER TABLE t1 MODIFY COLUMN c1 SET MASKING POLICY p2 FORCE;
注意:
FORCE
关键字要求 ALTER TABLE 语句中策略的 数据类型 (即 STRING)与当前在该列上设置的掩码策略的数据种类(即 STRING)相匹配。FORCE
关键字可以与USING
子句结合使用,对列设置条件掩码策略:ALTER TABLE t1 MODIFY COLUMN c1 SET MASKING POLICY policy1 USING (c1, c3, c4) FORCE;
重要
替换列上的掩码策略时请务必小心。
根据替换的时间和对列的查询,选择在两个单独的语句中替换策略可能会导致数据泄漏,因为在 UNSET 和 SET 操作之间的时间间隔内,列数据不受保护。
但是,如果替换策略中的策略条件不同,则指定 FORCE
关键字可能导致缺乏访问权限,因为(以前)用户可以访问数据,而替换策略不再允许访问。
在替换策略之前,请咨询内部数据管理员,以协调使用掩码策略保护数据的最佳方法,并根据需要替换掩码策略。
行访问策略¶
给定的表或视图列可以在掩码策略签名或行访问策略签名中指定。换句话说,同一列不能同时在掩码策略签名和行访问策略签名中指定。
此行为也适用于在掩码策略中用作条件列的列。
有关更多信息,请参阅 CREATE MASKING POLICY 和 CREATE ROW ACCESS POLICY。
模拟策略如何运作¶
调用 POLICY_CONTEXT 函数,模拟对受掩码策略保护的列、受行访问策略保护的表或视图的查询,或者对这两种策略的查询。
物化视图¶
Snowflake 允许您在物化视图列上设置掩码策略。在查询运行时,查询计划执行物化视图重写之前存在的任何掩码策略。一旦发生物化视图重写,就无法在任何物化视图列上设置掩码策略。
有两个选项可以在物化视图列上设置掩码策略:
对于 新的 物化视图,请执行 CREATE MATERIALIZED VIEW 语句:
CREATE OR REPLACE MATERIALIZED VIEW user_info_mv (ssn_number masking policy ssn_mask) AS SELECT ssn_number FROM user_info;
对于 现有的 物化视图,请在物化视图上执行 ALTER VIEW ...物化视图上的 MODIFY COLUMN 语句,如 对列应用掩码策略 部分所示(本主题内容)。
此外,关于掩码策略和物化视图还存在以下两个限制:
如果已经从基础表创建了物化视图,则无法在表列上设置掩码策略。完成此尝试后,Snowflake 会返回以下错误消息:
SQL execution error: One or more materialized views exist on the table. number of mvs=<number>, table name=<table_name>.
如果对基础表列设置掩码策略并从该表创建物化视图,则物化视图仅包含不受掩码策略保护的列。如果尝试包括受掩码策略保护的一个或多个列,Snowflake 还会返回以下错误消息:
Unsupported feature 'CREATE ON MASKING POLICY COLUMN'.
小技巧
如果希望对基础表中的列设置掩码策略,请考虑通过基础表创建动态表。有关更多信息,请参阅 增量刷新的其他限制。
动态表¶
您可以使用行访问策略、掩码策略和标签来创建动态表。有关更多信息,请参阅:
获取具有掩码策略的列¶
要获取具有掩码策略的列的列表,请执行以下语句。有关更多信息,请参阅 POLICY_REFERENCES。
SELECT * from table( INFORMATION_SCHEMA.POLICY_REFERENCES( policy_name=>'<policy_name>' ) );
执行 DESCRIBE TABLE 或 DESCRIBE VIEW 语句,以查看表或视图中列的掩码策略。
Object Tagging 和掩码策略¶
有关详细信息,请参阅 基于标签的掩码策略。
请注意,直接分配给列的掩码策略优先于基于标签的掩码策略。
掩码策略中的哈希、密码和加密函数¶
哈希 和 加密/校验 可用于掩码策略,以对敏感数据进行掩码处理。
有关更多信息,请参阅 高级列级安全主题。
外部表¶
使用 CREATE EXTERNAL TABLE 语句 创建 外部表时,不能将掩码策略分配给外部表 VALUE 列,因为默认情况下会自动创建此列。
通过对外部表执行 VALUE 语句,可以将掩码策略分配给外部表 ALTER TABLE ...ALTER COLUMN 列。用于保护 VALUE 列的掩码策略的数据类型必须是 VARIANT。
ALTER TABLE t1 MODIFY COLUMN VALUE SET MASKING POLICY p1;
您可以将掩码策略分配给外部表中的虚拟列,如下所示:
用于保护外部表中 VALUE 列的掩码策略中,将
EXEMPT_OTHER_POLICIES
掩码策略属性设置为TRUE
。如果尚未设置此属性,请对保护 VALUE 列的掩码策略执行 CREATE OR REPLACE 语句,并指定
EXEMPT_OTHER_POLICIES
属性。虚拟列继承保护 VALUE 列的策略,该属性允许虚拟列上的策略替换继承的策略。有关详细信息,请参阅 CREATE MASKING POLICY。使用以下 ALTER TABLE 命令为虚拟列分配不同的掩码策略。此策略可能没有 VALUE 列的策略严格,因为虚拟列不太敏感。虚拟列包含的数据量比 VALUE 列少;VALUE 列包含外部表中每一行的所有数据。
用于保护虚拟列的策略中的数据类型取决于虚拟列的数据类型。
关于掩码策略中的条件列,可以将虚拟列列为条件列实参,以确定是否应进行掩码处理或标记化第一个列实参。但是,无法将虚拟列指定为要进行掩码处理或标记化的第一列。
有关更多信息,请参阅 CREATE MASKING POLICY。
重要
Snowflake 不支持在掩码策略中使用外部表作为查找表(即在子查询中)。克隆数据库时,Snowflake 会克隆掩码策略,但不会克隆外部表。因此,克隆数据库中的策略引用了克隆数据库中不存在的表。
如果外部表中的数据对于策略是必需的,请考虑在完成克隆操作之前,将外部表数据移动到数据库中存在掩码策略的专用架构。更新掩码策略以引用完全限定的表名称,以确保该策略引用克隆数据库中的表。
流¶
表中列的掩码策略会延续到同一个表上的流。
依照掩码策略所定义,结果是未经授权的用户看到掩码后的数据;授权用户创建的流看到正常数据。
克隆对象¶
在访问克隆的对象时,以下方法有助于保护数据免受具有表或视图 SELECT 权限的用户的侵害:
不支持克隆单个策略对象。
克隆架构会导致克隆该架构中的所有策略。
克隆的表会映射到与源表相同的策略。换句话说,如果在基表或其列上设置了策略,则该策略将附加到克隆的表或其列中。
当表在其父架构克隆的上下文中进行克隆时,如果源表引用了同一父架构中的策略(即本地引用),则克隆的表将引用克隆的策略。
如果源表引用了不同架构中的策略(即外部引用),则克隆表会保留外部引用。
有关更多信息,请参阅 CREATE <object> ... CLONE。
CREATE TABLE ...AS SELECT (CTAS) 语句¶
执行 CREATE TABLE ...AS SELECT (CTAS) 语句会对语句中包含的列应用任何掩码策略(即,在新表中对适用的列数据进行掩码处理), 然后 将数据填充到新表中。遵循此流程是因为使用 CTAS 语句创建的表可能具有与源对象不同的列集,并且 Snowflake 无法将掩码策略隐式应用于新表列。
如果需要复制未掩码的数据,请使用受保护数据授权的角色来运行 CTAS 语句。创建新表后,将新表的所有权转让给其他角色,并要求掩码策略管理员将掩码策略应用到新表的列。
有关更多信息,请参阅 CREATE TABLE。
使用聚合函数和掩码列的查询¶
可以对具有掩码数据的列使用 聚合函数。
一个代表性的用例是,数据分析师希望在不需要查看实际数据的情况下获得一列社会保障号码的 COUNT。但是,如果数据分析师在掩码表列上使用 SELECT 运行查询,则查询会返回固定的掩码值。在当前会话中具有 PAYROLL 自定义角色的用户会看到未掩码的数据,而其他所有人都会看到掩码后的数据。
为了实现这一结果,请执行以下操作:
表所有者在包含聚合函数的列上创建视图。
CREATE VIEW ssn_count AS SELECT DISTINCT(ssn) FROM table1;
授予 ANALYST 角色对视图具有完整权限。不要授予分析师对该表的任何权限。
对表列应用掩码策略。请注意,如果视图列上有策略,则表策略始终先于视图策略应用。
CASE WHEN CURRENT_ROLE() IN ('PAYROLL') THEN val ELSE '***MASKED***' END;
对视图列执行查询。
USE ROLE analyst; SELECT COUNT(DISTINCT ssn) FROM v1;
掩码策略中的用户定义函数¶
UDF 可以传递到掩码策略条件中。
确保表或视图列的数据类型、UDF 和掩码策略匹配。如果数据类型不同,例如有一个表列和数据类型为 VARIANT 的 UDF,并且掩码策略(策略条件中包含此 UDF)返回 VARCHAR 数据类型,当在表列上设置此掩码策略时,Snowflake 在对表列进行查询时返回错误。
有关匹配表列、UDF 和掩码策略的数据类型的代表性示例,请参阅 CREATE MASKING POLICY 中的 在 JSON (变体)上使用 JavaScript UDFs 示例。
数据共享¶
- 用途:
如果提供程序将策略分配给共享表或视图,并且策略条件调用 CURRENT_ROLE 或者 CURRENT_USER 函数,或者策略条件调用 安全的 UDF,Snowflake 将为该函数或使用者账户中的 UDF 返回 NULL 值。
原因是共享数据的所有者通常不控制共享表或视图的账户中的用户或角色。为解决此问题,请在策略条件下使用 CURRENT_ACCOUNT 函数。
或者,作为提供商,编写策略条件以调用 IS_DATABASE_ROLE_IN_SESSION 函数并共享数据库角色。作为使用者,请将共享数据库角色授予账户角色。有关详细信息,请参阅 共享受策略保护的数据。
- 限制:
数据共享提供商无法在 阅读者账户 中创建策略。
数据共享使用者无法将策略应用于共享表或视图。为解决此问题,请导入共享数据库并从共享表或视图创建本地视图。
数据共享使用者无法查询引用两个不同提供商的共享表或视图。例如:
rap1
是一个行访问策略,用于保护名为t1
的表,其中t1
位于提供商提供的名为share1
的共享中。rap1
策略条件引用名为t2
的映射表,其中t2
来自share2
和其他提供商。对
t1
的使用者查询失败。t1
的提供商可以查询t1
。
外部函数:
如果出现以下情况,Snowflake 将返回错误:
分配给共享表或视图的策略将更新以调用外部函数。
该策略调用外部函数,并且您尝试将该策略分配给共享表或视图。
备注
对于 External Tokenization,Secure Data Sharing 不适用,因为无法在共享上下文中调用外部函数。
复制¶
可以使用数据库复制和复制组来复制掩码策略及其分配。
对于 数据库复制,如果满足以下任一条件,则复制操作会失败:
主数据库位于企业账户(或更高版本)中,包含策略,但批准复制的一个或多个账户的版本较低。
主数据库中包含的表或视图具有 悬空引用 到其他数据库中的掩码策略。
在 复制组 中复制多个数据库时,可避免数据库复制的悬空引用行为。
查询配置文件¶
当用于具有掩码策略的列时,EXPLAIN 命令输出包括掩码后的数据,而不包括掩码策略主体。
以下示例生成 EXPLAIN 计划,用于查询员工身份号码和社会保障号码表。此示例中的命令以 JSON 格式生成示例。
包含社会安全号码的列具有掩码策略。
EXPLAIN USING JSON SELECT * FROM mydb.public.ssn_record;
{
"GlobalStats": {
"partitionsTotal": 0,
"partitionsAssigned": 0,
"bytesAssigned": 0
},
"Operations": [
[
{
"id": 0,
"operation": "Result",
"expressions": [
"1",
"'**MASKED**'"
]
},
{
"id": 1,
"parent": 0,
"operation": "Generator",
"expressions": [
"1"
]
}
]
]
}
卸载数据¶
使用 COPY INTO <location> 对具有掩码策略的列执行命令会导致掩码策略应用于数据。因此,未经授权的用户在执行命令后会看到掩码后的数据。
Snowflake Native App Framework¶
有关将掩码策略用于 Snowflake Native App 的详细信息,请参阅:
管理列级安全性¶
本节提供了有助于确定掩码策略的整体管理方法的信息,描述了管理列级安全性所需的权限,并列出了支持的 DDL 命令。
选择集中式、混合式或分散式方法¶
为了有效管理动态数据掩码和 External Tokenization 策略,考虑对列中数据进行掩码处理的方法是否应该遵循集中式安全方法、分散式方法或这两种方法的混合会很有帮助。
下表总结了这两种方法的一些注意事项。
策略操作 |
集中管理 |
混合管理 |
分散管理 |
---|---|---|---|
创建策略 |
安全官 |
安全官 |
各个团队 |
将策略应用于列 |
安全官 |
各个团队 |
各个团队 |
作为最佳实践,Snowflake 建议组织聚集所有相关的利益相关者,以确定在环境中实施列级安全性的最佳管理方法。
掩码策略权限¶
本节介绍列级安全掩码策略权限以及它们如何应用于集中式、分散式或混合管理方法。
Snowflake 为列级安全掩码策略提供以下权限。
请注意,对架构中的对象进行操作还需要对父数据库和架构具有 USAGE 权限。
权限 |
用途 |
---|---|
CREATE |
允许在架构中创建新的掩码策略。 |
APPLY |
允许在列上对 掩码策略 执行取消设置和设置操作。 请注意,授予全局 APPLY MASKING POLICY 权限(即 ACCOUNT 上的 APPLY MASKING POLICY)允许对表和视图执行 DESCRIBE 操作。 有关语法示例,请参阅 掩码策略权限。 |
OWNERSHIP |
授予对掩码策略的完全控制权。需要更改掩码策略的大多数属性。同一时间只有一个角色可以在特定对象上拥有此权限。 |
备注
操作掩码策略还需要父数据库和架构的 USAGE 权限。
以下示例显示了授予权限如何应用于不同的管理方法。向角色授予 APPLY 权限后,可以使用 ALTER TABLE ...ALTER COLUMN 语句在表列上设置掩码策略,也可以使用 ALTER VIEW 语句在视图列上设置(由对掩码策略具有 APPLY 权限的角色成员设置)。
集中管理
在集中管理方法中,只有安全官自定义角色(例如
security_officer
)创建掩码策略并将其应用到表或视图中的列。这种方法可以在掩码策略管理和掩码敏感数据方面提供最大的一致性。-- create a security_officer custom role USE ROLE ACCOUNTADMIN; CREATE ROLE security_officer; -- grant CREATE AND APPLY masking policy privileges to the SECURITY_OFFICER custom role. GRANT CREATE MASKING POLICY ON SCHEMA mydb.mysch TO ROLE security_officer; GRANT APPLY MASKING POLICY ON ACCOUNT TO ROLE security_officer;其中:
schema_name
指定架构的标识符;对于创建架构的数据库来说必须是唯一的。
此外,标识符必须以字母字符开头,且不能包含空格或特殊字符,除非整个标识符字符串放在双引号内(例如,"My object")。放在双引号内的标识符也区分大小写。
有关更多详细信息,请参阅 标识符要求。
混合管理
在混合管理方法中,安全官自定义角色(例如
security_officer
)创建掩码策略,并且各个团队(例如财务、工资、人力资源)将掩码策略应用到团队拥有的表或视图中的列。这种方法可以实现一致的策略创建和维护,但要求各个团队承担更多的责任来对敏感数据进行掩码处理。USE ROLE ACCOUNTADMIN; CREATE ROLE security_officer; GRANT CREATE MASKING POLICY ON SCHEMA mydb.mysch TO ROLE security_officer;SECURITY_OFFICER 自定义角色向人力资源团队(即具有 HUMAN_RESOURCES 自定义角色的用户)授予 APPLY 权限,以在 HUMAN_RESOURCES 自定义任务拥有的对象的列中对社会安全号码进行掩码处理(例如掩码策略:
ssn_mask
)。USE ROLE security_officer; GRANT APPLY ON MASKING POLICY ssn_mask TO ROLE human_resources;其中:
grant apply on masking policy policy_name to role role_name;
由策略所有者用来将列上给定掩码策略的取消设置和设置操作分散给对象所有者。
此权限支持 自主访问控制,其中对象所有者也视为数据管理员。
去中心化方法
在分散管理方法中,各个团队创建掩码策略并将其应用到表或视图中的列。这种方法可能会导致策略管理不一致,并且可能无法正确对敏感数据进行掩码处理,因为各个团队承担管理掩码策略和掩码敏感数据的所有责任。
在此代表性示例中,支持团队(即具有自定义角色 SUPPORT 的用户)和财务团队(即具有自定义 FINANCE 角色的用户)可以创建掩码策略。请注意,这些自定义角色可能不包括 SECURITY_OFFICER 自定义角色。
USE ROLE ACCOUNTADMIN; GRANT CREATE MASKING POLICY ON SCHEMA mydb.mysch TO ROLE support; GRANT CREATE MASKING POLICY ON SCHEMA <DB_NAME.SCHEMA_NAME> TO ROLE FINANCE;支持团队向人力资源团队(即具有自定义角色 HUMAN_RESOURCES 的用户)授予 APPLY 权限,以在 HUMAN_RESOURCES 自定义任务拥有的对象的列中对社会安全号码进行掩码处理(例如掩码策略:
ssn_mask
)。USE ROLE support; GRANT APPLY ON MASKING POLICY ssn_mask TO ROLE human_resources;财务团队向内部审计团队(即具有自定义角色 AUDIT_INTERNAL 的用户)授予 APPLY 权限,以在 AUDIT_INTERNAL 自定义角色拥有的对象的列中对现金流数据进行掩码处理(例如,掩码策略:
cash_flow_mask
)。USE ROLE finance; GRANT APPLY ON MASKING POLICY cash_flow_mask TO ROLE audit_internal;
有关掩码策略权限的更多信息,请参阅:
掩码策略 DDL¶
Snowflake 提供以下一组命令来管理列级安全掩码策略。
下表总结了列级安全掩码策略 DDL 操作及其所需权限之间的关系。
请注意,对架构中的对象进行操作还需要对父数据库和架构具有 USAGE 权限。
操作 |
权限 |
---|---|
创建掩码策略 |
对 SCHEMA 具有 CREATE MASKING POLICY 权限的角色。 |
更改掩码策略 |
掩码策略所有者(即具有掩码策略 OWNERSHIP 权限的角色)。 |
删除掩码策略 |
掩码策略所有者(即具有掩码策略 OWNERSHIP 权限的角色)。 |
显示掩码策略 |
以下其中之一:. 具有全局 APPLY MASKING POLICY 权限的角色,或 . 掩码策略所有者(即在掩码策略上具有 OWNERSHIP 权限的角色),或 . 在掩码策略中具有 APPLY 权限的角色。 |
描述掩码策略 |
以下其中之一:. 具有全局 APPLY MASKING POLICY 权限的角色,或 . 掩码策略所有者(即在掩码策略上具有 OWNERSHIP 权限的角色),或 . 在掩码策略中具有 APPLY 权限的角色。 |
具有掩码策略的列的列表 |
以下其中之一:. 具有 APPLY MASKING POLICY 权限的角色,或 . 在给定掩码策略上具有 APPLY on MASKING POLICY 权限,以及 对目标对象具有 OWNERSHIP 的角色。 |
使用掩码策略中的 UDFs |
如果创建新的或更改现有的掩码策略,则策略管理员角色必须对 UDF 具有使用权限,策略表达式中的所有标量 UDFs 都应具有相同的数据类型,并且 UDF 必须存在。 在查询运行时,Snowflake 验证 UDF 是否存在;如果不存在,则 SQL 表达式将无法解析并且查询失败。 |
通过 SQL 监控掩码策略¶
您可以通过两个不同的 Account Usage 视图和 Information Schema 表来监控掩码策略的使用情况。
考虑两种通用方法来确定如何监控掩码策略的使用会很有帮助。
发现掩码策略¶
您可以使用 MASKING_POLICIES 在共享的 Account Usage 架构中查看 SNOWFLAKE 数据库。此视图是 Snowflake 账户中所有掩码策略的 目录。例如:
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.MASKING_POLICIES ORDER BY POLICY_NAME;
确定分配¶
Snowflake 支持不同的选项来识别掩码策略分配,具体取决于查询是否需要针对账户或特定数据库。
账户级查询:
使用 Account Usage POLICY_REFERENCES 视图确定具有掩码策略的所有列。例如:
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.POLICY_REFERENCES ORDER BY POLICY_NAME, REF_COLUMN_NAME;
数据库级查询:
每个 Snowflake 数据库都包含一个 Snowflake Information Schema。使用 Information Schema 表函数 POLICY_REFERENCES 确定给定表的列上的所有掩码策略:
SELECT * FROM TABLE( my_db.INFORMATION_SCHEMA.POLICY_REFERENCES( 'my_table', 'table' ) );
您还可以使用此函数按掩码策略的名称进行查询,以查找与给定掩码策略关联的对象。
通过 Snowsight 监控掩码策略¶
可以使用 Snowsight Monitoring » Governance 区域来监控和报告策略以及带有表、视图和列的标签的使用情况。有两种不同的界面:Dashboard 和 Tagged Objects。
当使用 Dashboard 和 Tagged Objects 界面时,请注意以下详细信息。
Dashboard 和 Tagged Objects 界面需要一个正在运行的仓库。
Snowsight 每 12 小时更新一次 Dashboard。
Tagged Objects 信息延迟可能长达两个小时,并返回最多 1000 个对象。
访问 Snowsight 中的治理区域¶
要访问 Governance 区域,Snowflake 账户必须是 Enterprise Edition 或更高版本。此外,您必须执行以下任一操作:
使用 ACCOUNTADMIN 角色。
使用已 直接 授予 GOVERNANCE_VIEWER 和 OBJECT_VIEWER 数据库角色的账户角色。
您 必须 使用获授这些数据库角色的账户角色。目前,Snowsight 不评估角色层次结构和有权访问表、视图、数据访问策略和标签的用户定义数据库角色。
要确定是否向账户角色授予了这两个数据库角色,请使用 SHOW GRANTS 命令:
SHOW GRANTS LIKE '%VIEWER%' TO ROLE data_engineer;
|-------------------------------+-----------+---------------+-----------------------------+------------+-----------------+--------------+------------| | created_on | privilege | granted_on | name | granted_to | grantee_name | grant_option | granted_by | |-------------------------------+-----------+---------------+-----------------------------+------------+-----------------+--------------+------------| | 2024-01-24 17:12:26.984 +0000 | USAGE | DATABASE_ROLE | SNOWFLAKE.GOVERNANCE_VIEWER | ROLE | DATA_ENGINEER | false | | | 2024-01-24 17:12:47.967 +0000 | USAGE | DATABASE_ROLE | SNOWFLAKE.OBJECT_VIEWER | ROLE | DATA_ENGINEER | false | | |-------------------------------+-----------+---------------+-----------------------------+------------+-----------------+--------------+------------|
如果您的账户角色未被授予这两个数据库角色或其中之一,请使用 GRANT DATABASE ROLE 命令并再次运行 SHOW GRANTS 命令以确认授予角色:
USE ROLE ACCOUNTADMIN; GRANT DATABASE ROLE SNOWFLAKE.GOVERNANCE_VIEWER TO ROLE data_engineer; GRANT DATABASE ROLE SNOWFLAKE.OBJECT_VIEWER TO ROLE data_engineer; SHOW GRANTS LIKE '%VIEWER%' TO ROLE data_engineer;
有关这些数据库角色的详细信息,请参阅 SNOWFLAKE 数据库角色。
仪表板¶
作为数据管理员,您可以使用 Dashboard 界面通过以下方式监控标签和策略使用情况。
覆盖率:根据表、视图或列是否具有策略或标签来指定计数和百分比。
流行度:列出并统计最常用的策略和标签。
覆盖范围和流行程度提供了有关数据保护和标记程度的快照。
当您选择计数、百分比、策略名称或标签名称时, Tagged Objects 界面打开。Tagged Objects 界面会根据您在 Dashboard 中的选择自动更新筛选器。
监控信息是在多个 Account Usage 视图上运行复杂且查询密集型操作的替代方案或补充。
这些视图可能包括但不限于 COLUMNS、POLICY_REFERENCES、TABLES、TAG_REFERENCES,以及 VIEWS 视图。
标记对象¶
作为数据管理员,您可以使用此表将 Dashboard 中的覆盖范围和流行程度快速关联到特定表、视图或列的列表。您还可以手动筛选表结果,如下所示。
选择 Tables 或者 Columns。
对于标签,可以使用标签、不使用标签或按特定标签进行筛选。
对于策略,可以使用策略、不使用策略或按特定策略进行筛选。
在表中选择一行时,系统将打开 Data » Databases 中的 Table Details 或 Columns 选项卡。您可以根据需要编辑标签和策略分配。
小技巧
您可以使用 Snowsight 对掩码策略分配进行故障排除。在 Columns 选项卡中,当与 MASKING POLICY 列上的掩码策略分配发生冲突时,该列将显示 Policy Error。您可以选择 Policy Error 了解更多信息。
此外,当列上的掩码策略分配出现错误时, Data Preview 选项卡不会呈现数据预览。相反, Data Preview 选项卡会返回 SQL 错误消息。此消息对应于 Account Usage POLICY_REFERENCES 视图和 Information Schema POLICY_REFERENCES 表函数的 POLICY_STATUS 列中的一个错误值。
要纠正错误,请使用 SQL 错误消息和 Policy Error 消息修改标签或策略分配。
有关更多详细信息,请参阅 标签和策略发现