这是《MongoDB 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 MongoDB 常保存用户资料、业务订单、日志和敏感行为数据。安全治理要覆盖网络边界、认证授权、TLS、字段级敏感信息、审计和密钥生命周期。
21.1 访问控制
启用认证后,所有客户端必须使用用户连接。
创建管理员:
use admin
db.createUser({
user: "admin",
pwd: passwordPrompt(),
roles: [{ role: "userAdminAnyDatabase", db: "admin" }]
})
创建业务用户:
use shop
db.createUser({
user: "shop_app",
pwd: passwordPrompt(),
roles: [
{ role: "readWrite", db: "shop" }
]
})
不要让所有服务共享管理员账号。
21.2 内置角色
| 角色 | 权限 |
|---|---|
| read | 读指定库 |
| readWrite | 读写指定库 |
| dbAdmin | 管理指定库 |
| userAdmin | 管理指定库用户 |
| clusterMonitor | 查看集群监控 |
| backup / restore | 备份恢复 |
| root | 超级权限 |
原则:
- 业务应用 readWrite;
- 报表只读;
- 运维按操作分段授权;
- 监控 clusterMonitor;
- root 仅 break-glass。
21.3 自定义角色
限制集合:
use shop
db.createRole({
role: "orderReader",
privileges: [
{
resource: { db: "shop", collection: "orders" },
actions: ["find"]
}
],
roles: []
})
适用:
- 只读某集合;
- 只允许特定操作;
- 审计查询;
- 内部平台数据视图。
21.4 网络隔离
生产建议:
- mongod 只监听内网地址;
- 不把 27017 暴露公网;
- 使用防火墙或安全组;
- 按环境隔离 VPC;
- mongos 和应用同受控网络;
- 运维通过堡垒机;
- 分片组件之间限制来源。
查看监听:
ss -lntp | grep 27017
21.5 TLS
连接串示例:
mongodb://user:pass@mongo1,mongo2,mongo3/shop?replicaSet=rs0&tls=true&authSource=admin
启用前验证:
- 证书有效期;
- 证书 SAN;
- CA 分发;
- 客户端驱动兼容;
- 性能影响;
- 轮转流程;
- 回滚方式。
21.6 字段级安全
MongoDB 的权限通常到集合或库级别,字段级访问需要应用层或查询视图治理。
示例只读视图:
db.createView("user_public", "users", [
{ $project: {
_id: 1,
nickname: 1,
city: 1
}}
])
原则:
- 密码只保存哈希;
- 手机号和身份证脱敏;
- token 不明文入库;
- 大敏感数据加密;
- 应用日志同步脱敏;
- 查询导出需审批。
21.7 审计
企业版提供审计能力,具体能力与版本和发行版有关。至少应审计:
- 登录成功和失败;
- 用户与角色变更;
- 权限变更;
- 集合和索引管理;
- 备份恢复;
- 高危运维命令;
- 敏感集合查询和导出。
应用层也应保存业务操作审计。
21.8 密钥管理
要求:
- 密码和证书不写入代码仓库;
- 使用 KMS、Secret 或云托管身份;
- 定期轮转;
- 不同环境不同凭据;
- 副本集 keyfile 权限受控;
- 泄露后立即吊销;
- 记录凭据使用。
检查文件权限:
ls -l /etc/mongo-keyfile
21.9 注入与查询安全
驱动使用结构化查询,不拼接字符串。应用层:
- 不接受用户传入任意操作符;
- 限制可查询字段;
- 限制返回条数;
- 查询超时;
- 敏感字段过滤;
- 导出限流。
示例拒绝用户直接提交 $where。
21.10 常见风险
| 风险 | 处理 |
|---|---|
| 未启用认证 | 立即启用并隔离网络 |
| 公网暴露 | 关闭公网和安全组 |
| root 共享 | 按服务拆分账号 |
| 明文传输 | 启用 TLS |
| 备份未加密 | 加密存储并控权限 |
| 无审计 | 建立审计流程 |
| 离职未回收 | 定期权限复核 |
本章小结
MongoDB 安全从网络隔离和认证授权开始,再到 TLS、最小权限、字段脱敏、审计和密钥治理。集合级权限不能完全替代应用层数据安全,两者需要配合。
思考题
- 为什么业务应用不应使用 root?
- 自定义角色适合什么场景?
- 视图能否替代字段级权限?
- TLS 上线前要验证什么?
- 哪些操作必须进入审计?