五个您现在必须实施的关键 MongoDB 安全配置
MongoDB 是一种强大、灵活的 NoSQL 文档数据库,被全球数百万开发人员和企业使用。然而,使其具有吸引力的灵活性和易于部署的特性,如果默认设置没有立即得到加强,也可能导致重大的安全漏洞。早期版本的 MongoDB 经常遭受公开数据泄露,主要原因是安全默认设置过于宽松。
保护您的 MongoDB 部署不是可选的;它是维护数据完整性、机密性和监管合规性的基础。本指南概述了在每个生产和预生产 MongoDB 环境中必须实施的五个不可或缺的安全步骤,以防止未经授权的访问和数据窃取。通过实施这些配置,您可以从易受攻击的默认状态转变为健壮、受保护的数据库集群。
1. 启用强制访问控制和强身份验证
保护 MongoDB 最关键的步骤之一是确保全局启用身份验证。开箱即用时,许多 MongoDB 部署在未明确配置的情况下允许在没有凭据的情况下进行连接。这种做法本质上是危险的。
如何启用身份验证
身份验证通常通过配置文件(mongod.conf)或启动时的命令行标志来启用。
配置文件(/etc/mongod.conf):
# /etc/mongod.conf 片段
security:
authorization: enabled
命令行:
mongod --auth --dbpath /var/lib/mongodb
创建管理员用户
启用访问控制后,您必须创建一个具有 userAdminAnyDatabase 或 root 角色的管理用户。您只能在服务使用 --auth 启用后重新启动 之前 创建此用户,或者如果系统已经在运行,则在初始创建步骤中暂时禁用身份验证来创建此用户。
示例:通过 mongosh 创建 Root 用户
首先,连接到数据库(如果已在没有身份验证的情况下运行,或使用 localhost 异常):
use admin
db.createUser(
{
user: "mongoAdmin",
pwd: passwordPrompt(), // 安全地提示输入密码
roles: [ { role: "root", db: "admin" } ]
}
)
⚠️ 警告: 始终使用通过密钥管理器安全存储的强大、复杂的密码。切勿在脚本或配置文件中硬编码敏感凭据。
2. 实施细粒度的基于角色的访问控制 (RBAC)
启用身份验证后,下一步是建立最小权限原则 (PoLP)。这意味着每个用户、应用程序和服务帐户应该只拥有执行其所需任务所需的最低权限。
避免将 root 或 readWriteAnyDatabase 角色用于应用程序连接。相反,定义自定义角色,在特定数据库或集合上授予特定权限。
实际的 RBAC 步骤
- 定义自定义角色: 如果内置角色(
read、readWrite)不够用,请创建具有细粒度访问操作的角色(例如,仅对特定集合执行insert和find)。 - 分离应用程序用户: 为不同的应用程序层创建专用的用户(例如,后端使用
app_rw,分析使用reporting_ro)。 - 限制外部工具访问: 确保管理工具仅在绝对必要时使用特权帐户连接。
示例:为特定数据库创建只读用户
use users_db
db.createUser(
{
user: "reporting_svc",
pwd: passwordPrompt(),
roles: [ { role: "read", db: "users_db" } ] // 仅对 users_db 有读取权限
}
)
3. 配置严格的网络绑定和防火墙
网络配置是数据库的周边防御。默认情况下,MongoDB 通常绑定到所有可用网络接口(0.0.0.0),这可能使其对整个网络甚至公共互联网(如果它在没有适当防火墙规则的云实例上运行)可访问。
限制 bindIp
主要的保护措施是定义配置文件中的 bindIp 设置。这明确告诉 MongoDB 应监听哪些 IP 地址或主机名。
配置文件(/etc/mongod.conf):
# 要绑定的 IP 或主机名列表
# 仅用于本地访问时使用 127.0.0.1
# 仅用于从应用程序服务器访问时使用内部 IP(s)
net:
port: 27017
bindIp: 127.0.0.1, 10.0.1.5, localhost
实施外部防火墙(安全组)
除了 bindIp(它限制 MongoDB 进程)之外,您还必须使用外部防火墙(如 iptables、AWS 安全组或 Azure 网络安全组)来过滤在流量到达服务器之前的流量。
最佳实践: 仅允许来自您的应用程序服务器、负载均衡器和管理跳转框的 MongoDB 端口(默认 27017)上的入站流量。
4. 强制执行传输中数据加密 (TLS/SSL)
在客户端(应用程序、Shell、驱动程序)和 MongoDB 服务器之间传输的数据必须使用传输层安全 (TLS) 或安全套接字层 (SSL) 进行加密。通过未加密的连接发送凭据、查询和结果会使数据容易受到潜在的窃听(中间人攻击)。
MongoDB 支持用于加密流量和可选的客户端证书验证的原生 TLS/SSL 配置。
启用 TLS/SSL
要启用加密,您必须生成或获取有效的 TLS 证书,并在配置文件中指定其位置。
配置文件(/etc/mongod.conf):
net:
ssl:
mode: requireTLS
# 组合证书和密钥文件的路径
serverCertificateKeyFile: /etc/ssl/mongodb.pem
# 证书颁发机构 (CA) 文件的路径(用于客户端验证)
CAFile: /etc/ssl/ca.pem
使用 TLS 进行客户端连接
一旦服务器要求使用 TLS,所有客户端必须使用适当的安全标志进行连接:
mongosh "mongodb://[email protected]/admin?authSource=admin" --tls --tlsCAFile /path/to/ca.pem
提示: 在生产环境中使用
mode: requireTLS以确保所有连接都得到保护。preferTLS模式通常仅在迁移或测试期间使用。
5. 启用审核并监控活动日志
即使有强大的访问控制和加密,安全威胁也可能来自被泄露的内部帐户或权限升级。启用全面的审核可以提供操作的历史记录,这对于合规性、取证分析和检测可疑行为至关重要。
MongoDB 的审核功能可以记录管理操作、身份验证尝试、未经授权的访问尝试以及潜在的数据读/写操作。
审核的配置
审核是通过配置文件中的 auditLog 部分进行配置的。您可以指定目标(文件、syslog、控制台)和过滤条件。
配置文件(/etc/mongod.conf):
auditLog:
destination: file
path: /var/log/mongodb/audit.log
format: JSON
# 重点关注关键安全事件,如身份验证和管理更改
filter: '{ atype: { $in: [ "authenticate", "authorize", "createCollection", "createUser", "dropDatabase" ] } }'
基本监控重点领域
- 身份验证失败尝试: 突然的激增表明存在潜在的暴力破解攻击。
- 用户/角色创建/删除: 所有权限更改都必须记录和审查。
- 数据库或集合删除: 对破坏性操作需要立即发出警报。
将 MongoDB 审核日志与集中式日志管理系统(例如 Splunk、ELK Stack、DataDog)集成,以实现实时警报和长期保留。
结论
实施这五项关键配置可以将您的 MongoDB 部署从易受攻击的状态转变为具有弹性的状态。MongoDB 的安全性不是一项“设置后就不用管”的任务;它是一个持续的过程。请确保在每次部署期间验证这些配置——强制身份验证、细粒度 RBAC、严格的网络绑定、TLS 加密和全面的审核——并定期进行审查。优先考虑这些步骤将大大减轻未经授权的访问和数据泄露的风险。