第5期 MongoDB配置用户名密码认证登录
一、前言
二、RBAC权限模型简介
RBAC0:这是RBAC的初始形态,也是最原始、最简单的RBAC版本; RBAC1:基于RBAC0的优化,增加了角色的分层(即:子角色),子角色可以继承父角色的所有权限; RBAC2:基于RBAC0的另一种优化,增加了对角色的一些限制:角色互斥、角色容量等; RBAC3: 最复杂也是最全面的RBAC模型,它在RBAC0的基础上,将RBAC1和RBAC2中的优化部分进行了整合;
用户(User):系统接口及访问的操作者,即登录的用户本身,有一个用户ID(定义uuid) 角色(Role):具有一类相同操作权限的用户的总称,即这个用户拥有几个身份,一个用户可以有几个角色 权限(Access):能够访问某接口或者做某操作的授权资格,Access英语中的含义是访问,引申为访问的资源,习惯上可以称之为权限
三、MongoDB系统角色(RBAC)
3.1 用户
先在admin数据库中创建角色为userAdmin或userAdminAnyDatabase的用户作为管理用户的用户; 启用访问控制,进行登录用户验证,这样创建用户才有意义。
3.2 角色
3.2.1 MongoDB内置角色:
数据库用户角色:read、readWrite;
数据库管理角色:dbAdmin、dbOwner、userAdmin;
集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
备份恢复角色:backup、restore;
所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超级用户角色:root
内部角色:__system
角色 | 权限描述 |
---|---|
read | 可以读取指定数据库中任何数据。 |
readWrite | 可以读写指定数据库中任何数据,包括创建、重命名、删除集合。 |
readAnyDatabase | 可以读取所有数据库中任何数据(除了数据库config和local之外)。 |
readWriteAnyDatabase | 可以读写所有数据库中任何数据(除了数据库config和local之外)。 |
dbAdmin | 可以读取指定数据库以及对数据库进行清理、修改、压缩、获取统计信息、执行检查等操作。 |
dbAdminAnyDatabase | 可以读取任何数据库以及对数据库进行清理、修改、压缩、获取统计信息、执行检查等操作(除了数据库config和local之外)。 |
clusterAdmin | 可以对整个集群或数据库系统进行管理操作。 |
userAdmin | 可以在指定数据库创建和修改用户。 |
userAdminAnyDatabase | 可以在指定数据库创建和修改用户(除了数据库config和local之外)。 |
3.2.1.1 数据库用户角色
readread角色包含读取所有非系统集合数据和订阅部分系统集合(system.indexes、system.js、system.namespaces)的权限。
readWritereadWrite角色包含read角色的权限同时增加了对非系统集合数据的修改权限,但只对系统集合system.js有修改权限。
3.2.1.2 数据库管理角色
dbAdmindbAdmin角色包含执行某些管理任务(与schema相关、索引、收集统计信息)的权限,该角色不包含用户和角色管理的权限。
dbOwnerdbOwner角色包含对数据所有的管理操作权限。即包含角色readWrite、dbAdmin和userAdmin的权限。 userAdminuserAdmin角色包含对当前数据库创建和修改角色和用户的权限。该角色允许向其它任何用户(包括自身)授予任何权限,所以这个角色也提供间接对超级用户(root)的访问权限,如果限定在admin数据中,也包括集群管理的权限。
3.2.1.3 集群管理角色
clusterManagerclusterManager角色包含对集群监控和管理操作的权限。拥有此角色的用户能够访问集群中的config数据库和local数据库。
clusterMonitorclusterMonitor角色包含针对监控工具具有只读操作的权限。如工具MongoDB Cloud Manager和工具Ops Manager。
对于整个集群该角色包含命令操作:checkFreeMonitoringStatus(4.0新增)、connPoolStats、getCmdLineOpts、getLog、getParameter、getShardMap、hostInfo、inprog、listDatabases、listSessions (3.6新增)、listShards、netstat、replSetGetConfig、replSetGetStatus、serverStatus、setFreeMonitoring (4.0新增)、shardingState、top。
对于集群中所有的数据为包含命令操作:collStats、dbStats、getShardVersion、indexStats、useUUID(3.6新增)。
对于集群中config数据库和local数据库包含的命令操作可以参考官方文档:https://docs.mongodb.com/manual/reference/built-in-roles/#clusterMonitor。
hostManagerhostManager角色包含针对数据库服务器的监控和管理操作权限。
对于整个集群该角色包含命令操作:applicationMessage、closeAllDatabases、connPoolSync、cpuProfiler、flushRouterConfig、fsync、invalidateUserCache、killAnyCursor (4.0新增)、killAnySession (3.6新增)、killop、logRotate、resync、setParameter、shutdown、touch、unlock。
clusterAdminclusterAdmin角色包含MongoDB集群管理最高的操作权限。该角色包含clusterManager、clusterMonitor和hostManager三个角色的所有权限,并且还拥有dropDatabase操作命令的权限。
3.2.1.4 备份恢复角色
backupbackup角色包含备份MongoDB数据最小的权限。
对于集群中的所有非系统集合,包括自身的config数据库和local数据库; 对于集群中的系统集合:system.indexes、system.namespaces、system.js和system.profile; admin数据库中的集合:admin.system.users和admin.system.roles; config.settings集合; 2.6版本之前的system.users集合。对于config.setting集合还有insert和update操作权限。
restorerestore角色包含从备份文件中还原恢复MongoDB数据(除了system.profile集合)的权限。
如果备份中包含system.profile集合而恢复目标数据库没有system.profile集合,mongorestore会尝试重建该集合。因此执行用户需要有额外针对system.profile集合的createCollection和convertToCapped操作权限; 如果执行mongorestore命令时指定选项--oplogReplay,则restore角色包含的权限无法进行重放oplog。如果需要进行重放oplog,则需要只对执行mongorestore的用户授予包含对实例中任何资源具有任何权限的自定义角色。对于整个集群包含命令操作:getParameter。
3.2.1.5 所有数据库角色
以下角色只存在于admin数据库,并且适用于除了config和local之外所有的数据库。
readAnyDatabasereadAnyDatabase角色包含对除了config和local之外所有数据库的只读权限。同时对于整个集群包含listDatabases命令操作。
在MongoDB3.4版本之前,该角色包含对config和local数据库的读取权限。当前版本如果需要对这两个数据库进行读取,则需要在admin数据库授予用户对这两个数据库的read角色。
readWriteAnyDatabasereadWriteAnyDatabase角色包含对除了config和local之外所有数据库的读写权限。同时对于整个集群包含listDatabases命令操作。
在MongoDB3.4版本之前,该角色包含对config和local数据库的读写权限。当前版本如果需要对这两个数据库进行读写,则需要在admin数据库授予用户对这两个数据库的readWrite角色。
userAdminAnyDatabaseuserAdminAnyDatabase角色包含类似于userAdmin角色对于所有数据库的用户管理权限,除了config数据库和local数据库。
对于集群包含命令操作:authSchemaUpgrade、invalidateUserCache、listDatabases。
对于系统集合admin.system.users和admin.system.roles包含命令操作:collStats、dbHash、dbStats、find、killCursors、planCacheRead、createIndex、dropIndex。
该角色不会限制用户授予权限的操作,因此,拥有角色的用户也有可能授予超过角色范围内的权限给自己或其它用户,也可以使自己成为超级用户,userAdminAnyDatabase角色也可以认为是MongoDB中的超级用户角色。
dbAdminAnyDatabasedbAdminAnyDatabase角色包含类似于dbAdmin角色对于所有数据库管理权限,除了config数据库和local数据库。同时对于整个集群包含listDatabases命令操作。
在MongoDB3.4版本之前,该角色包含对config和local数据库的管理权限。当前版本如果需要对这两个数据库进行管理,则需要在admin数据库授予用户对这两个数据库的dbAdmin角色。
3.2.1.6 超级用户角色
dbOwner角色(作用范围为admin数据库) userAdmin角色(作用范围为admin数据库) userAdminAnyDatabase角色 以下角色包含数据库所有资源的所有操作权限。 rootroot角色包含角色readWriteAnyDatabase、dbAdminAnyDatabase、userAdminAnyDatabase、clusterAdmin、restore和backup联合之后所有的权限。
3.2.1.7 内部角色
__system
3.2.2 用户自定义角色
3.3 权限
资源(resource)包括:数据库、集合、部分集合和集群; 操作(action)包括:对资源进行的增、删、改、查(CRUD)操作。在角色定义时可以包含一个或多个已存在的角色,新创建的角色会继承包含的角色所有的权限。在同一个数据库中,新创建角色可以继承其他角色的权限,在admin数据库中创建的角色可以继承在其它任意数据库中角色的权限。
//进入mongo指令平台
mongo
// 查询当前数据库中的角色权限
> db.runCommand({ rolesInfo: "<rolename>" })
// 查询其它数据库中指定的角色权限
> db.runCommand({ rolesInfo: { role: "<rolename>", db: "<database>" } }
// 查询多个角色权限
> db.runCommand(
{
rolesInfo: [
"<rolename>",
{ role: "<rolename>", db: "<database>" },
...
]
}
)
// 查询所有角色权限(仅用户自定义角色)
> db.runCommand({ rolesInfo: 1 })
// 查询所有角色权限(包含内置角色)
> db.runCommand({ rolesInfo: 1, showBuiltinRoles: true })
四、账号密码设置
4.1 创建所有数据库管理员用户密码认证
//进入mongo语法环境
mongo
//查询当前数据库
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
// 进入admin数据库
> use admin
switched to db admin
// 添加管理员用户(用户名admin 和 密码123456 是可以自定义的 【但是要记牢哦!!】)
db.createUser({
user:"admin",
pwd:"123456",
roles:["root"] // 角色root是超级管理员
})
4.2 创建单个数据库设置用户密码认证
// 给myweb数据库 创建一个名为:mupiao 的账户,角色为:dbOwner
db.createUser({
user:"kuaizhidao",
pwd: "123456",
roles: [{
role: "dbOwner",
db: "kuaizhidao"
}]