差分隐私入门

简介

本教程演示了如何使用差分隐私策略保护敏感数据,以便您可以安全地与分析师共享。

您将学习以下内容

在本教程中,您将学习如何执行以下操作:

  • 创建差分隐私策略。

  • 将该隐私策略应用于表,以使用差分隐私对其进行保护。

  • 定义表的隐私域。

  • 在受差分隐私保护的表上运行查询。

  • 确定查询结果中存在的噪声量。

本教程没有完全解释差分隐私的关键概念,如 噪声隐私预算隐私域。本教程重点介绍如何对数据应用差分隐私。

关于管理员和分析师

您将在本教程中假设两个角色:

  • 管理员,拥有对原始数据的权限,并管理表上的差分隐私策略。

  • 分析员,运行对此受保护数据的查询。

在真实用例中,这些人可能是两个不同的人或两组人,也可能是一个想要分析受保护结果并与他人安全地共享这些结果的人。

虽然本教程介绍了如何对受保护的数据运行查询,但主要目的是说明如何实现差分隐私,而不是如何使用它。

先决条件

  • 您必须拥有 Enterprise Edition 或更高版本 的账户。

  • 您必须能够 使用 ACCOUNTADMIN 角色

重要

在本教程中,您将使用 ACCOUNTADMIN 角色执行所有管理员角色步骤。但在一般情况下,您使用的角色应具有专为正在执行的操作而定义的权限。此处介绍了 创建和应用隐私策略所需的权限。

创建角色、仓库和数据

在本节中,您将执行以下设置步骤:

  • 为分析师创建角色。

  • 创建用于对受保护数据执行查询的仓库。

  • 创建将受隐私策略保护的模拟敏感数据。

这些设置步骤均非特定于差分隐私策略。如果已经存在合适的角色、仓库和/或数据集,则可以使用它们。

创建分析师角色

在 Snowsight 工作表或为了对 Snowflake 账户运行 Snowflake SQL 而连接的环境中,运行以下命令以创建分析师角色并将其分配给您自己:

USE ROLE ACCOUNTADMIN;
CREATE ROLE dp_tutorial_analyst;

-- You can find your own user name by running "SELECT CURRENT_USER();"
GRANT ROLE dp_tutorial_analyst TO USER <user_name>;
Copy

为数据创建仓库

CREATE OR REPLACE WAREHOUSE dp_tutorial_wh;
GRANT USAGE ON WAREHOUSE dp_tutorial_wh TO ROLE dp_tutorial_analyst;
Copy

创建模拟敏感数据

以下命令创建数据库、架构和表,并用数据填充它。这些数据模拟了一个简单的糖尿病研究,我们想在该研究中保护患者的身份。在本教程的后面部分,您将使用差分隐私来保护个人在研究中的身份。

-- Create the table
CREATE OR REPLACE DATABASE dp_db;
CREATE OR REPLACE SCHEMA dp_db.dp_schema;
USE SCHEMA dp_db.dp_schema;
CREATE OR REPLACE TABLE dp_tutorial_diabetes_survey (
  patient_id TEXT,
  is_smoker BOOLEAN,
  has_difficulty_walking BOOLEAN,
  gender TEXT,
  age INT,
  has_diabetes BOOLEAN,
  income_code INT);

-- Populate the table
INSERT INTO dp_db.dp_schema.dp_tutorial_diabetes_survey
VALUES
('ID-23493', TRUE, FALSE, 'male', 39, TRUE, 2),
('ID-00923', FALSE, FALSE, 'female', 82, TRUE, 5),
('ID-24020', FALSE, FALSE, 'male', 69, FALSE, 8),
('ID-92848', TRUE, TRUE, 'other', 75, FALSE, 3),
('ID-62937', FALSE, FALSE, 'male', 46, TRUE, 5);
Copy

备注:

虽然遮掩患者 ID 看似比使用差分隐私要好,但这样做会防止对该列的联接。此外,如果您添加了一个表,其中每个患者有多个行,如药物表或就诊表,那么简单的掩码将阻止您按人员对结果进行分组。这种情况下,差分隐私可能比简单的掩码和行隐藏强大得多;您可以将更多的数据提供给分析师,并允许更有用的查询,同时仍然保护实体隐私。

定义隐私策略

通过将 隐私策略 应用于表或视图,可以使用差分隐私对表或视图进行保护,并为组或用户分配 隐私预算,以便 Snowflake 可以防止多次查询泄露过多的敏感信息。

