由于数据库中存储了多种数据,有时我们可能会处理机密数据,其中可能包括信用卡数据、财务记录、个人信息。这些 PII(个人身份信息)数据受监管,例如我们需要保护和确保机密性、完整性和可用性的 PCI DSS、HIPAA 或 GDPR。
数据加密是构建 MongoDB 以在生产环境中实现安全性的一部分。数据加密的目的是为数据的安全性添加更多保护措施,尤其是免受内部威胁。我们锁定数据库的服务和端口,维护一个访问控制列表,记录谁可以访问和执行对数据库的哪些操作,并启用加密以防止在网络传输期间或存储数据时被嗅探。在这篇文章中,我们将讨论如何在 MongoDB 中使用加密。
传输中的数据加密
传输中的数据加密确保MongoDB 数据在客户端(即应用程序服务器)和数据库服务器之间以及在 MongoDB ReplicaSet 或 ShardedCluster 架构中的数据库服务器之间是安全的。MongoDB 使用 SSL/TLS 证书,生成自签名证书或由证书颁发机构颁发的证书。
最好的方法是使用来自证书颁发机构的证书,因为它允许 MongoDB 驱动程序通过证书颁发机构检查主机,这意味着将验证服务器身份以避免中间人攻击。您仍然可以在受信任的网络中使用自签名证书。
MongoDB SSL/TLS 加密必须使用具有至少 128 位密钥的 TLS/SSL 密码。从 MongoDB 4.2 及以上版本开始,有一个名为net.tls的新参数。它提供与 net.ssl 相同的功能。mongod.conf 文件中的配置如下:
net:<font></font> tls:<font></font> mode: requireTLS<font></font> certificateKeyFile: /etc/ssl/mongodb.pem
而如果我们想添加客户端证书验证,我们只需要添加参数CAFile 如下:
net:<font></font> tls:<font></font> mode: requireTLS<font></font> certificateKeyFile: /etc/ssl/mongodb.pem<font></font> CAFile: /etc/ssl/caClientCert.pem
通过上述配置,MongoDB SSL/TLS 连接需要来自客户端的有效证书,并且客户端必须指定 SSL/TLS 连接并提供证书密钥文件。
在上面的配置中,我们使用了 MongoDB 4.2 上存在的 net.tls。对于上面的版本,我们可以使用net.ssl配置,如下:
net:<font></font> ssl:<font></font> mode: requireSSL<font></font> PEMKeyFile: /etc/ssl/mongodb.pem
添加客户端证书验证与 net.tls 配置类似。只需添加参数 CAFile ,如下所示:
net:<font></font> ssl:<font></font> mode: requireSSL<font></font> PEMKeyFile: /etc/ssl/mongodb.pem<font></font> CAFile: /etc/ssl/caClientCert.pem
静态数据加密
说到静态数据加密,MongoDB 数据加密有以下几种方法:
- 数据库存储引擎加密
MongoDB 在WiredTiger 存储引擎上提供本机加密。数据剩余加密需要对数据进行两个密钥保护,分别是用于加密数据的主密钥和用于加密数据库密钥的主密钥。加密使用 AES256-CBC 高级加密标准。它使用与加密和解密数据相同的密钥的非对称密钥。它仅在 3.2 及以上版本的企业版中可用。
Percona Server for MongoDB 具有静态数据加密,它是开源服务器的一部分,从 3.6 版开始引入。当前版本不包括密钥管理互操作性协议 (KMIP) 或 Amazon KMS。我们可以使用本地密钥文件或第三方密钥管理服务器,例如 Hashicorp Vault。
Percona Server for MongoDB 中与加密相关的参数是encryptionCipherMode,我们可以通过选择以下密码模式之一进行配置:
-
AES256-CBC
-
AES256-GCM
如果您未明确应用上述密码之一,则默认密码为 AES256-CBC。我们可以在新的 Percona Server 上为 MongoDB 安装启用静态数据加密,但它不支持现有的 MongoDB 服务。
- 磁盘/存储加密
存储加密是对存储介质的加密。我们可以使用基于 Linux 的磁盘加密,例如 LUKS 来加密磁盘的数据量,或者如果我们使用云环境,可能会有一个加密选项。例如,在 AWS 中,可以有加密的块存储以及 S3 存储。
- 基于 API 的加密
基于 API 的加密使用第三方加密软件或应用程序提供算法在数据存储到 MongoDB 数据库之前对其进行加密。整个过程由应用层处理。




