文档菜单
文档首页
/
MongoDB Shell

客户端字段级加密

在本页面上

  • 创建数据加密密钥

当与MongoDB 企业版 或 MongoDB Atlas 集群一起工作时,您可以使用mongosh 配置 客户端字段级加密 并使用加密支持进行连接。客户端字段级加密使用数据加密密钥来支持字段值的加密和解密,并将此加密密钥材料存储在密钥管理服务 (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() 命令创建 keyVault 对象

keyVault = csfleDatabaseConnection.getKeyVault();
5

使用 createKey() 命令创建数据加密密钥

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

其中

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

  • 使用getKey()通过其UUID检索创建的密钥,或者

  • 如果指定了别名,则使用getKeyByAltName()通过其别名检索密钥。

1

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

mongosh --nodb
2

为Azure密钥库配置客户端字段级加密需要有效的租户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() 命令创建 keyVault 对象

keyVault = csfleDatabaseConnection.getKeyVault();
5

使用 createKey() 命令创建数据加密密钥

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

其中

  • 第一个参数必须"azure",以指定配置的Azure密钥保管库。

  • 第二个参数必须是一个包含的文档

    • 你的 Azure Key Vault 的名称

    • 要使用的 Azure Key Vault 的 DNS 名称(例如,my-key-vault.vault.azure.net

  • 第三个参数可能是一个包含一个或多个keyAltNames的数据加密密钥数组。每个键别名必须是唯一的。getKeyVault()会在keyAltNames上创建一个唯一索引,以确保如果不存在的话,该字段的唯一性得到强制执行。键别名简化了数据加密密钥的可查找性。

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

  • 使用getKey()通过其UUID检索创建的密钥,或者

  • 如果指定了别名,则使用getKeyByAltName()通过其别名检索密钥。

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() 命令创建 keyVault 对象

keyVault = csfleDatabaseConnection.getKeyVault();
5

使用 createKey() 命令创建数据加密密钥

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

其中

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

  • 第二个参数必须是一个包含的文档

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

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

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

    • keyname是您的密钥名称。

  • 第三个参数可能是一个包含一个或多个keyAltNames的数据加密密钥数组。每个键别名必须是唯一的。getKeyVault()会在keyAltNames上创建一个唯一索引,以确保如果不存在的话,该字段的唯一性得到强制执行。键别名简化了数据加密密钥的可查找性。

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

  • 使用getKey()通过其UUID检索创建的密钥,或者

  • 如果指定了别名,则使用getKeyByAltName()通过其别名检索密钥。

1

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

mongosh --nodb
2

为了配置本地管理的密钥的客户端字段级加密,您必须指定一个没有换行符的96字节base64编码的字符串。在 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() 命令创建 keyVault 对象

keyVault = csfleDatabaseConnection.getKeyVault();
6

使用 createKey() 命令创建数据加密密钥

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

其中

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

  • 第二个参数可以是一个包含一个或多个数据加密密钥的keyAltNames的数组。每个密钥别名必须是唯一的getKeyVault()keyAltNames上创建一个唯一索引,以强制字段唯一性(如果尚不存在)。密钥别名方便查找数据加密密钥。

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

  • 使用getKey()通过其UUID检索创建的密钥,或者

  • 如果指定了别名,则使用getKeyByAltName()通过其别名检索密钥。

提示

另请参阅

返回

运行聚合管道