使用MongoDB Enterprise或MongoDB Atlas 群集时,可以使用mongosh 配置Queryable Encryption或客户端字段级加密,并使用加密支持进行连接。 Queryable Encryption和 CSFLE 都使用数据加密密钥来支持字段值的加密和解密,并将此加密密钥材料存储在密钥管理服务 ( KMS) 中。
mongosh 支持以下KMS提供商与Queryable Encryption和CSFLE一起使用:
Amazon Web Services KMS
Azure Key Vault
Google Cloud Platform KMS
本地托管密钥文件
创建数据加密密钥
以下过程使用 mongosh 创建用于字段级加密的数据加密密钥。
使用以下标签页选择适合您的部署的 KMS:
启动 Shellmongoshshell 。
使用 --nodb 选项在不连接到正在运行的数据库的情况下创建 mongosh 会话:
mongosh --nodb
创建加密配置。
为 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_ID 和 YOUR_AWS_SECRET_ACCESS_KEY 的值。
支持加密连接。
在mongosh 中,使用Mongo() 构造函数建立与目标集群的数据库连接。将 AutoEncryptionOpts文档指定为 Mongo()构造函数的第二个参数,为客户端字段级加密配置连接:
csfleDatabaseConnection = Mongo( "mongodb://replaceMe.example.net:27017/?replicaSet=myMongoCluster", autoEncryptionOpts )
将 replaceMe.example.net URI 替换为目标集群的连接字符串。
创建密钥保管库对象。
keyVault使用getKeyVault() Shell方法创建 对象:
keyVault = csfleDatabaseConnection.getKeyVault();
创建加密密钥。
使用createKey() Shell方法创建数据加密密钥:
keyVault.createKey( "aws", { region: "regionname", key: "awsarn" }, [ "keyAlternateName" ] )
其中:
第一个参数必须 为
"aws"才能指定已配置的 Amazon Web Services KMS。第二个参数必须 是包含以下内容的文档:
要连接到的Amazon Web Services地区,例如
us-west-2Amazon Web Services 客户主密钥 (CMK) 的 Amazon 资源名称 (ARN)。
第三个参数可以是数据加密密钥的一个或多个
keyAltNames的大量。每个密钥备用名称必须是唯一的。getKeyVault()会在keyAltNames上创建唯一索引,以实施字段的唯一性(如果尚不存在)。密钥备用名称有利于数据加密密钥的查找。
如果成功,createKey() 将返回新数据加密密钥的 UUID。要从密钥保管库检索新的数据加密密钥文档,请执行以下任一操作:
使用
getKey()通过 UUID检索创建的密钥,或者使用
getKeyByAltName()按备用名称检索密钥(如果已指定)。
启动 Shellmongoshshell 。
使用 --nodb 选项在不连接到正在运行的数据库的情况下创建 mongosh 会话:
mongosh --nodb
创建加密配置。
为 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_ID 、 YOUR_CLIENT_ID和YOUR_CLIENT_SECRET的值。
支持加密连接。
在mongosh 中,使用Mongo() 构造函数建立与目标集群的数据库连接。将 AutoEncryptionOpts文档指定为 Mongo()构造函数的第二个参数,为客户端字段级加密配置连接:
csfleDatabaseConnection = Mongo( "mongodb://replaceMe.example.net:27017/?replicaSet=myMongoCluster", autoEncryptionOpts )
将 replaceMe.example.net URI 替换为目标集群的连接字符串。
创建密钥保管库对象。
keyVault使用getKeyVault() Shell方法创建 对象:
keyVault = csfleDatabaseConnection.getKeyVault();
创建加密密钥。
使用createKey() Shell方法创建数据加密密钥:
keyVault.createKey( "azure", { keyName: "keyvaultname", keyVaultEndpoint: "endpointname" }, [ "keyAlternateName" ] )
其中:
第一个参数必须是
"azure"才能指定已配置的Azure Key Vault。第二个参数必须是包含以下内容的文档:
要使用的 Azure Key Vault 的 DNS 名称(例如
my-key-vault.vault.azure.net)
第三个参数可以是数据加密密钥的一个或多个
keyAltNames的大量。每个密钥备用名称必须是唯一的。getKeyVault()会在keyAltNames上创建唯一索引,以实施字段的唯一性(如果尚不存在)。密钥备用名称有利于数据加密密钥的查找。
如果成功,createKey() 将返回新数据加密密钥的 UUID。要从密钥保管库检索新的数据加密密钥文档,请执行以下任一操作:
使用
getKey()通过 UUID检索创建的密钥,或者使用
getKeyByAltName()按备用名称检索密钥(如果已指定)。
启动 Shellmongoshshell 。
使用 --nodb 选项在不连接到正在运行的数据库的情况下创建 mongosh 会话:
mongosh --nodb
创建加密配置。
为GCP KMS配置客户端字段级加密需要GCP电子邮件及其关联的私钥。
在 mongosh 中创建一个新的 AutoEncryptionOpts 变量,用于存储客户端字段级加密配置,其中包含这些凭证:
var autoEncryptionOpts = { "keyVaultNamespace" : "encryption.__dataKeys", "kmsProviders" : { "gcp" : { "email" : "YOUR_GCP_EMAIL", "privateKey" : "YOUR_GCP_PRIVATEKEY" } } }
酌情填写 YOUR_GCP_EMAIL 和 YOUR_GCP_PRIVATEKEY 的值。
支持加密连接。
在mongosh 中,使用Mongo() 构造函数建立与目标集群的数据库连接。将 AutoEncryptionOpts文档指定为 Mongo()构造函数的第二个参数,为客户端字段级加密配置连接:
csfleDatabaseConnection = Mongo( "mongodb://replaceMe.example.net:27017/?replicaSet=myMongoCluster", autoEncryptionOpts )
将 replaceMe.example.net URI 替换为目标集群的连接字符串。
创建密钥保管库对象。
keyVault使用getKeyVault() Shell方法创建 对象:
keyVault = csfleDatabaseConnection.getKeyVault();
创建加密密钥。
使用createKey() Shell方法创建数据加密密钥:
keyVault.createKey( "gcp", { projectId: "projectid", location: "locationname", keyRing: "keyringname", keyName: "keyname" }, [ "keyAlternateName" ] )
其中:
第一个参数必须是
"gcp",以指定已配置的Google Cloud Platform KMS 。第二个参数必须是包含以下内容的文档
projectid是GCP项目的名称,例如my-projectlocationname是KMS密钥环的位置,例如globalkeyringname是KMS密钥环的名称,例如my-keyringkeyname是密钥的名称。
第三个参数可以是数据加密密钥的一个或多个
keyAltNames的大量。每个密钥备用名称必须是唯一的。getKeyVault()会在keyAltNames上创建唯一索引,以实施字段的唯一性(如果尚不存在)。密钥备用名称有利于数据加密密钥的查找。
如果成功,createKey() 将返回新数据加密密钥的 UUID。要从密钥保管库检索新的数据加密密钥文档,请执行以下任一操作:
使用
getKey()通过 UUID检索创建的密钥,或者使用
getKeyByAltName()按备用名称检索密钥(如果已指定)。
启动 Shellmongoshshell 。
使用 --nodb 选项在不连接到正在运行的数据库的情况下创建 mongosh 会话:
mongosh --nodb
创建加密配置。
在mongosh 中,创建一个新的 AutoEncryptionOpts 变量用于存储客户端字段级加密配置,并将MY_LOCAL_KEY 替换为在步骤1 中生成的密钥:
var autoEncryptionOpts = { "keyVaultNamespace" : "encryption.__dataKeys", "kmsProviders" : { "local" : { "key" : BinData(0, "MY_LOCAL_KEY") } } }
支持加密连接。
在mongosh 中,使用Mongo() 构造函数建立与目标集群的数据库连接。将 AutoEncryptionOpts文档指定为 Mongo()构造函数的第二个参数,为客户端字段级加密配置连接:
csfleDatabaseConnection = Mongo( "mongodb://replaceMe.example.net:27017/?replicaSet=myMongoCluster", autoEncryptionOpts )
创建密钥保管库对象。
keyVault使用getKeyVault() Shell方法创建 对象:
keyVault = csfleDatabaseConnection.getKeyVault();
创建加密密钥。
使用createKey() Shell方法创建数据加密密钥:
keyVault.createKey( "local", [ "keyAlternateName" ] )
其中:
第一个参数必须为
local才能指定配置的本地管理密钥。第二个参数可以是数据加密密钥的一个或多个
keyAltNames的大量。每个密钥备用名称必须是唯一的。getKeyVault()会在keyAltNames上创建唯一索引,以实施字段的唯一性(如果尚不存在)。密钥备用名称有利于数据加密密钥的查找。
如果成功,createKey() 将返回新数据加密密钥的 UUID。要从密钥保管库检索新的数据加密密钥文档,请执行以下任一操作:
使用
getKey()通过 UUID检索创建的密钥,或者使用
getKeyByAltName()按备用名称检索密钥(如果已指定)。