Docs 菜单
Docs 主页
/
MongoDB Shell

客户端字段级加密 (Client-Side Field Level Encryption)

在此页面上

  • 创建数据加密密钥

使用 MongoDB Enterprise或MongoDB Atlas cluster时,您可以使用 mongosh 配置客户端字段级加密并通过加密支持进行连接。 客户端字段级加密使用数据加密密钥来支持字段值的加密和解密,并将此加密密钥材料存储在 KMS ( KMS ) 中。

mongosh 支持以下 KMS 提供程序用于客户端字段级加密:

  • Amazon Web Services KMS

  • Azure Key Vault

  • Google Cloud Platform KMS

  • 本地托管密钥文件

以下过程使用 mongosh 创建用于客户端字段级加密和解密的数据加密密钥。

使用以下标签页选择适合您部署的 KMS

1

使用 --nodb选项创建一个mongosh会话,而不连接到运行的数据库:

mongosh --nodb
2

为 AWS KMS 配置客户端字段级加密需要一个 AWS 访问密钥 ID 及其相关的秘密访问密钥。AWS 访问密钥必须与具有 KMS 服务的所有列出读取 权限的 IAM 用户相对应。

mongosh 中创建一个新的 AutoEncryptionOpts 变量,用于存储客户端字段级加密配置,其中包含这些凭证:

var autoEncryptionOpts = {
"keyVaultNamespace" : "encryption.__dataKeys",
"kmsProviders" : {
"aws" : {
"accessKeyId" : "YOUR_AWS_ACCESS_KEY_ID",
"secretAccessKey" : "YOUR_AWS_SECRET_ACCESS_KEY"
}
}
}

酌情填写 YOUR_AWS_ACCESS_KEY_IDYOUR_AWS_SECRET_ACCESS_KEY 的值。

3

mongosh 中,使用 Mongo() 构造函数建立与目标集群的数据库连接。将 AutoEncryptionOpts 文档指定为 Mongo() 构造函数的第二个参数,以便为客户端字段级加密配置连接:

csfleDatabaseConnection = Mongo(
"mongodb://replaceMe.example.net:27017/?replicaSet=myMongoCluster",
autoEncryptionOpts
)

replaceMe.example.net URI 替换为目标集群的连接字符串。

4

使用 getKeyVault() shell 方法创建 keyVault 对象:

keyVault = csfleDatabaseConnection.getKeyVault();
5

使用 createKey() shell 方法创建数据加密密钥:

keyVault.createKey(
"aws",
{ region: "regionname", key: "awsarn" },
[ "keyAlternateName" ]
)

其中:

如果成功,createKey() 将返回新数据加密密钥的 UUID。要从密钥保管库检索新的数据加密密钥文档,请执行以下任一操作:

1

使用 --nodb 选项在不连接到正在运行的数据库的情况下创建 mongosh 会话:

mongosh --nodb
2

为 Azure Key Vault 配置客户端字段级加密需要有效的租户 ID、客户端 ID 和客户端密钥。

mongosh 中创建一个新的 AutoEncryptionOpts 变量,用于存储客户端字段级加密配置,其中包含这些凭证:

var autoEncryptionOpts = {
"keyVaultNamespace" : "encryption.__dataKeys",
"kmsProviders" : {
"azure" : {
"tenantId" : "YOUR_TENANT_ID",
"clientId" : "YOUR_CLIENT_ID",
"clientSecret" : "YOUR_CLIENT_SECRET"
}
}
}

根据需要填写YOUR_TENANT_IDYOUR_CLIENT_IDYOUR_CLIENT_SECRET的值。

3

mongosh 中,使用 Mongo() 构造函数建立与目标集群的数据库连接。将 AutoEncryptionOpts 文档指定为 Mongo() 构造函数的第二个参数,以便为客户端字段级加密配置连接:

csfleDatabaseConnection = Mongo(
"mongodb://replaceMe.example.net:27017/?replicaSet=myMongoCluster",
autoEncryptionOpts
)

replaceMe.example.net URI 替换为目标集群的连接字符串。

4

使用 getKeyVault() shell 方法创建 keyVault 对象:

keyVault = csfleDatabaseConnection.getKeyVault();
5

使用 createKey() shell 方法创建数据加密密钥:

keyVault.createKey(
"azure",
{ keyName: "keyvaultname", keyVaultEndpoint: "endpointname" },
[ "keyAlternateName" ]
)

其中:

  • 第一个参数必须"azure"才能指定已配置的Azure Key Vault。

  • 第二个参数必须是包含以下内容的文档:

  • 第三个参数可以 是一个或多个 keyAltNames 的数组,用于数据加密密钥。每个密钥备用名称必须 是唯一的。getKeyVault()keyAltNames 上创建一个唯一索引,以便在字段上执行唯一性(如果还不存在的话)。密钥备用名称有利于数据加密密钥的查找。

