你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure 中云规模分析的数据隐私

组织可通过云规模分析来确定满足其需求的最佳模式,同时在多个级别保护个人数据。 个人数据是可用于标识个体的任何数据,例如驾照号码、社会安全号码、银行帐号、护照号码、电子邮件地址等。 当今存在许多保护用户隐私的法规。

数据保密性分类方案

分类 说明
公用 任何人都可以访问数据,并且数据可以发送给任何人。 例如,政府公开数据。
仅限内部使用 只有员工可以访问数据,并且无法将其发送到公司外部。
机密 仅当特定任务需要时,才能共享数据。 在没有保密协议的情况下,无法将数据发送到公司外部。
敏感数据(个人数据) 数据包含隐私信息,必须在有限的时间内在需要知道的基础上屏蔽和共享。 此类数据不得发送到未经授权的人员或公司外部。
受限 数据只能与负责保护该数据的指定人员共享。 例如,法律文档或商业机密。

在引入数据之前,必须将数据分为“机密或以下级别”或“敏感(个人数据)”

  • 如果用户获得对扩充或精选数据资产的访问权限,数据可能会被分类到“机密或以下级别”。 用户可以查看所有列和行。

  • 如果针对哪些列和行对不同用户可见存在限制,则数据可能会被分类到“敏感(个人数据)”

重要

合并数据时,数据集可从“机密或以下级别”更改为“敏感(个人数据)”。 如果应该持久保留数据,应将其复制到一个单独的文件夹中,该文件夹与数据机密性分类和载入它的过程相一致。

机密或以下级别

对于每个载入的数据产品,我们在扩充和特选层、 机密层或以下敏感数据(个人数据)中创建两个 Data Lake 文件夹,并使用访问控制列表启用 Microsoft Azure 目录(Microsoft Entra ID)直通身份验证。

如果数据应用程序团队载入 机密或低于 数据资产,则可以将用户主体名称和服务主体对象添加到两个 Microsoft Entra 组(一个用于读取/写入访问,另一个用于只读访问)。 这两个 Microsoft Entra 组应在载入过程中创建,并在相应的数据产品文件夹中进行排序,其中包含 原始和扩充数据的机密或以下 容器。

此模式允许支持 Microsoft Entra 直通身份验证的任何计算产品连接到 Data Lake 并验证登录用户的身份。 如果用户是数据资产的 Microsoft Entra 组的一部分,他们可以通过 Microsoft Entra 直通身份验证访问数据。 它允许组内的这些用户在无需使用策略筛选器的情况下读取整个数据资产。 然后,可以使用适当的日志和 Microsoft Graph 对访问进行详细审核。

有关数据湖布局的建议,请查看为每个数据登陆区域预配三个 Azure Data Lake Storage Gen2 帐户

注意

计算产品的示例包括通过 Microsoft Entra 直通身份验证启用的 Azure Databricks、Azure Synapse Analytics、Apache Spark 和 Azure Synapse SQL 按需池。

敏感数据(个人数据)

对于“敏感(个人数据)”,企业需要限制用户可通过策略、数据复制或计算查看的内容。 在这种情况下,组织需要考虑将访问控制移动或注入计算层。 有四种方法可以在云规模分析中保护数据。

示例方案

以下示例描述用于保护“敏感(个人数据)”的选项

数据应用程序引入北美和欧洲的人力资源 (HR) 人事数据产品。 该用例要求欧洲用户只能查看欧洲人事记录,而北美用户只能查看北美人事记录。 它进一步受到限制,以便只有 HR 经理才能看到包含薪水数据的列。

前两个选项提供了一种处理“敏感(个人数据)”的方法,它们还授予集成操作和数据产品团队用于识别和限制访问权限的控制权。 对于小规模分析平台来说,这可能已经足够了,但是对于拥有数百个数据产品的大型企业来说,应在数据管理登陆区域放置一个策略引擎。 策略引擎支持管理、保护和控制的中心方法:

  • 对数据的访问
  • 管理数据生命周期
  • 内部和外部策略及法规
  • 数据共享策略
  • 标识“敏感(个人数据)”
  • 关于保护和合规性的见解
  • 数据保护报告策略

