数据安全是组织将其数据仓库从本地迁移到云优先系统(例如BigQuery )的主要关注点。除了存储级加密,无论是使用 Google 管理的还是客户管理的密钥,BigQuery 还提供列级加密。使用 BigQuery 的SQL AEAD 函数,组织可以实施更精细的加密级别,以帮助保护敏感的客户数据,例如政府身份或信用卡号码,并帮助遵守安全要求。
虽然 BigQuery 在云中提供列级加密,但许多组织在混合云环境中运营。为了防止数据每次在不同位置之间移动时都需要解密和重新加密的情况,Google Cloud 提供了一致且可互操作的加密机制。这使得确定性加密的数据(保持参照完整性)能够立即与本地表连接以进行匿名分析。
要在本地实现与 BigQuery 兼容的加密,客户可以使用Google 开发的开源加密库Tink 。BigQuery 使用 Tink 来实现其 SQL AEAD 函数。我们可以直接使用 Tink 库以一种稍后可以在云中使用 BigQuery SQL 解密的方式对本地数据进行加密,并在 BigQuery 外部解密 BigQuery 的列级加密数据。
对于想要将 Tink 与 BigQuery 结合使用的客户,我们在BigQuery Tink Toolkit GitHub 存储库中汇总了一些有用的 Python 实用程序和示例。让我们首先通过一个示例来了解如何使用用于 BigQuery 的相同密钥集直接使用 Tink 来加密或解密本地数据,然后介绍 BigQuery Tink Toolkit 如何帮助简化 Tink 的使用。
首先,我们需要检索 Tink 密钥集。我们假设正在使用 KMS 封装的密钥集。这些键集需要存储在 BigQuery 中才能与 BigQuery SQL 一起使用。如果需要,它们也可以复制到本地的二级商店。
现在我们有了加密的密钥集,我们需要将其解包以检索可用的 Tink 密钥集。如果无法从本地访问 Cloud KMS,则需要将解包的密钥集保存在本地的安全密钥库中。
我们现在可以使用密钥集生成 Tink 原语。这可用于使用关联的密钥集加密或解密数据。请注意,应根据密钥集是用于确定性密钥还是非确定性密钥来使用不同的原语。
一旦我们有了密码,我们就可以根据需要使用它来加密或解密数据。
我们提供了CipherManager 类来帮助简化这个过程,它处理四个操作:
从 BigQuery 表中检索所需的键集
解开那些键集
为每列创建一个 Tink 密码
提供一致的接口来调用加密和解密。
我们还提供了一个示例Spark 作业,该作业展示了如何使用 CipherManager 来加密或解密给定表的列。我们希望这些工具能派上用场——愉快的Tinkering。