对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

在 Amazon Web Services 中使用自动 Queryable Encryption

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

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

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

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

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

提示

客户主密钥

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

要完成并运行本指南中的代码,您需要设立开发环境,如安装Queryable Encryption兼容的驱动程序和依赖项页面所示。

提示

请参阅:完整应用程序

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

1

按照有关创建对称 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 官方文档中的 AWS KMS 中的密钥策略。

2

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

重要

记录凭证

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

  • 访问密钥 ID

  • 秘密访问密钥

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

向该 IAM 用户授予远程主密钥的 kms:Encrypt 和 kms: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 用户,请遵守 AWS 文档中的添加 IAM 身份权限指南。

重要

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

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

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

1

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

  • kmsProviderName - 您用于存储客户主密钥的KMS 。 在本教程中,将此变量设置为"aws" 。

  • uri - 您的MongoDB 部署连接 URI。 在MONGODB_URI环境变量中设置连接 URI 或直接替换该值。

  • keyVaultDatabaseName - MongoDB 中将存储您的数据加密密钥 (DEK) 的数据库。将此变量设置为 "encryption"。

  • keyVaultCollectionName - MongoDB 中将存储您的 DEK 的集合。 将此变量设置为"__keyVault" 。

  • keyVaultNamespace - MongoDB中将存储您的 DEK 的命名空间。 将此变量设置为keyVaultDatabaseName和keyVaultCollectionName变量的值,并用句点分隔。

  • cryptoDatabaseName - MongoDB 中将存储您的加密数据的数据库。将此变量设置为 "medicalRecords"。

  • cryptoCollectionName - MongoDB 中将存储您的加密数据的集合。将此变量设置为 "patients"。

您可以使用以下代码来声明这些变量:

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"const kmsProviderName = "<Your KMS Provider Name>";const uri = process.env.MONGODB_URI; // Your connection URIconst keyVaultDatabaseName = "encryption";const keyVaultCollectionName = "__keyVault";const keyVaultNamespace = `${keyVaultDatabaseName}.${keyVaultCollectionName}`;const encryptedDatabaseName = "medicalRecords";const encryptedCollectionName = "patients";

重要

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

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

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您也可以直接在代码中替换这些值。

要了解如何设置这些环境变量,请参阅 GitHub 上的示例应用程序中包含的 README.md 文件。

2

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

kmsProviderCredentials = { aws: { accessKeyId: process.env["AWS_ACCESS_KEY_ID"], // Your AWS access key ID secretAccessKey: process.env["AWS_SECRET_ACCESS_KEY"], // Your AWS secret access key },};

重要

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

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

kmsProviders = { aws: { }};

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

customerMasterKeyCredentials = { key: process.env["AWS_KEY_ARN"], // Your AWS Key ARN region: process.env["AWS_KEY_REGION"], // Your AWS Key Region};

创建一个包含以下选项的autoEncryptionOptions对象:

  • 密钥保管库集合的命名空间

  • kmsProviderCredentials对象,其中包含您的 Amazon Web Services KMS 档案

const autoEncryptionOptions = { keyVaultNamespace: keyVaultNamespace, kmsProviders: kmsProviderCredentials,};

注意

自动加密选项

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

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

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

const encryptedClient = Mongo(uri, autoEncryptionOptions);

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

const encryptedFieldsMap = { encryptedFields: { fields: [ { path: "patientRecord.ssn", bsonType: "string", queries: { queryType: "equality" }, }, { path: "patientRecord.billing", bsonType: "object", }, ], },};

注意

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

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

const clientEncryption = encryptedClient.getClientEncryption()

使用可通过ClientEncryption类访问的加密助手方法创建加密集合。 此方法自动为加密字段生成数据加密密钥并创建加密集合:

await clientEncryption.createEncryptedCollection( encryptedDatabaseName, encryptedCollectionName, { provider: kmsProviderName, createCollectionOptions: encryptedFieldsMap, masterKey: customerMasterKeyCredentials, });
3

创建描述患者个人信息的示例文档。使用加密的客户端将其插入到 patients 集合中,如以下示例所示:

const patientDocument = { patientName: "Jon Doe", patientId: 12345678, patientRecord: { ssn: "987-65-4320", billing: { type: "Visa", number: "4111111111111111", }, },}; const encryptedCollection = encryptedClient.getDB(encryptedDatabaseName).getCollection(encryptedCollectionName); const insertResult = await encryptedCollection.insertOne(patientDocument);
4

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

const findResult = await encryptedCollection.findOne({ "patientRecord.ssn": "987-65-4320",});console.log(findResult);

上述代码示例的输出应类似于以下内容:

{ "_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基础知识。

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

  • 有关 Queryable Encryption 组件的更多信息,请参阅参考页面。

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

  • 在 KMS 提供商页面上查看 KMS 提供商如何管理您的可查询加密密钥。