通常,策略引擎将与 Azure Purview 等数据目录集成。 Azure 市场提供第三方供应商解决方案,一些供应商使用 Azure Synapse 和 Azure Databricks 来加密和解密信息,同时还提供行级和列级安全性。 截至 2022 年 1 月,Azure Purview 已发布访问策略公共预览版,用于控制对存储在 Blob 和 Azure Data Lake Storage (ADLS) Gen2 中的数据的访问。 请参阅 数据所有者为 Azure 存储预配数据集(预览版)

策略引擎应使用 Microsoft Entra 组将策略应用于数据产品。 任何提供数据隐私的策略解决方案都希望对“敏感(个人数据)”进行标记,并始终通过属性访问控制进行检查,以便用户可以取消标记他们需要访问的列

如前所述,若要使策略引擎成功,将其集成到数据目录中并让 DevOps 使用 REST API 载入新数据集,这一点非常重要。 当数据应用程序团队创建读取数据源时,他们将在数据目录中注册并帮助标识“敏感(个人数据)”。 策略引擎应导入定义并拒绝对数据的所有访问,直到团队设置了其访问策略。 所有这些都应该通过 IT 服务管理解决方案中的 REST API 工作流来完成。

选项 2:机密或以下级别和敏感(个人数据)版本

对于分类为“敏感(个人数据)”的每个数据产品,其管道会创建两个副本。 分类为“机密或以下级别”的一个副本,删除了所有“敏感(个人数据)”列,并在数据产品的“机密或以下级别”文件夹下创建。 另一个副本是在“敏感(个人数据)”文件夹中为数据产品创建的,其中包含所有敏感数据。 将为每个文件夹分配一个 Microsoft Entra 读取者安全组和一个 Microsoft Entra 编写器安全组。 借助数据访问管理,用户可以请求访问数据产品。

虽然这实现了将“敏感(个人数据)”和“机密或以下级别”分开,但通过 Active Directory 直通身份验证授予对“敏感(个人数据)”的访问权限的用户能够查询所有行。 如果需要行级安全性,需要使用选项 1:策略引擎(推荐)选项 3:Azure SQL 数据库、SQL 托管实例或 Azure Synapse Analytics SQL 池

选项 3:Azure SQL 数据库、SQL 托管实例或 Azure Synapse Analytics SQL 池

数据应用程序使用 SQL 数据库、SQL 托管实例或 Azure Synapse Analytics SQL 池将数据产品加载到支持行级安全性、列级安全性和动态数据掩码的数据库中。 数据应用程序团队创建不同的 Microsoft Entra 组,并分配支持数据敏感度的权限。

对于此方案的用例,数据应用程序团队需要创建以下四个具有只读访问权限的 Microsoft Entra 组:

权限
DA-AMERICA-HRMANAGER-R 查看包含薪水信息的北美 HR 人事数据资产
DA-AMERICA-HRGENERAL-R 查看不包含薪水信息的北美 HR 人事数据资产
DA-EUROPE-HRMANAGER-R 查看包含薪水信息的欧洲 HR 人事数据资产
DA-EUROPE-HRGENERAL-R 查看不包含薪水信息的欧洲 HR 人事数据资产

第一级别的限制支持动态数据掩码,它将向没有权限的用户隐藏敏感数据。 此方法的一个优点是,它可以通过 REST API 集成到数据集的载入中。

第二个级别是添加列级安全性以限制非人力资源经理查看薪水,并添加行级安全性以限制欧洲和北美团队成员可以看到的行。

除了透明数据加密之外,安全层将加密数据列并在读取时对其进行解密。

Azure Databricks 可通过 Apache Spark 连接器:SQL Server 和 Azure SQL 数据库访问这些表。

选项 4:Azure Databricks

选项 4 是使用 Azure Databricks 探索“敏感(个人数据)”。 结合使用 Fernet 加密库、用户定义函数 (UDF)、Databricks 机密、表访问控制和动态视图函数有助于对列进行加密和解密。

正如博客文章强制实施列级加密并避免数据重复中所述:

