功能
概述
在本页,您可以了解可查询加密的安全优势、其工作原理以及与其他MongoDB支持的安全机制相比的情况。您还可以查看一个虚构场景,展示可查询加密在保护您的数据方面的价值。
可查询加密
可查询加密使客户端应用程序能够在使用完全随机的加密在网络传输数据的同时保持可查询性。敏感数据由客户端透明地加密和解密,并以加密形式仅与服务器进行通信。
与客户端字段级加密不同,它可以使用确定性加密,可查询加密使用基于结构化加密的快速、可搜索的加密方案。这些方案即使在相同的明文输入下也会产生不同的加密输出值。
可查询加密的工作原理
以下图表展示了在客户环境中使用可查询加密的过程和架构。

在此图表中,用户可以查询完全随机加密的数据,如SSN号码。
在可查询加密内部实现此功能的过程和机制如下
当应用程序提交查询时,MongoDB驱动程序首先分析查询。
驱动程序识别出查询是针对加密字段的,并从客户配置的密钥提供程序(如)请求加密密钥
AWS密钥管理服务(AWS KMS)
Google Cloud KMS
Azure密钥保管库
任何KMIP兼容的密钥提供程序
驱动程序将查询以密文形式提交给MongoDB服务器,并请求加密密钥。
可查询加密实现了一种快速、可搜索的方案,允许服务器在不了解任何数据的情况下对完全加密的数据进行查询。数据以及查询本身始终在服务器上保持加密状态。
MongoDB服务器将查询的加密结果返回给驱动程序。
查询结果使用驱动程序持有的密钥进行解密,并返回给客户端并以明文形式显示。
可查询加密依赖于以下数据结构。这些数据结构不得修改或删除,否则查询结果将不正确。
可查询加密向任何包含可查询加密加密字段的集合中的文档添加一个
__safeContent__
字段。可查询加密在同一数据库中创建了两个内部元数据集合,这些集合位于包含可查询加密加密字段的集合中。它们被命名为以下内容
enxcol_.<collectionName>.esc
enxcol_.<collectionName>.ecoc
警告
不要修改这些数据结构,否则查询结果将不正确,安全性可能受到影响。
可查询加密在以下场景下确保加密字段的安全
数据库超级用户直接访问加密字段
通过读取服务器内存访问加密字段
在非安全网络上捕获加密字段
通过读取数据库或备份文件访问磁盘上的加密字段
通过识别具有加密字段的文档中的模式进行频率分析攻击
尽管所有客户端都可以访问非敏感数据字段,但只有适当配置的可查询加密客户端才能使用加密数据字段运行读取和写入查询。
重要
远程密钥管理系统
在生产环境中使用可查询加密时,必须使用远程密钥管理系统(KMS)来存储您的加密密钥。
要查看一个分步指南,演示如何使用远程KMS与可查询加密一起使用,请参阅教程。
要查看所有支持的KMS提供商的列表,请参阅KMS提供商。
要了解为什么您应该使用远程KMS,请参阅使用远程密钥管理系统的原因。
其他安全机制
本节描述MongoDB支持以下安全机制,并解释其用例和限制。
基于角色的访问控制
基于角色的访问控制是一种安全机制,允许管理员授予和限制用户对集合级别的权限。通过适当的角色定义和分配,此解决方案可以防止数据意外泄露和访问。
基于角色的访问控制不能防止以下场景
在不安全的网络上捕获数据
通过读取数据库或备份文件访问磁盘上的数据
通过读取服务器的内存访问数据
数据库超级用户直接访问数据
了解更多信息,请参阅基于角色的访问控制。
静态加密
静态加密是一种加密磁盘上的数据库文件的机制。此机制防止没有数据库凭证但有权访问托管您的数据库的计算机的人查看您的数据。
此机制不能保护您的数据免受以下场景的影响
在不安全的网络上捕获数据
通过读取服务器的内存访问数据
数据库超级用户直接访问数据
了解更多信息,请参阅静态加密。
传输加密(TLS/SSL)
使用TLS/SSL进行传输加密可以加密您的网络上的数据。TLS/SSL在数据通过不安全的网络传输时保护数据,但不能保护数据免受特权用户或磁盘上的数据的影响。
要了解更多信息,请参阅 使用TLS/SSL的传输加密
特性比较
要了解客户端字段级加密的更多信息,请参阅 客户端字段级加密特性。
下表描述了潜在的安全威胁以及MongoDB加密特性如何解决这些问题。请一起使用以下机制:基于角色的访问控制、静态加密、传输加密和使用中加密。请注意,您不能在同一个集合中同时使用客户端字段级加密和可查询加密。
重要
这是一份高级概述,用于一般比较。如需详细了解,请参阅可查询加密概述和无状态文档数据库加密方案的设计与分析白皮书。
威胁 | TLS/SSL 传输加密 | 静态加密 (EaR) | 可查询加密(相等)+ TLS/SSL + EaR | CSFLE + TLS/SSL + EaR |
---|---|---|---|---|
网络嗅探(攻击者可访问网络流量) | 泄露操作元数据 | 泄露操作元数据 | 泄露操作元数据 | 泄露操作元数据 |
从磁盘恢复数据库(攻击者可访问物理磁盘) | 泄露数据库 | 泄露数据库大小和操作元数据 | 泄露数据库大小和操作元数据 | 泄露数据库大小和操作元数据 |
从磁盘和内存中泄露数据库(攻击者可访问物理磁盘和多个数据库快照) [1] | 泄露数据库 | 泄露数据库 | 泄露数据库大小和操作元数据 | 泄露值频率和操作元数据 |
高级持续性威胁(攻击者长时间、持续地访问网络、磁盘和内存,同时保持不被发现) | 泄露数据库 | 泄露数据库 | 可查询加密不是设计用来防止ATP攻击的。详情请参阅白皮书。 | CSFLE也不是设计用来防止ATP攻击的。详情请参阅白皮书。 |
[1] | 这假设数据泄露发生在完成操作之间。详情请参阅白皮书。 |
警告
可查询加密保护数据免遭泄露,但不能防止对环境有持续访问权限的对手,或者能够获取数据库快照及其对应的查询转录/日志的人。
在使用可查询加密时,等值和范围查询提供了与具有数据库快照的攻击者类似的安全性。然而,如果攻击者同时获得了数据库快照和查询信息,那么就超出了可查询加密的安全保证范围。这尤其适用于范围查询,即使只检索到少量查询转写或日志也是如此。有关详细信息,请参阅概述白皮书中的6.1:持久模型中的范围查询。
场景
以下虚构场景展示了可查询加密在保护您的应用程序数据中的价值,以及可查询加密如何与本文档中讨论的其他安全机制交互。
在这个场景中,我们在一个虚构公司MedcoMD的医疗保健管理系统上保护敏感数据,该系统存储了患者的个人信息、账单信息和医疗记录。所有患者数据均不公开,特定的数据(如他们的社会保障号码(SSN,美国政府颁发的身份证号码)、患者ID号码、账单信息和药物信息)尤其敏感,并受隐私合规性的约束。对于公司和患者来说,保持数据的隐私和安全非常重要。
MedcoMD需要此系统来满足以下用例
医生使用该系统访问患者的医疗记录、账单信息并更新药物信息。
接待员使用该系统验证患者的身份,使用他们的联系信息。
接待员可以查看患者的账单信息,但不能查看他们的患者ID号码。
接待员无法访问患者的医疗记录。
MedcoMD还担心通过以下任何方式泄露敏感数据
在接待员公开可见的屏幕上意外泄露数据。
超级用户(如数据库管理员)直接访问数据库。
在不安全的网络上捕获数据。
通过读取数据库服务器的内存来访问数据。
通过读取数据库或备份文件来访问数据。
MedcoMD如何平衡其医疗保健管理系统中的功能性和访问限制?
解决方案
MedcoMD使用以下安全机制来满足其用例并保护敏感医疗数据不被泄露:
传输加密(TLS/SSL)以在网络传输中保护数据。
静态加密以防止通过读取数据库或备份文件泄露数据。
基于角色的访问控制以限制数据库用户对执行其任务所需的集合的访问。
使用可查询加密对敏感字段进行加密,以满足以下用例和约束
防止从服务器内存中读取数据,因为可查询加密的数据永远不会以未加密的形式出现在数据库服务器上。
通过为接待员提供非可查询加密的客户端,允许接待员验证患者身份,并通过接待员公开可见的屏幕防止意外泄露敏感数据。
通过为医生提供可查询加密的客户端,允许医生在其办公室私密查看敏感数据。
了解更多
要查看应实施的安全措施列表以保护您的MongoDB部署,请参阅安全清单。
要开始使用可查询加密,请参阅快速入门。