执行与PII列级加密,避免数据重复
2020年11月20日 在公司博客上
这篇文章通过Keyuri国王,带领软件工程师,Fred Kimball,软件工程师,西北相互的。
保护PII(个人身份信息)是非常重要的数据泄露和记录的数量与敏感信息暴露每天向上趋势。为了避免成为下一个受害者和保护用户身份盗窃和欺诈,我们需要把多层的数据和信息安全。
当我们使用砖平台,我们需要确保我们只允许正确的人对bob体育客户端下载敏感信息的访问。使用结合Fernet加密库,用户定义函数(udf)和砖的秘密,西北PII相互已经开发了一个程序加密信息,只允许那些有业务需要解密,没有额外的步骤读者所需的数据。
PII保护的必要性
管理任何数量的客户数据PII这些天几乎肯定需要保护。这是一个大的风险情况下,如各种规模的组织资本一个数据违反导致数以百万计的敏感客户记录被盗由于一个简单的配置错误。而加密的存储设备和column-masking在表级别是有效的安全措施,未经授权的内部访问敏感数据仍然构成了重大威胁。因此,我们需要一个解决方案限制普通用户检索的文件或表访问敏感信息在砖。
然而,我们还需要那些有业务需要读取敏感信息能够这样做。我们不希望有不同的每种类型的用户如何读取表。正常和解密读取都应该发生在同一个三角洲湖对象来简化查询数据分析和报告建设施工。
构建过程执行列级加密
鉴于这些安全需求,我们试图创建一个过程是安全的,低调的,容易管理。以下图提供了一个高度概括这一过程所需的组件
与Fernet PII写保护
这个过程的第一步是通过加密来保护数据。一个可能的解决方案是Fernet Python库。Fernet使用对称加密,建立一些标准加密原语。这个图书馆是加密中使用UDF将使我们dataframe加密任何给定的列。存储加密密钥,我们使用砖秘密访问控制,只允许数据摄入过程来访问它。一旦数据被写入我们的三角洲湖表、PII列持有的价值观如社会安全号码、电话号码、信用卡号码和其他未经授权的用户标识符将无法阅读。
阅读受保护的数据从一个视图定制UDF
一旦我们有书面和保护敏感数据,我们需要一种方法对特权用户的敏感数据。需要做的第一件事是创建一个永久的UDF的蜂巢实例运行在砖上。为了让一个UDF是永久性的,必须用Scala编写的。幸运的是,Fernet还有一个Scala实现,我们可以利用解密。这个UDF还访问相同的秘密我们写执行解密,加密中使用,在这种情况下,它被添加到火花集群的配置。这要求我们增加集群为特权和非特权用户访问控制来控制他们的访问键。UDF创建之后,我们可以使用它在我们的视图定义特权用户的数据进行解密。
目前,我们有两个视图对象为单个数据集,分别为特权和非特权用户。非特权用户的观点没有UDF,所以他们会看到PII值作为加密的值。的其他视图特权用户确实有UDF,所以他们可以看到解密值在纯文本为他们的业务需求。访问控制的这些观点也表提供的访问控制数据砖。
在不久的将来,我们要利用新砖特性动态视图功能。这些动态视图函数允许我们只使用一个视图和轻松地返回加密或解密值基于砖集团的一员。这将减少我们在三角洲湖创建对象和简化我们的表访问控制规则。
实现允许用户做开发或分析而不用担心他们是否需要解密值读取视图,仅允许访问那些业务需求。
这种方法的优点列级加密
总之,使用这个过程的优点是:
- 加密可以使用现有的执行Python或Scala库
- PII敏感数据时,一个附加的安全层存储在三角洲湖
- 使用同一个三角洲湖对象表示用户提供所有级别的访问对象
- 分析师通畅PII是否有权阅读
这可能是什么样子的一个例子,下面的笔记本电脑可能会提供一些指导:
额外的资源:
Fernet库
创建永久UDF
动态视图功能