此过程的第一步是通过在引入过程中加密数据来保护数据,一个可能的解决方案是 Fernet Python 库。 Fernet 使用由几个标准加密基元构建的对称加密。 该库用于加密 UDF,使我们能够加密数据帧中的任何指定列。 为了存储加密密钥,我们使用具有访问控制的 Databricks 机密,以仅允许数据引入过程访问它。 将数据写入 Delta Lake 表后,未经授权的用户将无法读取包含社会安全号码、电话号码、信用卡号和其他标识符等值的个人数据列。

写入并保护敏感数据后,需要一种能让特权用户读取敏感数据的方法。 首先要做的就是创建一个永久性 UDF,以添加到在 Databricks 上运行的 Hive 实例。 为了使 UDF 永久有效,它必须用 Scala 编写。 幸运的是,Fernet 也有一个 Scala 实现,可用于解密读取。 此 UDF 还将访问加密写入中使用的相同机密以进行解密,在这种情况下,它会被添加到群集的 Spark 配置中。 这需要为特权用户和非特权用户添加群集访问控制,以控制他们对密钥的访问权限。 创建 UDF 后,就可以在视图定义中使用它,以便特权用户查看已解密的数据。

使用动态视图函数,只能创建一个视图并根据其所属的 Databricks 组返回加密或解密的值。

在前面的示例中,将创建两个动态视图函数(一个用于北美,另一个用于欧洲),并在此笔记本中实现加密技术。

北美视图:

-- Alias the field 'email' to itself (as 'email') to prevent the
-- permission logic from showing up directly in the column name results.
CREATE VIEW vhr_us AS
SELECT
  emp_id,
  CASE WHEN
    is_member('DA-AMERICA-HRMANAGER-R') THEN udfPIIDecrypt(salary, "${spark.fernet}")
    ELSE 0
  END AS salary,
FROM hr_enriched
where region='US'

欧洲视图:

-- Alias the field 'email' to itself (as 'email') to prevent the
-- permission logic from showing up directly in the column name results.
CREATE VIEW vhr_eu AS
SELECT
  emp_id,
  CASE WHEN
    is_member('DA-EUROPE-HRMANAGER-R') THEN udfPIIDecrypt(salary, "${spark.fernet}")
    ELSE 0
  END AS salary,
FROM hr_enriched
where region='EU'

若要使其正常工作,需要在工作区中启用 Azure Databricks 表访问控制并应用以下权限:

  • 授予 DA-AMERICA-HRMANAGER-RDA-AMERICA-HRGENERAL-R Microsoft Entra 组对 vhr_us 视图的访问权限。
  • 授予 DA-EUROPE-HRMANAGER-RDA-EUROPE-HRGENERAL-R Microsoft Entra 组对 vhr_eu 视图的访问权限。

由于列经过加密,并且无法在机密或以下工作区中解密,因此机密或以下工作区仍可以使用 Microsoft Entra 直通身份验证,并允许用户根据其权限浏览湖。

在使用表访问时,需要访问的团队将添加到 Azure Databricks 工作区。 Azure Databricks 将使用服务主体映射到 Azure Data Lake Storage,但通过 Azure Databricks 表访问控制来保护数据。

部署新的数据产品时,DevOps 过程的一部分需要运行脚本,以在 Azure Databricks 工作区中设置表权限,并将正确的 Microsoft Entra 组添加到这些权限。

注意

Azure Databricks 表访问控制不能合并 Microsoft Entra 直通身份验证。 因此,只能使用一个 Azure Databricks 工作区并改用表访问控制。

受限的数据

除了实现机密或受限数据选项外,还建议在“专用”数据登陆区域和数据管理登陆区域中托管高度机密的数据

它允许特定的要求,例如实时访问、客户管理的加密密钥和应用于登陆区域的入站或出站限制。 本指南已经评估了如何将此类数据置于相同的数据登陆区域但位于不同的存储帐户中。 但是,它会使网络层上的解决方案(例如网络安全组等)变得复杂。

专用“受限”数据管理登陆区域应连接到“受限”数据登陆区域中的数据目录。 它应会限制谁可以在该目录中搜索此数据。

后续步骤