您将在各自的数据库中创建隐私策略。这是 Snowflake 中所有类型策略的最佳实践。如果在同一数据库中创建策略,则克隆数据库将创建策略的不同步副本。通过将所有策略放在一个单独的数据库中,并将其应用于多个表,您可以管理和更新每个策略的单个副本。

您将此新策略命名为 patients_policy

-- Define a privacy policy. Use default budget, budget window, max budget per aggregate.
CREATE OR REPLACE DATABASE policy_db;
CREATE OR REPLACE SCHEMA policy_db.diff_priv_policies;
CREATE OR REPLACE PRIVACY POLICY policy_db.diff_priv_policies.patients_policy AS () RETURNS privacy_budget ->
  CASE
    WHEN CURRENT_ROLE() = 'ACCOUNTADMIN' THEN no_privacy_policy()
    WHEN CURRENT_ROLE() IN ('DP_TUTORIAL_ANALYST')
      THEN privacy_budget(budget_name => 'clinical_analysts')
    ELSE privacy_budget(budget_name => 'default')
END;
Copy

备注:

  • 应用的隐私策略取决于用户的角色,如 CASE 语句中所指定。角色名称在此处以大写形式给出,因为 CURRENT_ROLE() 返回大写值。

  • 为每个角色创建单独的隐私预算,可让您将分析师和其他用户使用的预算分开,还可以监控每个组的使用情况。

  • 如果在接受评估时隐私策略解析为有效的隐私预算,则用户无法运行非汇总 SELECT 查询,结果中会添加噪声,且查询数量受该策略的隐私预算限制。

  • 账户管理员角色没有应用隐私策略。这意味着,作为该角色运行的查询没有应用差分隐私。要指示没有隐私策略,您必须返回 no_privacy_policy() 而不是返回 NULL。

  • DP_TUTORIAL_ANALYST 角色使用名为“clinical_analysts”的隐私策略,该策略具有隐私预算、预算窗口和每次汇总的最大预算的默认值。

  • 任何其他具有 SELECT 访问权限的用户将获得一个名为“default”的隐私预算,其中也具有默认隐私策略值。如果要阻止其他用户在此表上运行查询,则应限制此表的 SELECT 权限。表级策略需要 ELSE 子句,不能返回 NULL。

指定隐私策略

接下来,您将为表分配您刚刚创建的隐私策略,以使用差分隐私对其进行保护。

-- Assign the privacy policy to the table.
ALTER TABLE dp_db.dp_schema.dp_tutorial_diabetes_survey
ADD PRIVACY POLICY policy_db.diff_priv_policies.patients_policy ENTITY KEY (patient_id);
Copy

备注:

ENTITY KEY 子句指定一列,该列唯一标识应受到差分隐私保护的实体。在本教程中,一个表中的每个实体都仅列在一行中,因此定义实体键不太重要。但是,如果每个患者可以出现在多行中(例如,如果它捕获了患者问诊或患者药物),那么定义该键将非常重要。在这里定义键仍然是一个好的做法,以备以后在数据库中添加第二个这样的表。了解有关 实体级隐私 的更多信息。

定义隐私域

接下来,您将对表中的部分列设置 隐私域

隐私域 会告诉系统该列的结果中可以显示的值范围。系统以两种方式使用这些信息:

  • 此范围之外的值将被忽略或固定到边界,具体取决于该列是字符串还是数字/日期值。

  • 系统使用此“有效范围”作为确定结果范围的方法,以便确定应用于每个测量值的噪声。

分析师可以进一步限制域,例如使用 WHERE 子句,以潜在地减少差分隐私产生的噪声量(域越小,噪声越小)。如果不在列上设置隐私域,分析师必须添加带有 WHERE 子句的隐私域才能查看该列的值(没有隐私域的列不能在查询中显示或使用)。

对于糖尿病调查数据,您将在三个列上设置隐私域:genderageincome_code。您不会在任何布尔列上设置隐私域(只有两个可能的值,隐私域没有意义,也不是必需的),您不应该在 patient_id 列上设置隐私域,因为用户可以看到您在隐私域中设置的值,这将告诉他们数据中有哪些患者 IDs。如果需要为有限数量的字符串值(如 ZIP 代码)指定隐私域,则应 在域定义中填充 不存在的额外值,以遮蔽可能的值。

-- Define privacy domains.
ALTER TABLE dp_db.dp_schema.dp_tutorial_diabetes_survey ALTER (
COLUMN gender SET PRIVACY DOMAIN IN ('female', 'male', 'other'),
COLUMN age SET PRIVACY DOMAIN BETWEEN (0, 90),
COLUMN income_code SET PRIVACY DOMAIN BETWEEN (1, 8)
);
Copy

授予分析师对表的访问权

