使用隐私策略实现差分隐私¶
本主题说明了数据提供商如何使用隐私策略来实现 差分隐私。
关于隐私策略¶
使用差分隐私时,Snowflake 必须检查每个查询,以确定其是否会超出与执行该查询的用户相关联的 隐私预算。隐私策略实现了该操作。数据提供商创建一个隐私策略,将用户与隐私预算相关联,然后将该策略分配给表和视图,使其受到隐私保护。
当分析师对具有隐私策略的表执行查询时,Snowflake 会评估策略的正文并执行以下任一操作:
如果策略将用户与隐私预算相关联,则 Snowflake 会确保查询导致的 隐私损失 不超过该隐私预算。如果查询成功执行,Snowflake 会将查询产生的隐私损失添加到用户的累积隐私损失中,以便后续查询不会超过隐私预算。
如果策略指示用户可以不受限制地查询表,则结果不包含 噪声,并且 Snowflake 不会跟踪查询造成的隐私损失。
隐私策略最佳实践¶
您可以创建单个隐私策略来保护单个实体,然后将该隐私策略分配给包含该实体信息的所有表和视图。这样,该实体的所有隐私预算会归入一个隐私策略。您无需为每个表和视图创建单独的隐私策略。
使用隐私策略¶
为架构实现差分隐私的过程分为三个步骤:
创建隐私策略,该策略根据名称、角色或账户等条件将隐私预算与用户相关联。
将该隐私策略分配 到表或视图中,以确保针对数据的单个查询或一组查询不超过与执行查询的用户关联的隐私预算。
授予受隐私保护的数据的 SELECT 权限。在将隐私策略分配给表或视图之前,请勿授予权限,因为分析师对数据拥有完全访问权限。
在管理差分隐私环境时,您还可以:
创建隐私策略¶
创建新隐私策略的最基本语法是:
CREATE PRIVACY POLICY <name>
AS ( ) RETURNS PRIVACY_BUDGET -> <body>
其中:
name
是隐私策略的名称。AS ( ) RETURNS PRIVACY_BUDGET
是策略的签名和返回类型。签名不接受任何实参,返回类型为 PRIVACY_BUDGET,这是一种内部数据类型。所有隐私策略都具有相同的签名和返回类型。body
是一个 SQL 表达式,该表达式确定隐私策略是否返回隐私预算,如果返回,返回的是哪个预算。策略正文的 SQL 表达式调用两个函数来控制策略的返回值:
NO_PRIVACY_POLICY
如果您想要查询,从而能够不受限制地访问采用了隐私策略的表或视图,请使用正文的表达式来调用 NO_PRIVACY_POLICY 函数。
PRIVACY_BUDGET
如果您想要从策略返回隐私预算,请使用正文的表达式来调用 PRIVACY_BUDGET 函数。
有关 NO_PRIVACY_POLICY 和 PRIVACY_BUDGET 函数的完整语法,请参阅 CREATE PRIVACY POLICY。
隐私策略示例¶
- 无条件的单一隐私预算
创建名为
my_priv_policy
的隐私策略,该策略始终返回一个名为analysts
的隐私预算:CREATE PRIVACY POLICY my_priv_policy AS ( ) RETURNS PRIVACY_BUDGET -> PRIVACY_BUDGET(BUDGET_NAME=> 'analysts');
- 有条件的隐私策略
创建名为
my_priv_policy
的隐私策略,给予admin
权限,使其不受限制地访问受隐私保护的表或视图,同时将所有其他用户与隐私预算analysts
相关联:CREATE PRIVACY POLICY my_priv_policy AS () RETURNS PRIVACY_BUDGET -> CASE WHEN CURRENT_USER() = 'ADMIN' THEN NO_PRIVACY_POLICY() ELSE PRIVACY_BUDGET(BUDGET_NAME => 'analysts') END;
- 跨账户共享的有条件隐私策略
创建名为
my_priv_policy
的隐私策略,该策略将执行以下操作:给予
admin
权限,使其不受限制地访问受隐私保护的表或视图。将隐私预算
analysts
与同一账户中的用户相关联。为与外部账户用户相关联的隐私预算命名,以便轻松识别。隐私预算的命名空间会自动设置为特定外部账户,但使用描述性命名方案可以帮助管理隐私预算。
CREATE PRIVACY POLICY my_priv_policy AS () RETURNS PRIVACY_BUDGET -> CASE WHEN CURRENT_USER() = 'ADMIN' THEN NO_PRIVACY_POLICY() WHEN CURRENT_ACCOUNT() = 'YE74187' THEN PRIVACY_BUDGET(BUDGET_NAME => 'analysts') ELSE PRIVACY_BUDGET(BUDGET_NAME => 'external.' || CURRENT_ACCOUNT()) END;
在策略正文中使用上下文函数¶
您可以在隐私策略的正文中包含 上下文函数,这样其行为将取决于差分隐私查询所在的上下文。
您可以在隐私策略的正文中使用下列上下文函数:
上下文函数 |
描述 |
---|---|
返回用户当前会话使用的账户定位器。 |
|
返回包含受隐私策略保护的表的数据库。 |
|
返回用户当前会话使用的组织的名称。 |
|
返回当前会话所使用的角色名称。 |
|
返回包含受隐私策略保护的表的架构。 |
|
返回执行查询的用户的名称。 |
|
返回执行角色的名称。 |
|
返回共享的名称,该共享直接访问了调用 INVOKER_SHARE 函数的表或视图。 |
小技巧
诸如 CURRENT_USER 的上下文函数返回字符串,因此使用它们进行比较时应区分大小写。如果想进行不区分大小写的比较,可以使用 LOWER 将字符串转换为全部小写。
修改隐私策略¶
使用 ALTER PRIVACY POLICY 命令修改隐私策略。您可以对策略重命名、更改其正文或修改注释。
例如,要使用始终返回预算 external_analysts
的新正文替换隐私策略 my_priv_policy
的现有正文,请执行:
ALTER PRIVACY POLICY my_priv_policy SET BODY ->
PRIVACY_BUDGET(BUDGET_NAME => 'external_analysts');
分配隐私策略¶
隐私策略可以应用于一个或多个表或视图,通过差分隐私对其进行保护。一个表或视图只能分配一个隐私策略。
使用 ALTER TABLE 或 ALTER VIEW 命令的 ADD PRIVACY POLICY 子句为表或视图分配隐私策略。语法为:
ALTER { TABLE | [ MATERIALIZED ] VIEW } <name> ADD PRIVACY POLICY <policy_name> { NO ENTITY KEY | ENTITY KEY ( <column_name> ) }
其中:
name
指定表或视图的名称。policy_name
指定隐私策略的名称。column_name
指定表或视图的实体键。实体键 是唯一标识表或视图中实体的列。
在大多数情况下,您需要定义实体键以实现实体级隐私,但您可以使用 NO ENTITY KEY 子句来保护单个行,无需考虑属于某个实体的数据是否可以存在于多行中。有关更多信息,请参阅 关于实体级隐私。
例如,要将策略 my_priv_policy
分配给表 t1
,其中实体键是 email
列,请执行以下操作:
ALTER TABLE t1 ADD PRIVACY POLICY my_priv_policy ENTITY KEY (email);
替换隐私策略或实体键¶
要替换隐私策略或实体键,推荐方法是在同一 ALTER TABLE 或 ALTER VIEW 命令中同时使用 ADD 和 DROP 子句。这样可以确保以原子方式做出更改,因为两个操作都在同一事务中进行,不存在任何保护差距。
如果要保持相同的策略但更改实体键,则需要先删除策略,然后再使用新的实体键重新添加。
例如,要将新的隐私策略分配给已受隐私策略保护的表,请执行以下操作:
ALTER TABLE finance.accounting.customers
DROP PRIVACY POLICY priv_policy_1,
ADD PRIVACY POLICY priv_policy_2 ENTITY KEY (email);
您还可以在单个语句中将隐私策略与表或视图分离,然后在其他语句中为表或视图设置新策略。如果选择此方法,在分离一个策略和分配另一个策略期间,列不受隐私策略的保护。如果用户在此期间仍然对数据拥有 SELECT 权限,那么查询可能会访问到敏感数据。
分离隐私策略¶
使用 ALTER TABLE 或 ALTER VIEW 命令的 DROP PRIVACY POLICY 子句将隐私策略与表或视图分离。执行此命令后,表或视图不再受隐私保护。语法为:
ALTER { TABLE | [ MATERIALIZED ] VIEW } <name> DROP PRIVACY POLICY <policy_name>
其中:
name
指定表或视图的名称。policy_name
指定隐私策略的名称。
例如,要将隐私策略 my_priv_policy
与 finance.accounting.customers
表相分离,请执行如下操作:
ALTER TABLE finance.accounting.customers DROP PRIVACY POLICY my_priv_policy;
监控隐私策略¶
为了帮助监控隐私策略的使用情况,您可以列出账户中的所有隐私策略,确定哪些表和视图受特定隐私策略的保护,或者列出当前分配给表或视图的所有策略。
列出所有隐私策略¶
您可以在共享 SNOWFLAKE 数据库的 Account Usage 架构中使用 PRIVACY_POLICIES 视图。此视图是 Snowflake 账户中所有隐私策略的 目录。例如:
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.PRIVACY_POLICIES ORDER BY POLICY_NAME;
识别隐私策略引用¶
:doc:`/sql-reference/functions/policy_references`Information Schema 表函数可以识别哪些表和视图受到隐私策略的保护。有两种不同的语法选项:
要为设置了指定隐私策略的每个对象(即表或视图)返回一行,请执行以下操作:
USE DATABASE my_db; USE SCHEMA information_schema; SELECT policy_name, policy_kind, ref_entity_name, ref_entity_domain, ref_column_name, ref_arg_column_names, policy_status FROM TABLE(information_schema.policy_references(policy_name => 'my_db.my_schema.privpolicy'));
为分配给名为
my_table
的表的每个策略返回一行。使用 POLICY_KIND 列以确定哪些策略是隐私策略。USE DATABASE my_db; USE SCHEMA information_schema; SELECT policy_name, policy_kind, ref_entity_name, ref_entity_domain, ref_column_name, ref_arg_column_names, policy_status FROM TABLE(information_schema.policy_references(ref_entity_name => 'my_db.my_schema.my_table', ref_entity_domain => 'table'));
权限和命令¶
以下各小节提供有助于管理隐私策略的信息。
隐私策略权限¶
Snowflake 支持对隐私策略对象的以下权限。
请注意,对架构中的对象进行操作还需要对父数据库和架构具有 USAGE 权限。
权限 |
用途 |
---|---|
APPLY |
允许您将隐私策略分配给表或视图,或从表或视图分离隐私策略。 |
OWNERSHIP |
更改隐私策略的大多数属性所需。隐私策略的所有权可以转让,从而授予对隐私策略的完全控制权。 |
隐私策略 DDL 引用¶
Snowflake 支持通过以下 DDL 创建和管理隐私策略。
DDL 命令、操作和权限总结¶
下表总结了隐私策略权限和 DDL 操作之间的关系。
请注意,对架构中的对象进行操作还需要对父数据库和架构具有 USAGE 权限。
操作 |
所需权限 |
---|---|
创建隐私策略 |
在同一架构中具有 CREATE PRIVACY POLICY 权限的角色。 |
更改隐私策略 |
对隐私策略具有 OWNERSHIP 权限的角色。 |
描述隐私策略 |
以下其中 一项:
|
删除隐私策略。 |
对隐私策略具有 OWNERSHIP 权限的角色。 |
显示隐私策略。 |
以下其中 一项:
|
将隐私策略分配给表或视图,或从表或视图分离隐私策略。 |
以下其中 一项:
|