08 - MongoDB安全与权限管理
🎯 学习目标
- 理解MongoDB安全机制和最佳实践
- 掌握用户认证和授权管理
- 学会配置网络安全和加密
- 熟悉安全监控和审计
🔐 安全基础
1. MongoDB安全层次
MongoDB安全包含多个层次:
- 🔑 认证 (Authentication) - 验证用户身份
- 🛡️ 授权 (Authorization) - 控制用户权限
- 🌐 网络安全 - 保护网络通信
- 🔒 数据加密 - 保护数据安全
- 📊 审计日志 - 记录安全事件
2. 安全威胁类型
常见安全威胁:
- 🚫 未授权访问 - 没有认证的用户访问
- 🔓 权限提升 - 用户获得超出权限的访问
- 🌐 网络攻击 - 中间人攻击、DDoS等
- 💾 数据泄露 - 敏感数据被窃取
- 🦠 恶意软件 - 病毒、木马等
👤 用户认证
1. 启用认证
javascript
// 启动MongoDB时启用认证
mongod --auth
// 或在配置文件中启用
security:
authorization: enabled
2. 创建管理员用户
javascript
// 连接到MongoDB(无认证模式)
mongosh
// 切换到admin数据库
use admin
// 创建管理员用户
db.createUser({
user: "admin",
pwd: "admin123",
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" },
{ role: "dbAdminAnyDatabase", db: "admin" }
]
})
// 验证用户创建
db.getUsers()
3. 创建应用用户
javascript
// 切换到应用数据库
use myapp
// 创建应用用户
db.createUser({
user: "appuser",
pwd: "app123",
roles: [
{ role: "readWrite", db: "myapp" }
]
})
// 创建只读用户
db.createUser({
user: "readonly",
pwd: "read123",
roles: [
{ role: "read", db: "myapp" }
]
})
4. 用户管理
javascript
// 查看所有用户
db.getUsers()
// 查看特定用户
db.getUser("appuser")
// 更新用户密码
db.changeUserPassword("appuser", "newpassword")
// 更新用户角色
db.updateUser("appuser", {
roles: [
{ role: "readWrite", db: "myapp" },
{ role: "read", db: "reports" }
]
})
// 删除用户
db.dropUser("appuser")
🛡️ 角色和权限
1. 内置角色
数据库级角色:
read
- 只读权限readWrite
- 读写权限dbAdmin
- 数据库管理权限userAdmin
- 用户管理权限dbOwner
- 数据库所有者权限
集群级角色:
clusterAdmin
- 集群管理权限clusterManager
- 集群管理权限clusterMonitor
- 集群监控权限hostManager
- 主机管理权限
备份和恢复角色:
backup
- 备份权限restore
- 恢复权限
2. 自定义角色
javascript
// 创建自定义角色
use admin
db.createRole({
role: "customRole",
privileges: [
{
resource: { db: "myapp", collection: "users" },
actions: ["find", "insert", "update"]
},
{
resource: { db: "myapp", collection: "orders" },
actions: ["find"]
}
],
roles: []
})
// 将角色分配给用户
use myapp
db.grantRolesToUser("appuser", ["customRole"])
// 撤销用户角色
db.revokeRolesFromUser("appuser", ["customRole"])
3. 权限管理
javascript
// 查看角色权限
db.getRole("readWrite", { showPrivileges: true })
// 查看用户权限
db.getUser("appuser", { showPrivileges: true })
// 查看所有角色
db.getRoles()
// 删除自定义角色
db.dropRole("customRole")
🌐 网络安全
1. 网络绑定
yaml
# 配置文件中的网络设置
net:
port: 27017
bindIp: 127.0.0.1 # 只绑定本地IP
# bindIp: 0.0.0.0 # 绑定所有IP(不推荐)
maxIncomingConnections: 100
wireObjectCheck: true
ipv6: false
2. 防火墙配置
bash
# Linux防火墙配置
# 只允许特定IP访问MongoDB
sudo ufw allow from 192.168.1.0/24 to any port 27017
sudo ufw deny 27017
# 或使用iptables
sudo iptables -A INPUT -p tcp --dport 27017 -s 192.168.1.0/24 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 27017 -j DROP
3. SSL/TLS加密
yaml
# 配置文件中的SSL设置
net:
ssl:
mode: requireSSL
PEMKeyFile: /path/to/mongodb.pem
CAFile: /path/to/ca.pem
allowConnectionsWithoutCertificates: false
allowInvalidCertificates: false
allowInvalidHostnames: false
4. 连接字符串
javascript
// 使用SSL连接
mongosh "mongodb://username:password@host:27017/database?ssl=true"
// 使用SSL和认证
mongosh "mongodb://username:password@host:27017/database?ssl=true&authSource=admin"
🔒 数据加密
1. 传输加密
javascript
// 生成SSL证书
openssl req -newkey rsa:2048 -new -x509 -days 365 -nodes -out mongodb.crt -keyout mongodb.key
cat mongodb.key mongodb.crt > mongodb.pem
2. 存储加密
yaml
# 配置文件中的加密设置
security:
enableEncryption: true
encryptionKeyFile: /path/to/encryption.key
encryptionCipherMode: AES256-CBC
3. 字段级加密
javascript
// 使用客户端字段级加密
const { ClientEncryption } = require('mongodb-client-encryption');
const clientEncryption = new ClientEncryption(client, {
keyVaultNamespace: 'encryption.__keyVault',
kmsProviders: {
local: {
key: Buffer.from('your-32-byte-key-here')
}
}
});
// 加密字段
const encryptedField = await clientEncryption.encrypt('sensitive-data', {
algorithm: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic',
keyId: keyId
});
📊 安全监控
1. 审计日志
yaml
# 配置文件中的审计设置
auditLog:
destination: file
format: JSON
path: /var/log/mongodb/audit.json
filter: '{ atype: { $in: ["authenticate", "authorize"] } }'
2. 安全事件监控
javascript
// 查看认证失败
db.system.profile.find({
"command.authenticate": { $exists: true },
"command.authenticationDatabase": { $exists: true }
})
// 查看权限检查
db.system.profile.find({
"command.authorize": { $exists: true }
})
3. 安全配置检查
javascript
// 检查安全配置
db.runCommand({ connectionStatus: 1 })
// 检查用户权限
db.runCommand({ usersInfo: 1 })
// 检查角色权限
db.runCommand({ rolesInfo: 1 })
🛠️ 实践练习
练习1:用户认证配置
- 启用MongoDB认证
- 创建管理员用户
- 创建应用用户和只读用户
- 测试用户权限
- 配置用户密码策略
练习2:权限管理
- 创建自定义角色
- 分配角色给用户
- 测试权限控制
- 实现最小权限原则
- 管理用户生命周期
练习3:网络安全
- 配置网络绑定
- 设置防火墙规则
- 配置SSL/TLS加密
- 测试安全连接
- 监控网络访问
❓ 常见问题
Q: 如何重置MongoDB管理员密码?
A: 1. 以无认证模式启动MongoDB 2. 连接到admin数据库 3. 更新用户密码 4. 重启MongoDB启用认证
Q: 如何实现数据库级别的权限控制?
A: 使用数据库级角色,为不同数据库创建不同的用户和角色。
Q: SSL证书过期怎么办?
A: 1. 生成新的SSL证书 2. 更新配置文件 3. 重启MongoDB服务 4. 更新客户端连接字符串
Q: 如何监控安全事件?
A: 启用审计日志,使用监控工具,定期检查日志文件。
Q: 如何实现高可用性的安全配置?
A: 使用副本集,配置SSL,设置防火墙,定期备份,监控安全事件。
⚠️ 注意事项
- 密码安全 - 使用强密码,定期更换
- 权限最小化 - 只授予必要的权限
- 网络安全 - 限制网络访问,使用SSL加密
- 定期审计 - 定期检查用户权限和安全配置
- 备份安全 - 保护备份数据的安全
🎯 学习检查
完成本课后,你应该能够:
- [ ] 配置MongoDB用户认证
- [ ] 管理用户角色和权限
- [ ] 配置网络安全设置
- [ ] 实现数据加密
- [ ] 监控安全事件
下一步: 学习 09-performance 性能调优