旋转和重包装加密密钥
在本指南中,您可以学习如何使用密钥管理系统(KMS)在您的应用程序中管理您的加密密钥。
概述
本程序演示了如何使用mongosh
来旋转可查询加密的加密密钥。旋转数据加密密钥(DEK)涉及使用新的客户主密钥(CMK)对其进行重新包装,因此“旋转”和“重新包装”这两个术语有时可以互换使用。
完成本指南后,您应能够在密钥管理系统上旋转您的客户主密钥(CMK),然后使用新的CMK重新包装您的密钥库集合中现有的DEK。
警告
在旋转密钥之前,请确认它们在删除之前没有被用于加密任何密钥或数据。如果您删除了一个DEK,则使用该DEK加密的所有字段将永久无法读取。如果您删除了一个CMK,则使用该CMK加密的所有字段将永久无法读取。
相关信息
有关本程序中包含的概念的详细说明,请参阅以下主题。
有关密钥和密钥库的更多信息,请参阅加密密钥和密钥库。要查看支持的KMS提供程序的列表,请参阅KMS提供程序页面。
有关如何使用每个支持的KMS提供程序设置可查询加密启用应用程序的教程,请参阅概述:启用可查询加密。
步骤
在密钥管理系统上旋转您的客户主密钥
旋转您的CMK的过程取决于您的KMS提供商。有关详细信息,请参阅密钥提供商的文档。
AWS: 旋转 AWS KMS 密钥
Azure: 在Azure Key Vault中配置加密密钥自动轮换
GCP: 轮换密钥
一旦您轮换了CMK,MongoDB将使用它来包装所有新的DEK。要重新包装现有的DEK,请继续以下步骤。
使用KeyVault.rewrapManyDataKey()
轮换数据加密密钥
《KeyVault.rewrapManyDataKey()》方法会自动解密多个数据加密密钥,并使用指定的CMK重新加密它们。然后,它会更新密钥库集合中的密钥。
该方法具有以下语法
let keyVault = db.getMongo().getKeyVault() keyVault.rewrapManyDataKey( { "<Query filter document>" }, { provider: "<KMS provider>", masterKey: { "<dataKeyOpts Key>" : "<dataKeyOpts Value>" } } )
指定一个查询过滤器文档来选择要旋转的密钥,或者省略参数以旋转密钥库集合中的所有密钥
如果您指定了查询过滤器文档,但没有密钥匹配,则不会旋转任何密钥。
指定KMS提供商
使用新的CMK指定
masterKey
,或省略参数以使用现有CMK旋转密钥
在用新的CMK重新包装后,您的DEK本身保持不变。密钥旋转过程是无缝的,不会中断您的应用程序。