仅在您为数据分配了隐私策略后授予对表的访问权。否则,用户可能会在您应用隐私策略之前看到数据。

GRANT USAGE ON DATABASE dp_db TO ROLE dp_tutorial_analyst;
GRANT USAGE ON SCHEMA dp_schema TO ROLE dp_tutorial_analyst;
GRANT SELECT
  ON TABLE dp_db.dp_schema.dp_tutorial_diabetes_survey
  TO ROLE dp_tutorial_analyst;
Copy

运行一些查询

最后,您可以开始针对数据运行查询了!

您将在管理员和分析师之间切换角色,以比较每个角色的行为和输出。

检查差分隐私是否有效

使用管理员角色运行返回单个行的查询。此查询成功,因为隐私策略解析为 ACCOUNTADMIN 角色的 no_privacy_policy():

USE ROLE ACCOUNTADMIN;
SELECT * FROM dp_db.dp_schema.dp_tutorial_diabetes_survey;
Copy

现在使用分析师角色运行相同的查询。查询失败,因为差分隐私不允许 SELECT * 查询。

USE ROLE dp_tutorial_analyst;
SELECT * FROM dp_db.dp_schema.dp_tutorial_diabetes_survey;
Copy

尝试使用第三个角色,以确保默认结果相同。(不要忘记将表上的 SELECT 授予个人或角色!)

看看噪声是什么样子

首先,以管理员身份运行一个简单的查询,而不应用差分隐私。您将看到确切的表值。

-- Run a basic query without DP.
USE ROLE ACCOUNTADMIN;
SELECT COUNT(DISTINCT patient_id)
  FROM dp_db.dp_schema.dp_tutorial_diabetes_survey
  WHERE income_code = 5;
Copy

现在以分析师的身份运行相同的查询,您会看到噪声已经应用到结果中。请注意,查询花费的时间稍长,因为正在应用差分隐私。

USE ROLE dp_tutorial_analyst;
SELECT COUNT(DISTINCT patient_id)
  FROM dp_db.dp_schema.dp_tutorial_diabetes_survey
  WHERE income_code = 5;
Copy

结果通常不同于管理员结果,因为差分隐私在结果中引入了噪声以掩盖数据集中存在的个体。然而,结果有时可能完全相同,因为在任意给定的查询中,随机产生的噪声足够小,可以四舍五入到 0。但分析师无法知道是否有噪声应用于任何给定的查询。您可以尝试再次运行此查询,以查看是否获得不同的结果。

分析噪声大小

虽然分析师无法看到没有噪声的结果,但他们确实需要一种方法来了解结果的噪声程度,以决定数据是否可用于满足他们的需要。为了提供这些信息,我们向分析师公开每个查询参数的噪声区间。使用函数 DP_INTERVAL_LOWDP_INTERVAL_HIGH 检索噪声区间。

-- Retrieve noise interval for the previous query.
USE ROLE dp_tutorial_analyst;
SELECT COUNT(DISTINCT patient_id) as c,
  DP_INTERVAL_LOW(c) as LOW,
  DP_INTERVAL_HIGH(c) as HIGH
  FROM dp_db.dp_schema.dp_tutorial_diabetes_survey
  WHERE income_code = 5;
Copy

至少有 95% 的置信度表明聚合的真实值介于 LOW 和 HIGH 之间。

请注意,由于人为缩小了数据集,因此与结果的量级相比,该数据上的查询区间很宽。这种较大的噪声区间实质上意味着这里的患者太少,Snowflake 无法在保护患者隐私的同时给出准确的答案。

查看预算和估计剩余查询

在受差分隐私保护的表上运行查询的用户可以通过调用 ESTIMATE_REMAINING_DP_AGGREGATES 表函数来查看其差分隐私预算的使用情况并估算剩余查询数量。假设您要查看预算的角色,然后调用如下所示的函数:

USE ROLE <role_name>;
SELECT * FROM TABLE(SNOWFLAKE.DATA_PRIVACY.ESTIMATE_REMAINING_DP_AGGREGATES(dp_db.dp_schema.dp_tutorial_diabetes_survey));
Copy

清理

清理资源,以便您或贵组织中的其他人稍后可以再次运行教程。

USE ROLE ACCOUNTADMIN;
DROP ROLE dp_tutorial_analyst;
DROP WAREHOUSE dp_tutorial_wh;
ALTER TABLE dp_tutorial_diabetes_survey
  DROP PRIVACY POLICY policy_db.diff_priv_policies.patients_policy;
DROP DATABASE dp_db;
DROP DATABASE policies_db;
Copy
语言: 中文