Docs 菜单

Docs 主页开发应用程序MongoDB Manual

在 Amazon Web Services 中使用自动 Queryable Encryption

在此页面上

  • 概述
  • 开始之前
  • 设置 KMS
  • 创建客户主密钥
  • 创建 AWS IAM 用户
  • 创建应用程序
  • 分配应用程序变量
  • 创建加密集合
  • 插入具有加密字段的文档
  • 对加密字段的查询
  • 了解详情

本指南向您展示如何构建一个应用程序,该应用程序实施 MongoDB Queryable Encryption 功能以自动加密和解密文档字段,并使用 Amazon Web Services (AWS) KMS进行密钥管理。

在完成本指南中的步骤后,您应该具有:

  • 由 Amazon Web Services KMS 托管的客户主密钥

  • 有权访问 AWS KMS 中的客户主密钥的 AWS IAM 用户

  • 有效的客户端应用程序,可使用客户主密钥插入具有加密字段的文档

提示

客户主密钥

要了解有关客户主密钥的更多信息,请阅读密钥和密钥保管库文档。

要完成并运行本指南中的代码,您需要按照安装要求页面中的步骤来设置开发环境。

提示

请参阅:完整应用程序

要查看此样本应用程序的完整代码,请选择与您的编程语言相对应的标签页,然后点击提供的链接。 每个样本应用程序存储库都包含一个 README.md文件,您可以使用该文件来了解如何设置环境和运行应用程序。

1
1
2
3

按照有关 创建对称 KMS 密钥的 AWS 官方文档创建新的对称密钥 。您创建的密钥是客户主密钥。选择有助于识别的名称和描述;这些字段不会影响您的 CMK 的功能或配置。

在密钥生成过程的 Usage Permissions步骤中,应用以下默认密钥策略,该策略使身份和访问管理 ( IAM ) 策略能够授予对您的客户主密钥的访问权限:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {
"AWS": "<ARN of your AWS account principal>"
},
"Action": "kms:*",
"Resource": "*"
}
]
}

重要

记录您的客户主密钥的 Amazon 资源名称 (ARN) 和区域。您将在本指南的后续步骤中用到它们。

提示

关键策略

要了解有关密钥策略 的更多信息,请参阅 AWS KMS 中的密钥策略 在 AWS 官方文档中。

2
1
2

按照有关 添加用户 的 AWS 官方文档,在 AWS 管理控制台中创建新的编程 IAM 用户 。您将使用此 IAM 用户作为启用了 Queryable Encryption 的应用程序的服务帐户。应用程序使用 IAM 用户通过 AWS KMS 进行身份验证,通过客户主密钥 (CMK) 对数据加密密钥 (DEK) 进行加密和解密。

重要

记录凭证

确保在创建 IAM 用户的最后一步记录以下 IAM 凭证:

  • 访问密钥 ID

  • 秘密访问密钥

您有一次机会记录这些凭证。如果在该步骤中没有记录这些凭证,则必须创建另一个 IAM 用户。

3

向您的IAM用户授予远程主密钥的kms:Encryptkms:Decrypt权限。

重要

新的客户端 IAM 用户 不应 具有主密钥的管理权限。为了确保数据安全,请遵循 最小权限原则。

以下内联策略允许 IAM 用户按照最小权限原则使用客户主密钥进行加密和解密:

注意

远程主密钥 ARN

以下策略需要您在本指南的 创建主密钥 步骤中生成的密钥的 ARN 。

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["kms:Decrypt", "kms:Encrypt"],
"Resource": "<the Amazon Resource Name (ARN) of your remote master key>"
}
]
}

要将上述策略应用于 IAM 用户,请按照 添加 IAM 身份权限 AWS 文档中的指南。

重要

在生产环境中使用 IAM 角色进行身份验证

将启用了 Queryable Encryption 的应用程序部署到生产环境时,请使用IAM角色而不是IAM用户对应用程序进行身份验证。

要了解有关 IAM 角色的更多信息,请参阅官方 AWS 文档中的以下页面:

1

本教程中的代码示例使用以下变量来执行 Queryable Encryption 工作流程:

重要

密钥保管库集合命名空间权限

密钥保管库集合位于encryption.__keyVault命名空间中。 确保应用程序用于连接到 MongoDB 的数据库用户对此命名空间具有ReadWrite权限。

2
1

创建一个包含 AWS KMS凭证的变量,其结构如下。使用您在本教程的创建 IAM 用户步骤中创建的访问密钥 ID 和秘密访问密钥。

重要

提醒:在生产环境中使用 IAM 角色进行身份验证

要使用 IAM 角色而不是 IAM 用户对应用程序进行身份验证,请在 KMS 提供程序对象中为凭证指定一个空对象。这会指示驱动程序自动从环境中检索凭证:

2

创建一个包含以下结构的客户主密钥凭证的变量。使用您在本教程的 创建客户主密钥 步骤中记录的 ARN 和地区。

3

注意

自动加密选项

自动加密选项向自动加密共享库提供配置信息,这将修改应用程序在访问加密字段时的行为。

要了解有关自动加密共享库的更多信息,请参阅Queryable Encryption 的自动加密共享库页面。

4

要创建用于加密和解密集合中数据的客户端,请使用连接 URI 和自动加密选项实例化新的MongoClient

5

要加密字段,请将其添加到加密模式中。要启用对字段的查询,请添加“查询”属性。创建加密模式,如下所示:

注意

在前面的代码示例中,“ssn”和“billing”字段都已加密,但只能查询“ssn”字段。

6

实例化ClientEncryption以访问加密助手方法的 API。

3
4

以下代码示例对加密字段执行查找查询并打印解密的数据:

上述代码示例的输出应如下所示:

{
"_id": {
"$oid": "648b384a722cb9b8392df76a"
},
"name": "Jon Doe",
"record": {
"ssn": "987-65-4320",
"billing": {
"type": "Visa",
"number": "4111111111111111"
}
},
"__safeContent__": [
{
"$binary": {
"base64": "L1NsYItk0Sg+oL66DBj6IYHbX7tveANQyrU2cvMzD9Y=",
"subType": "00"
}
}
]
}

警告

请勿修改 __safeContent__ 字段

__safeContent__字段对于 Queryable Encryption 至关重要。请勿修改此字段的内容。

要了解 Queryable Encryption 的工作原理,请参阅基础知识。

如需详细了解本指南中提到的主题,请参阅以下链接:

  • 参考页面了解有关 Queryable Encryption 组件的更多信息。

  • 在“密钥和密钥保管库”页面上了解客户主密钥和数据加密密钥的工作原理。

  • KMS 提供程序页面上了解 KMS 提供程序如何管理您的 Queryable Encryption 密钥。

← 教程