- 首页 >
- 问答 >
-
云计算 >
- Linux系统中MongoDB的权限控制
Linux系统中MongoDB的权限控制
小樊
42
2025-12-30 05:04:58
MongoDB 在 Linux 上的权限控制实践
一 核心概念与内置角色
- MongoDB 采用 RBAC(基于角色的访问控制),权限通过“角色”授予,用户可拥有一个或多个角色。角色在特定数据库中创建,角色名与数据库名组合唯一;在 admin 数据库中创建的角色可包含对 admin、其他数据库或集群 的权限,且可跨库继承。所有角色信息统一存储在 admin.system.roles 集合,应通过角色管理命令操作,避免直接修改该集合。内置角色常见分层:数据库用户角色(read、readWrite)、数据库管理角色(dbAdmin、dbOwner、userAdmin)、集群管理角色(clusterAdmin、clusterManager、clusterMonitor、hostManager)、备份恢复角色(backup、restore)、所有数据库角色(readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase)以及超级用户角色(root)。遵循最小权限原则进行授权。
二 启用认证与创建管理员
- 启用认证:编辑 /etc/mongod.conf,设置
security:
authorization: enabled
重启服务:sudo systemctl restart mongod。首次启用前,先在本地无认证状态下创建管理员账户,避免被锁。
- 创建用户管理员(仅在 admin 库创建,具备全局用户管理能力):
use admin
db.createUser({
user: “myUserAdmin”,
pwd: passwordPrompt(), // 交互输入更安全
roles: [
{ role: “userAdminAnyDatabase”, db: “admin” },
{ role: “readWriteAnyDatabase”, db: “admin” }
]
})
连接与认证:mongosh --port 27017 -u myUserAdmin -p --authenticationDatabase admin;或在 shell 中 db.auth(“myUserAdmin”, passwordPrompt())。生产环境不建议直接使用 root,而是以用户管理员按需创建与授权其他账户。
三 按库授权与最小权限示例
- 应用读写用户(仅对目标库授权):
use myApp
db.createUser({
user: “appUser”,
pwd: passwordPrompt(),
roles: [{ role: “readWrite”, db: “myApp” }]
})
- 报表只读用户:
use myApp
db.createUser({
user: “reportUser”,
pwd: passwordPrompt(),
roles: [{ role: “read”, db: “myApp” }]
})
- 数据库管理员(可对单库做几乎所有管理,不含跨库用户管理):
use myApp
db.createUser({
user: “appAdmin”,
pwd: passwordPrompt(),
roles: [{ role: “dbOwner”, db: “myApp” }]
})
- 验证与变更:
- 验证权限:db.runCommand({ connectionStatus: 1 })、或切换库后执行代表性操作。
- 授权调整:db.grantRolesToUser()、db.revokeRolesFromUser();查看:db.getUser()、db.getRole(…, {showPrivileges:true})。
- 修改密码:db.changeUserPassword(“username”,“newpassword”);删除用户:db.dropUser(“username”)。
四 自定义角色与细粒度权限
- 当内置角色无法满足需求时,可在目标数据库创建自定义角色,精确授予资源与操作:
use reporting
db.createRole({
role: “reportingLimited”,
privileges: [
{
resource: { db: “reporting”, collection: “sales” },
actions: [“find”, “aggregate”, “project”]
}
],
roles: []
})
将角色授予用户:
use reporting
db.grantRolesToUser(“reportUser”, [“reportingLimited”])
- 角色作用域要点:在 admin 中创建的角色可包含对 集群 与其他数据库的特权;在普通数据库创建的角色仅能包含该库内的特权。角色信息统一存于 admin.system.roles,请使用角色管理命令维护。
五 集群与网络安全加固
- 复制集/分片集群的内部认证:使用 Keyfile(各节点同一份,权限建议 400/600),或 x.509 证书;在配置中启用 security.keyFile 并开启 authorization。示例(mongod.conf):
security:
keyFile: /path/to/keyfile
authorization: enabled
集群节点间将自动进行内部认证。
- 网络安全与运行账户:
- 绑定地址:net.bindIp: 127.0.0.1,192.168.1.100(仅内网/受信网段)。
- 防火墙:仅放行受信来源到 27017/TCP(如 firewalld/ufw 规则)。
- 运行账户:创建专用系统用户 mongodb,将数据与日志目录属主设为 mongodb,并在 systemd 服务中指定 User=mongodb、Group=mongodb,避免使用 root 运行。