4.2版中的新功能。
与MongoDB 4.2兼容的官方驱动程序提供了客户端字段级加密框架。应用程序可以先加密文档中的字段, 然后再通过网络将数据传输到服务器。只有有权使用正确加密密钥的应用程序才能解密和读取受保护的数据。删除加密密钥会使使用该密钥加密的所有数据永久不可读。
例如,实施身份验证的MongoDB集群 使用 TLS加密来保护传输中的数据。集群还使用 MongoDB加密存储引擎来保护磁盘上的数据。请考虑以下情形:
在每种情况下,对MongoDB群集或主机具有特权访问权限的用户都可以绕过加密并读取私有,特权或机密数据。在将数据写入服务器之前,使用客户端字段级加密来保护数据可降低在绕过网络或磁盘加密的情况下暴露数据的风险。
考虑以下文档:
通过客户端字段级加密,应用程序可以专门加密敏感信息,例如ssn
和phone
。加密字段的存储方式
与
子类型6相同:binary data
有关支持客户端字段级加密的官方4.2兼容驱动程序的完整列表,请参阅 驱动程序兼容性表。
有关使用与MongoDB 4.2兼容的驱动程序配置字段级加密的端到端过程,请参阅《 客户端字段级加密指南》。
MongoDB使用官方兼容MongoDB 4.2的驱动程序支持两种客户端字段级加密方法:
兼容MongoDB 4.2的官方驱动程序和MongoDB 4.2
mongo
Shell支持使用特定的数据加密密钥和加密算法显式加密或解密字段。
应用程序必须修改与构造读写操作相关的任何代码,以通过驱动程序加密库包括加密/解密逻辑。应用程序负责为每个操作选择适当的数据加密密钥以进行加密/解密。
有关更多信息,请参见 显式(手动)客户端字段级加密。
企业功能
字段级加密的自动功能仅在MongoDB 4.2 Enterprise和MongoDB Atlas 4.2集群中可用。
兼容MongoDB 4.2的官方驱动程序和MongoDB 4.2
mongo
Shell支持在读写操作中自动加密字段。
应用程序必须MongoClient
使用自动加密配置设置来创建数据库连接对象(例如
)。配置设置必须包括使用JSON Schema Draft 4标准语法的严格子集和特定于加密的模式关键字的自动加密规则。应用程序不必修改与读/写操作关联的代码。有关自动加密规则的完整文档,请参阅
自动加密规则。
有关更多信息,请参见 客户端字段级自动加密。
MongoDB 4.2兼容的驱动程序和4.2 mongo
Shell自动解密Binary
使用客户端字段级加密创建的子类型6对象。有关自动解密的更多信息,请参见自动字段解密。
重要
MongoDB客户端字段级加密仅支持加密文档中的单个字段。要加密整个文档,您必须加密文档中的每个单独字段。
下图说明了驱动程序和每个加密组件之间的关系:
libmongocrypt
是官方许可的与MongoDB 4.2兼容的驱动程序使用的Apache许可的开源核心加密库,以及mongo
用于增强客户端字段级加密的
外壳。某些驱动程序可能需要特定的集成步骤才能安装或链接库。请参考驱动程序文档以获取更多完整信息。mongocryptd
不执行加密功能。MongoDB客户端字段级加密使用先加密再加密MAC方法,再结合确定性或随机初始化矢量来加密字段值。MongoDB 仅支持 带有HMAC-SHA-512 MAC 的 AEAD AES-256-CBC加密算法。
的BinData
团块元数据包括所述数据的加密密钥_id
用于加密的二进制数据和加密算法。4.2兼容驱动程序和4.2 mongo
Shell使用此元数据尝试自动解密BinData
类型6的值。自动解密过程如下:
检查BinData
Blob元数据,以获取用于加密值的数据加密密钥和加密算法。
检查在当前数据库连接中配置的密钥库以获取指定的数据加密密钥。如果密钥库不包含指定的密钥,则自动解密将失败,驱动程序将返回BinData
Blob。
检查用于加密密钥材料的客户主密钥的数据加密密钥元数据。
对于Amazon Web Services KMS,将数据加密密钥发送到KMS服务以进行解密。如果CMK不存在,或者连接配置未授予对CMK的访问权限,则解密将失败,驱动程序将返回BinData
Blob。
对于本地管理密钥,请检索本地密钥并解密数据加密密钥。如果未使用数据库配置中指定的本地密钥对数据加密密钥进行加密,则解密失败,驱动程序将返回该BinData
Blob。
BinData
使用解密的数据加密密钥和适当的算法解密该值。
具有MongoDB服务器访问权限的应用程序也无权访问所需的主密钥和数据加密密钥,则无法解密这些BinData
值。
有关配置数据库连接以进行客户端字段级加密的更多信息,请参见Mongo()
构造函数或参考文档以获取首选驱动程序的客户端构造方法。
MongoDB 4.2服务器支持使用架构验证来对集合中特定字段进行加密。将自动加密规则关键字与
$jsonSchema
验证对象一起使用以指示哪些字段需要加密。如果指定的字段不是
子类型6对象,则服务器拒绝对该集合的任何写操作。Binary (BinData)
例如,以下collMod
命令将hr.employees
集合修改为包括validator
。该
$jsonSchema
验证对象包括客户端侧场级加密关键字,以指示:
客户端执行显式的(手动)字段级加密必须
以最小的
和字段使用相同的设置作为远程之前在发出写操作。encrypt
taxid
taxid-short
$jsonSchema
执行自动客户端字段级加密的客户端具有特定的行为,具体取决于数据库连接配置:
如果连接ClientSideFieldLevelEncryptionOptions
schemaMap
对象包含指定集合的密钥,则客户端将使用该对象执行自动字段级加密,并忽略远程模式。本地规则必须至少对taxid
和taxid-short
字段进行加密。
如果连接ClientSideFieldLevelEncryptionOptions
schemaMap
对象并没有包含用于指定集合的密钥,所述客户端下载的收集和使用服务器侧远程模式它来执行自动字段级加密。
此配置要求客户端信任服务器具有有关自动字段级加密的有效架构。客户端仅使用远程模式执行自动字段级加密,而不执行模式中指定的任何其他验证规则。
由于MongoDB服务器无法解密或内省加密字段的内容,因此它无法验证客户端使用指定的加密选项来加密给定字段。这允许两个客户端使用不同的keyID或用于特定字段的加密算法来插入加密的数据。尽管某些工作负载可能需要独立的字段级加密实现,但是跨客户端跨字段加密选项的不一致实现可能会导致针对加密字段的查询的错误或意外行为。
例如,客户端A
加密PII
使用随机加密而客户字段B
加密PII
利用确定性加密字段。随机加密算法始终返回不同的唯一值,而确定性算法始终返回相同的值。由于服务器无法匹配任何随机加密的字段,因此期望对该字段使用确定性加密数据的查询将返回不一致的结果。