如果成功,createKey() 将返回新数据加密密钥的 UUID。要从密钥保管库检索新的数据加密密钥文档,请执行以下任一操作:

1

使用 --nodb 选项在不连接到正在运行的数据库的情况下创建 mongosh 会话:

mongosh --nodb
2

为GCP KMS配置客户端字段级加密需要GCP电子邮件及其关联的私钥。

mongosh 中创建一个新的 AutoEncryptionOpts 变量,用于存储客户端字段级加密配置,其中包含这些凭证:

var autoEncryptionOpts = {
"keyVaultNamespace" : "encryption.__dataKeys",
"kmsProviders" : {
"gcp" : {
"email" : "YOUR_GCP_EMAIL",
"privateKey" : "YOUR_GCP_PRIVATEKEY"
}
}
}

酌情填写 YOUR_GCP_EMAILYOUR_GCP_PRIVATEKEY 的值。

3

mongosh 中,使用 Mongo() 构造函数建立与目标集群的数据库连接。将 AutoEncryptionOpts 文档指定为 Mongo() 构造函数的第二个参数,以便为客户端字段级加密配置连接:

csfleDatabaseConnection = Mongo(
"mongodb://replaceMe.example.net:27017/?replicaSet=myMongoCluster",
autoEncryptionOpts
)

replaceMe.example.net URI 替换为目标集群的连接字符串。

4

使用 getKeyVault() shell 方法创建 keyVault 对象:

keyVault = csfleDatabaseConnection.getKeyVault();
5

使用 createKey() shell 方法创建数据加密密钥:

keyVault.createKey(
"gcp",
{ projectId: "projectid",
location: "locationname",
keyRing: "keyringname",
keyName: "keyname"
},
[ "keyAlternateName" ]
)

其中:

  • 第一个参数必须"gcp",以指定已配置的Google Cloud Platform KMS 。

  • 第二个参数必须是包含以下内容的文档

    • projectid 是GCP项目的名称,例如 my-project

    • locationname 是KMS密钥环的位置,例如 global

    • keyringname 是KMS密钥环的名称,例如 my-keyring

    • keyname 是密钥的名称。

  • 第三个参数可以 是一个或多个 keyAltNames 的数组,用于数据加密密钥。每个密钥备用名称必须 是唯一的。getKeyVault()keyAltNames 上创建一个唯一索引,以便在字段上执行唯一性(如果还不存在的话)。密钥备用名称有利于数据加密密钥的查找。

如果成功,createKey() 将返回新数据加密密钥的 UUID。要从密钥保管库检索新的数据加密密钥文档,请执行以下任一操作:

1

使用 --nodb 选项在不连接到正在运行的数据库的情况下创建 mongosh 会话:

mongosh --nodb
2

若要为本地托管密钥配置客户端字段级加密,必须指定一个不带换行符的 64 编码的 96 字节字符串。在 mongosh 中运行以下命令以生成符合这些要求的密钥:

crypto.randomBytes(96).toString('base64')

您将在下一步中需要此密钥。

3

mongosh 中创建一个新的 AutoEncryptionOpts 变量,用于存储客户端字段级加密配置,并将 MY_LOCAL_KEY 替换为步骤 1 中生成的密钥:

var autoEncryptionOpts = {
"keyVaultNamespace" : "encryption.__dataKeys",
"kmsProviders" : {
"local" : {
"key" : BinData(0, "MY_LOCAL_KEY")
}
}
}
4

mongosh 中,使用 Mongo() 构造函数建立与目标集群的数据库连接。将 AutoEncryptionOpts 文档指定为 Mongo() 构造函数的第二个参数,以便为客户端字段级加密配置连接:

csfleDatabaseConnection = Mongo(
"mongodb://replaceMe.example.net:27017/?replicaSet=myMongoCluster",
autoEncryptionOpts
)
5

使用 getKeyVault() shell 方法创建 keyVault 对象:

keyVault = csfleDatabaseConnection.getKeyVault();
6

使用 createKey() shell 方法创建数据加密密钥:

keyVault.createKey(
"local",
[ "keyAlternateName" ]
)

其中:

  • 第一个参数必须local 才能指定配置的本地管理密钥。

  • 第二个参数可以是数据加密密钥的一个或多个keyAltNames的大量。 每个密钥备用名称必须是唯一的。 getKeyVault()keyAltNames上创建唯一索引,以实施字段的唯一性(如果尚不存在)。 密钥备用名称有利于数据加密密钥的查找。

如果成功,createKey() 将返回新数据加密密钥的 UUID。要从密钥保管库检索新的数据加密密钥文档,请执行以下任一操作:

提示

另请参阅:

后退

运行聚合管道