公司博客上

使用PII强制列级加密并避免数据复制

使用Fernet加密库、udf和Databricks秘密来不引人注目地保护PII数据
通过Keyuri沙而且Fred Kimball

2020年11月20日 公司博客上

分享这篇文章

本文是西北互惠银行首席软件工程师Keyuri Shah和软件工程师Fred Kimball的客座文章。


保护PII(个人身份信息)非常重要,因为每天暴露的数据泄露和敏感信息记录呈上升趋势。为了避免成为下一个受害者,保护用户免受身份盗窃和欺诈,我们需要整合多层数据和信息安全。

当我们使用Databricks平台时,我们需要确保bob体育客户端下载只允许正确的人访问敏感信息。使用Fernet加密库、用户定义函数(udf)和Databricks秘密的组合,Northwestern Mutual开发了一个过程来加密PII信息,并且只允许那些有业务需要的人解密它,而数据阅读器不需要额外的步骤。

保护个人身份信息的需要

如今,管理任何数量的客户数据几乎肯定需要保护PII。对于各种规模的组织来说,这是一个很大的风险,例如第一资本数据泄露由于一个简单的配置错误,导致数以百万计的敏感客户记录被盗。虽然存储设备的加密和表级的列屏蔽是有效的安全措施,但未经授权的对这些敏感数据的内部访问仍然构成重大威胁。因此,我们需要一种解决方案来限制具有文件或表访问权限的普通用户检索Databricks中的敏感信息。

但是,我们也需要那些有业务需要的人能够阅读敏感信息。我们不希望不同类型的用户读取表的方式有所不同。正常读取和解密读取都应该发生在同一个Delta Lake对象上,以简化数据分析和报表构造的查询构造。

构建流程以强制列级加密

考虑到这些安全性需求,我们试图创建一个安全、不引人注目且易于管理的流程。下图提供了此过程所需组件的高级概述

用于Databricks Delta Lake执行列级加密和保护PII数据的过程。

使用Fernet编写保护PII

这个过程的第一步是通过加密来保护数据。一个可能的解决方案是Fernet Python库。Fernet使用对称加密,它是用几个标准加密原语构建的。这个库在加密UDF中使用,该UDF使我们能够加密数据框架中的任何给定列。为了存储加密密钥,我们使用Databricks Secrets和适当的访问控制,只允许我们的数据摄取过程访问它。一旦数据被写入Delta Lake表,保存诸如社会保险号、电话号码、信用卡号和其他标识符等值的PII列将无法被未经授权的用户读取。

使用自定义UDF从视图中读取受保护的数据

一旦我们写入并保护了敏感数据,我们就需要一种方法让特权用户读取敏感数据。需要做的第一件事是创建一个永久的UDF,添加到运行在Databricks上的Hive实例中。为了使UDF是永久的,它必须用Scala编写。幸运的是,Fernet还有一个Scala实现,我们可以利用它进行解密读取。该UDF还访问我们在加密写入中用于执行解密的相同秘密,在本例中,它被添加到集群的Spark配置中。这要求我们为特权用户和非特权用户添加集群访问控制,以控制他们对密钥的访问。一旦创建了UDF,我们就可以在视图定义中使用它,以便特权用户查看解密的数据。

目前,对于单个数据集,我们有两个视图对象,分别用于特权用户和非特权用户。非特权用户的视图没有UDF,因此他们将看到PII值作为加密值。特权用户的另一个视图确实有UDF,因此他们可以根据业务需要以纯文本的形式看到解密的值。对这些视图的访问也由Databricks提供的表访问控件控制。

在不久的将来,我们希望利用Databricks的一个新特性动态视图函数.这些动态视图函数将允许我们只使用一个视图,并根据它们所属的Databricks组轻松地返回加密或解密的值。这将减少我们在Delta Lake中创建的对象数量,并简化我们的表访问控制规则。

这两种实现都允许用户进行开发或分析,而不必担心是否需要解密从视图中读取的值,并且只允许访问那些有业务需要的值。

这种方法的优点是列级加密

综上所述,使用该工艺的优点是:

  • 可以使用现有的Python或Scala库执行加密
  • 敏感的PII数据存储在Delta Lake时具有额外的安全层
  • 具有对所述对象的所有级别访问权限的用户使用相同的Delta Lake对象
  • 无论分析师是否被授权阅读PII,他们都是畅通无阻的

下面的笔记本可能会提供一些指导:

额外的资源:

Fernet库

创建永久UDF

动态视图函数

免费试用Databricks

相关的帖子

看到所有公司博客上的帖子