用户管理与访问控制
用户管理基础概念
MongoDB中的用户管理是通过基于角色的访问控制(RBAC)实现的。每个用户都被分配一个或多个角色,这些角色定义了用户对数据库资源的操作权限。用户账户信息存储在admin数据库的system.users集合中。
创建用户的基本语法如下:
db.createUser({
user: "username",
pwd: "password",
roles: [
{ role: "read", db: "reporting" },
{ role: "readWrite", db: "products" }
]
})
内置角色详解
MongoDB提供了多种内置角色,主要分为以下几类:
数据库用户角色
- read:允许读取指定数据库的数据
- readWrite:包含read权限,并允许写入数据
- dbAdmin:可以执行管理操作,如索引创建、统计收集
- userAdmin:可以创建和修改该数据库的用户和角色
集群管理角色
- clusterAdmin:最高集群管理权限
- clusterManager:监控和管理集群
- clusterMonitor:只读集群监控权限
- hostManager:监控和管理服务器
备份恢复角色
- backup:备份数据权限
- restore:恢复数据权限
全数据库角色
- readAnyDatabase:读取所有数据库
- readWriteAnyDatabase:读写所有数据库
- userAdminAnyDatabase:管理所有数据库用户
- dbAdminAnyDatabase:管理所有数据库
自定义角色创建
当内置角色不能满足需求时,可以创建自定义角色:
db.createRole({
role: "manageProducts",
privileges: [
{
resource: { db: "inventory", collection: "products" },
actions: [ "find", "update", "insert", "remove" ]
},
{
resource: { db: "inventory", collection: "categories" },
actions: [ "find" ]
}
],
roles: []
})
权限继承与组合
角色可以继承其他角色的权限:
db.createRole({
role: "supervisor",
privileges: [],
roles: ["readWrite", "dbAdmin"]
})
用户认证方法
MongoDB支持多种认证机制:
- SCRAM-SHA-1/SHA-256(默认)
- x.509证书认证
- LDAP代理认证
- Kerberos认证
启用认证需要在配置文件中设置:
security:
authorization: enabled
访问控制实践示例
应用连接示例
Node.js连接认证示例:
const { MongoClient } = require('mongodb');
async function connect() {
const client = new MongoClient('mongodb://username:password@localhost:27017/admin', {
authSource: 'admin',
authMechanism: 'SCRAM-SHA-256'
});
try {
await client.connect();
const db = client.db('products');
// 执行操作...
} finally {
await client.close();
}
}
分片集群访问控制
在分片集群中,需要在所有mongos和mongod实例上启用访问控制:
// 配置服务器创建管理员
db.getSiblingDB("admin").createUser({
user: "clusterAdmin",
pwd: "securePassword",
roles: [ { role: "clusterAdmin", db: "admin" } ]
})
审计与监控
MongoDB提供审计功能记录用户操作:
auditLog:
destination: file
format: JSON
path: /var/log/mongodb/audit.json
filter: '{ "users": { $elemMatch: { "user": "admin" } } }'
最佳安全实践
- 遵循最小权限原则
- 定期轮换凭据
- 使用TLS加密连接
- 限制网络暴露
- 启用审计日志
- 定期审查用户权限
常见问题解决方案
问题1:忘记管理员密码
- 重启mongod实例而不启用访问控制
- 连接到实例并创建新管理员
- 重启实例启用访问控制
mongod --dbpath /data/db --noauth
问题2:权限不足错误
检查当前用户权限:
db.runCommand({ connectionStatus: 1 })
问题3:跨数据库访问
需要明确指定认证数据库:
db.auth("username", "password", { mechanism: "SCRAM-SHA-256" })
高级访问控制场景
字段级访问控制
使用视图实现字段级访问控制:
db.createView(
"restrictedUserView",
"users",
[ { $project: { name: 1, email: 1, _id: 0 } } ]
)
时间限制访问
结合自定义角色和应用程序逻辑实现:
// 应用程序检查时间
function checkAccessTime(user) {
const now = new Date();
const hours = now.getHours();
return hours >= 9 && hours < 17;
}
性能考量
- 避免过多的角色嵌套
- 定期清理未使用的用户
- 监控认证操作性能
- 考虑使用连接池减少认证开销
与其他系统集成
与LDAP集成配置
security:
ldap:
servers: "ldap.example.com"
transportSecurity: tls
authz:
queryTemplate: "ou=users,dc=example,dc=com??sub?(uid={USER})"
authorization: enabled
本站部分内容来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn
下一篇:加密传输(TLS/SSL)