可查询加密限制
本页内容
概述
在启用可查询加密之前,请考虑这些限制和约束。某些操作不受支持,其他操作的行为可能不同。
有关兼容性限制,请参阅兼容性.
安全保证
警告
可查询加密可以防止数据泄露,但不能防止对具有对环境持久访问权限的对手,或者那些可以检索数据库快照及其伴随的查询转储/日志的人。
当使用可查询加密时,等值和范围查询对具有数据库快照的攻击者提供相似的安全保护。然而,具有对数据库快照和查询信息访问权限的攻击者超出了可查询加密安全保证的范围。这对于范围查询尤其如此,即使只检索了少量查询转储或日志也是如此。请参阅6.1: 持久模型中的范围查询有关详细信息,请参阅概述白皮书。
MongoDB 支持限制
在集合上启用可查询加密会从某些诊断命令中删除字段,并从查询日志中省略某些操作。这限制了可供 MongoDB 支持工程师使用的数据,尤其是在分析查询性能时。为了衡量对加密集合的操作影响,请使用第三方应用程序性能监控工具来收集指标。
有关详细信息,请参阅本页的编辑部分。
支持的操作
可查询加密支持命令子集、查询运算符、更新运算符、聚合阶段和聚合表达式。有关支持操作的列表,请参阅可查询加密支持的操作。
手动元数据收集压缩
当您的元数据集合超过1 GB时,手动运行元数据收集压缩。压缩可以减少与加密字段关联的元数据集合的大小,并提高性能。
修改encryptedFieldsMap
不要修改传递给您的MongoClient
的encryptedFieldsMap
。这样做可能导致查询时出现意外和不正确的行为。
可查询加密将加密您传递给MongoClient
构造函数的encryptedFieldsMap
配置中字段的集合。如果您在encryptedFieldsMap
配置中指定了存在于集合文档中的以前明文字段,则您只能在更新了您的encryptedFieldsMap
配置后查询该字段。
例如,考虑一个包含具有明文streetAddress
字段的文档的数据库。将此字段添加到encryptedFieldsMap
并执行后续插入将把streetAddress
的加密值插入数据库。驱动程序将发送将来的特定streetAddress
查询作为BinData
发送。因此,原始文档中的明文值将永远不会与未来的查询匹配。
_id
字段
您无法配置可查询加密来加密 _id
字段,因为它依赖于 MongoDB 自动生成的值。
加密字段名称
您不能重命名加密字段。例如,如果您将 ssn
指定为一个要加密的字段,您不能使用 $rename
将字段名重命名为 taxPayerID
。
修改可查询字段
在创建集合时在 encryptedFieldsMap
中指定的字段的查询类型是不可变的。您不能为现有字段启用新的查询类型,也不能更改现有的查询类型。
编辑
为了提高安全性,可查询加密从加密集合中某些诊断命令中删除字段,并在查询日志中省略某些操作。加密集合是指具有 encryptedFields
选项的任何集合。
查询日志和数据库分析器编辑
以下 CRUD 操作在执行在加密集合上时,将从 慢操作 查询日志和 数据库分析器 的 system.profile
集合中省略。
compactStructuredEncryptionData
命令cleanupStructuredEncryptionData
命令
命令和聚合阶段输出编辑
命令 collStats
和聚合阶段 $collStats
省略
"queryExecStats"
省略
"latencyStats"
如果存在,编辑
"WiredTiger"
,只包含url
字段。
命令 currentOp
和聚合阶段 $currentOp
省略
"command"
之后的全部字段。编辑
"command"
,只包含第一个元素$comment
和$db
。
命令 top
只返回加密集合的集合名称。
聚合阶段 $planCacheStats
省略对加密集合的操作,尽管这些操作作为正常操作缓存。
拓扑支持
支持副本集和分片集群
不支持独立部署
不支持从次要副本读取
分片
元数据集合不得分片
分片键不能是加密字段
集合
您不能在同一集合上使用客户端字段级加密和可查询加密。
可查询加密不支持从使用客户端字段级加密加密的集合迁移。您必须逐个解密文档并插入。
可查询加密不支持从未加密的集合自动迁移。您必须逐个插入文档。
可查询加密仅支持新集合。您不能向现有集合添加或删除可查询加密。
您不能重命名包含加密字段的集合。
当创建可查询加密集合时,如果jsonSchema包含encrypt关键字,则不能将jsonSchema指定给db.createCollection()。
只要您的jsonSchema不包含加密字段的验证,您就可以同时指定encryptedFields和jsonSchema到db.createCollection()。
可查询加密不支持视图、时间序列集合或受限集合。
可查询加密不支持TTL索引或唯一索引。
您不能禁用jsonSchema验证。
当集合使用encryptedFields选项时
您不能将validationLevel设置为none。
您不能将validationAction设置为warn。
删除集合
从未配置为支持可查询加密的
MongoClient
中删除集合不会删除相关的元数据集合。如果在删除元数据集合之前删除了具有加密字段的集合,mongod
会记录一条警告信息。
提示
当使用配置为可查询加密的 MongoClient
删除集合时,兼容的驱动程序也会删除相关的元数据集合。
创建集合
始终显式创建任何使用可查询加密的集合。隐式创建集合不会创建必要的索引和元数据集合,从而导致查询性能不佳。
数组
可查询加密不支持在文档数组中的字段上自动加密。
视图
应用程序不能依赖自动加密验证来防止对包含加密字段的集合视图的无效查询。
如果查询的底层视图聚合管道或查询引用了加密字段,则针对使用查询加密加密值的集合视图的查询可能会返回意外的或错误的结果。如果要在包含使用查询加密加密值的集合上创建视图,请避免操作加密字段以降低意外或错误结果的风险。
有关视图的更多信息,请参阅视图。
排序
查询加密忽略用户指定的排序或集合默认排序。加密会隐藏字段值并阻止正常的排序行为。针对加密字段的排序敏感查询可能会返回意外的或错误的结果。
有关排序的更多信息,请参阅排序文档。
查询加密兼容的驱动程序有一份自动加密支持的操作列表。对于不支持读取和写入操作,底层支持库无法内省集合目录以确定默认排序。因此,应用程序不能依赖查询加密验证来防止在具有默认排序的加密字段上查询。
唯一索引
唯一索引如果索引键指定了任何加密字段,则不能保证唯一性。
可查询加密始终输出不同的加密值,即使对于相同的输入也是如此。服务器认为每个加密值都是唯一的,即使解密值可能不是。这意味着即使集合使用索引强制唯一约束字段,该集合仍可能包含多个具有该字段重复明文值的文档。
配置为自动加密的可查询加密兼容驱动程序 支持某些自动加密操作。对于不支持的读取和写入操作,底层库无法检查索引目录以识别给定的字段为唯一。应用程序不能依赖自动加密验证来防止随机加密字段的唯一约束违规。