客户端字段级加密 (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 :
启动 Shellmongosh
shell 。
使用 --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 替换为目标集群的连接字符串。
创建密钥保管库对象。
使用 getKeyVault()
shell 方法创建 keyVault
对象:
keyVault = csfleDatabaseConnection.getKeyVault();
创建加密密钥。
使用 createKey()
shell 方法创建数据加密密钥:
keyVault.createKey( "aws", { region: "regionname", key: "awsarn" }, [ "keyAlternateName" ] )
其中:
第一个参数必须 为
"aws"
才能指定已配置的 Amazon Web Services KMS。第二个参数必须 是包含以下内容的文档:
要连接到的Amazon Web Services地区,例如
us-west-2
Amazon资源名称 (ARN) Amazon Web Services客户主密钥 (集合扫描)。
第三个参数可以 是一个或多个
keyAltNames
的数组,用于数据加密密钥。每个密钥备用名称必须 是唯一的。getKeyVault()
在keyAltNames
上创建一个唯一索引,以便在字段上执行唯一性(如果还不存在的话)。密钥备用名称有利于数据加密密钥的查找。
如果成功,createKey()
将返回新数据加密密钥的 UUID。要从密钥保管库检索新的数据加密密钥文档,请执行以下任一操作:
使用
getKey()
通过其 UUID 检索创建的密钥,或使用
getKeyByAltName()
按指定的备用名称检索密钥。
启动 Shellmongosh
shell 。
使用 --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 替换为目标集群的连接字符串。
创建密钥保管库对象。
使用 getKeyVault()
shell 方法创建 keyVault
对象:
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()
按指定的备用名称检索密钥。
启动 Shellmongosh
shell 。
使用 --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 替换为目标集群的连接字符串。
创建密钥保管库对象。
使用 getKeyVault()
shell 方法创建 keyVault
对象:
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-project
locationname
是KMS密钥环的位置,例如global
keyringname
是KMS密钥环的名称,例如my-keyring
keyname
是密钥的名称。
第三个参数可以 是一个或多个
keyAltNames
的数组,用于数据加密密钥。每个密钥备用名称必须 是唯一的。getKeyVault()
在keyAltNames
上创建一个唯一索引,以便在字段上执行唯一性(如果还不存在的话)。密钥备用名称有利于数据加密密钥的查找。
如果成功,createKey()
将返回新数据加密密钥的 UUID。要从密钥保管库检索新的数据加密密钥文档,请执行以下任一操作:
使用
getKey()
通过其 UUID 检索创建的密钥,或使用
getKeyByAltName()
按指定的备用名称检索密钥。
启动 Shellmongosh
shell 。
使用 --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 )
创建密钥保管库对象。
使用 getKeyVault()
shell 方法创建 keyVault
对象:
keyVault = csfleDatabaseConnection.getKeyVault();
创建加密密钥。
使用 createKey()
shell 方法创建数据加密密钥:
keyVault.createKey( "local", [ "keyAlternateName" ] )
其中:
第一个参数必须为
local
才能指定配置的本地管理密钥。第二个参数可以是数据加密密钥的一个或多个
keyAltNames
的大量。 每个密钥备用名称必须是唯一的。getKeyVault()
在keyAltNames
上创建唯一索引,以实施字段的唯一性(如果尚不存在)。 密钥备用名称有利于数据加密密钥的查找。
如果成功,createKey()
将返回新数据加密密钥的 UUID。要从密钥保管库检索新的数据加密密钥文档,请执行以下任一操作:
使用
getKey()
通过其 UUID 检索创建的密钥,或使用
getKeyByAltName()
按指定的备用名称检索密钥。