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