生产环境的 MongoDB 需要系统的安全加固,包括访问控制、网络加密、审计日志和数据备份策略。
1. RBAC 角色权限
1.1 创建用户与角色
// 启用认证后连接 admin 库
use admin;
db.createUser({
user: "app_user",
pwd: "secure_password",
roles: [
{ role: "readWrite", db: "shop" }, // 读写 shop 库
{ role: "read", db: "analytics" } // 只读 analytics
]
});
// 自定义角色
db.createRole({
role: "orderProcessor",
privileges: [
{ resource: { db: "shop", collection: "orders" },
actions: ["find", "insert", "update"] },
{ resource: { db: "shop", collection: "inventory" },
actions: ["find", "update"] }
],
roles: []
});
1.2 内置角色
| 角色 | 权限 |
|---|---|
read | 读取所有非系统集合 |
readWrite | 读写所有非系统集合 |
dbAdmin | 管理索引、统计、验证规则 |
userAdmin | 管理用户和角色 |
dbOwner | readWrite + dbAdmin + userAdmin |
clusterManager | 管理复制集/分片 |
2. TLS 加密
# mongod.conf
net:
tls:
mode: requireTLS
certificateKeyFile: /etc/ssl/mongodb.pem
CAFile: /etc/ssl/ca.pem
allowConnectionsWithoutCertificates: false
# 客户端连接
mongo --tls --host mongo.example.com \
--tlsCertificateKeyFile client.pem \
--tlsCAFile ca.pem
3. 备份恢复
3.1 mongodump / mongorestore
# 备份(指定复制集)
mongodump --uri="mongodb://user:pass@rs0/mongo1:27017,mongo2:27017/shop?replicaSet=rs0" \
--out=/backup/$(date +%Y%m%d)
# 恢复
mongorestore --uri="mongodb://user:pass@localhost/shop" \
--dir=/backup/20240115/shop \
--drop # 恢复前删除现有集合
3.2 文件系统快照(更快)
# 使用 LVM 或云盘快照
# 要求开启 journal 并使用 WiredTiger
# 1. 锁定写入(仅 secondary 或 standalone)
mongo --eval "db.fsyncLock()"
# 2. 创建快照
lvcreate --snapshot --size 10G --name mongo-snap /dev/vg0/mongo
# 3. 解锁
db.fsyncUnlock()
3.3 oplog 还原到时间点
# 基于 oplog 恢复到特定时间点
mongorestore --oplogReplay --oplogLimit "1705315200:1" /backup/
4. 备份策略
| 策略 | RPO | RTO | 适用 |
|---|---|---|---|
| 每日 mongodump | 24h | 小时级 | 中小数据量 |
| hourly 增量 + 每日全量 | 1h | 小时级 | 大数据量 |
| 文件系统快照 | 分钟级 | 分钟级 | 云环境 |
| 跨区复制集 | 秒级 | 分钟级 | 高可用要求 |
延伸阅读
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。