客户端字段级加密
在本页面上
当与MongoDB 企业版 或 MongoDB Atlas 集群一起工作时,您可以使用mongosh
配置 客户端字段级加密 并使用加密支持进行连接。客户端字段级加密使用数据加密密钥来支持字段值的加密和解密,并将此加密密钥材料存储在密钥管理服务 (KMS) 中。
mongosh
支持以下 KMS 提供程序用于客户端字段级加密
Amazon Web Services KMS
Azure Key Vault
Google Cloud Platform KMS
本地管理密钥文件
创建数据加密密钥
以下过程使用 mongosh
创建用于客户端字段级加密和解密的数据加密密钥。
使用下面的标签选择适合您部署的KMS
启动 mongosh
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()
命令创建 keyVault
对象
keyVault = csfleDatabaseConnection.getKeyVault();
创建加密密钥。
使用 createKey()
命令创建数据加密密钥
keyVault.createKey( "aws", { region: "regionname", key: "awsarn" }, [ "keyAlternateName" ] )
其中
第一个参数 必须 为
"aws"
,以指定配置的亚马逊网络服务 KMS。第二个参数 必须 是包含以下内容的文档
您要连接的 AWS 区域,例如
us-west-2
到 AWS 客户端主密钥 (CMK) 的 Amazon 资源名称 (ARN)。
第三个参数可能是一个包含一个或多个
keyAltNames
的数据加密密钥数组。每个键别名必须是唯一的。getKeyVault()
会在keyAltNames
上创建一个唯一索引,以确保如果不存在的话,该字段的唯一性得到强制执行。键别名简化了数据加密密钥的可查找性。
如果成功,createKey()
将返回新数据加密密钥的UUID。要从密钥库检索新数据加密密钥文档,请执行以下操作:
使用
getKey()
通过其UUID检索创建的密钥,或者如果指定了别名,则使用
getKeyByAltName()
通过其别名检索密钥。
启动mongosh
Shell.
使用--nodb
选项创建不连接到运行数据库的mongosh
会话
mongosh --nodb
创建加密配置。
为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_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()
命令创建 keyVault
对象
keyVault = csfleDatabaseConnection.getKeyVault();
创建加密密钥。
使用 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()
通过其别名检索密钥。
启动 mongosh
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()
命令创建 keyVault
对象
keyVault = csfleDatabaseConnection.getKeyVault();
创建加密密钥。
使用 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()
通过其别名检索密钥。
启动 mongosh
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()
命令创建 keyVault
对象
keyVault = csfleDatabaseConnection.getKeyVault();
创建加密密钥。
使用 createKey()
命令创建数据加密密钥
keyVault.createKey( "local", [ "keyAlternateName" ] )
其中
第一个参数必须是
local
,用于指定配置的本地管理密钥。第二个参数可以是一个包含一个或多个数据加密密钥的
keyAltNames
的数组。每个密钥别名必须是唯一的。getKeyVault()
在keyAltNames
上创建一个唯一索引,以强制字段唯一性(如果尚不存在)。密钥别名方便查找数据加密密钥。
如果成功,createKey()
将返回新数据加密密钥的UUID。要从密钥库检索新数据加密密钥文档,请执行以下操作:
使用
getKey()
通过其UUID检索创建的密钥,或者如果指定了别名,则使用
getKeyByAltName()
通过其别名检索密钥。