MongoDB 4.X 用户操作及角色
本文主要是MongoDB4.X的操作
一、MongoDB用户操作
MongoDB系统的每个应用程序和用户都应该映射到不同的用户。 这种访问隔离便于访问撤销和持续的用户维护。
1.创建管理员用户
要在MongoDB部署中创建用户,请连接到部署,然后使用db.createUser()方法或createUser命令添加用户。
> db.createUser(
{
user:"test",
pwd:"123456",
roles:[{role:"root",db:"admin"}]
}
)
Successfully added user: {
"user" : "test",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
2.查看已存在的用户
db.system.users.find()
db.getUsers();
3.查看用户信息
> use admin
> db.getUser("用户名", { showPrivileges: true })
或
> db.getSiblingDB("admin").runCommand(
{
usersInfo: "root",
showPrivileges: true
}
)
4.添加数据库用户
创建指定数据库的用户,该用户只能访问该数据库。也可以为此数据库上的用户指定访问级别。 例如,创建一个在data数据库上具有读写访问权限的用户帐户。
> use data
> db.createUser( { user: "user01", pwd: "123456", roles: ["readWrite"] } )
或
db.getSiblingDB("admin").runCommand( { createUser: "user02", pwd: "123456", customData: { info: "user for user02" }, roles: ["readWrite"] } )
身份验证使用db.auth('用户名','密码');
Built-In Roles(内置角色): 1. 数据库用户角色:read、readWrite; 2. 数据库管理角色:dbAdmin、dbOwner、userAdmin; 3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager; 4. 备份恢复角色:backup、restore; 5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase 6. 超级用户角色:root // 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase) 7. 内部角色:__system
具体角色
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
db.createUser(
{
user: "fyerp",
pwd: "test.123",
roles:
[{ role: "readWrite", db: "item" },{ role: "readWrite", db: "local" },{ role: "readWrite", db: "logdb" }]
}
)
6.为用户添加角色
用户user02添加admin数据库的readWrite角色
> use admin
> db.grantRolesToUser( "user02", [ { role: "readWrite", db: "admin" }, { role: "user02", db: "admin" } ] )
或
> use admin
> db.runCommand( { grantRolesToUser: "user02", roles: [ { role: "readWrite", db: "admin" }, { role: "user02", db: "admin" } ] } )
7.更新用户信息
更新用户user02具有admin数据库readWrite角色为read角色。
> use admin
> db.updateUser( "user02", { customData: { info: "user for user02" }, roles: [ { role: "user02", db: "admin" }, { role: "read", db: "admin" } ] } )
或
> use admin
> db.runCommand( { updateUser: "user02", customData: { info: "user for user02" }, roles: [ { role: "user02", db: "admin" }, { role: "read", db: "admin" } ] } )
8.为用户回收角色
> use admin
> db.revokeRolesFromUser( "user02", [ { role: "read", db: "admin" } ] )
或
> use admin
> db.runCommand( { revokeRolesFromUser: "dbabd_user", roles: [ { role: "read", db: "admin" } ] } )
9.更改用户密码
更改用户user02密码为12345678。
> use admin
> db.changeUserPassword("user02", "12345678")
10.删除用户
删除用户user02
> use admin
> db.dropUser("user02")
或
> use admin
> db.runCommand({ dropUser: "user02" })
关于更多用户管理操作信息可以参考官方文档说明:
https://docs.mongodb.com/manual/reference/method/js-user-management/
二、权限
权限由指定的数据库资源(resource)以及允许在指定资源上进行的操作(action)组成。
- 资源(resource)包括:数据库、集合、部分集合和集群;
- 操作(action)包括:对资源进行的增、删、改、查(CRUD)操作。
在角色定义时可以包含一个或多个已存在的角色,新创建的角色会继承包含的角色所有的权限。在同一个数据库中,新创建角色可以继承其他角色的权限,在admin数据库中创建的角色可以继承在其它任意数据库中角色的权限。
关于角色权限的查看,可以通过如下命令查询:
//查询当前数据库中的角色权限
> 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 })
三、用户角色详解
1.系统内置角色
MongoDB内部提供了一系列内置的角色,这些角色是为了完成一些基本的数据库操作。每个内置角色提供了用户在角色数据库内数据库级别所有非系统类集合的访问权限,也提供了对集合级别所有系统集合的访问权限。MongoDB在每个数据库上都提供内置的数据库用户角色和数据库管理角色,但只在admin数据库中提供其它的内置角色。
内置角色主要包括以下几个类别:
1.数据库用户角色(Database User Roles)
2.数据库管理角色(Database Administration Roles)
3.集群管理角色(Cluster Administration Roles)
4.备份和恢复角色(Backup and Restoration Roles)
5.全数据库级角色(All-Database Roles)
6.超级用户角色(Superuser Roles)
7.内部角色(Internal Role)
2.数据库角色
read
read角色包含读取所有非系统集合数据和订阅部分系统集合(system.indexes、system.js、system.namespaces)的权限。
该角色权限包含命令操作:changeStream、collStats、dbHash、dbStats、find、killCursors、listIndexes、listCollections。
readWrite
readWrite角色包含read角色的权限同时增加了对非系统集合数据的修改权限,但只对系统集合system.js有修改权限。
该角色权限包含命令操作:collStats、convertToCapped、createCollection、dbHash、dbStats、dropCollection、createIndex、dropIndex、find、insert、killCursors、listIndexes、listCollections、remove、renameCollectionSameDB、update。
3.数据库管理角色
dbAdmin
dbAdmin角色包含执行某些管理任务(与schema相关、索引、收集统计信息)的权限,该角色不包含用户和角色管理的权限。
对于系统集合(system.indexes、system.namespaces、system.profile)包含命令操作:collStats、dbHash、dbStats、find、killCursors、listIndexes、listCollections、dropCollection and createCollection(仅适用system.profile)
对于非系统集合包含命令操作:bypassDocumentValidation、collMod、collStats、compact、convertToCapped、createCollection、createIndex、dbStats、dropCollection、dropDatabase、dropIndex、enableProfiler、reIndex、renameCollectionSameDB、repairDatabase、storageDetails、validate
dbOwner
dbOwner角色包含对数据所有的管理操作权限。即包含角色readWrite、dbAdmin和userAdmin的权限。
userAdmin
userAdmin角色包含对当前数据库创建和修改角色和用户的权限。该角色允许向其它任何用户(包括自身)授予任何权限,所以这个角色也提供间接对超级用户(root)的访问权限,如果限定在admin数据中,也包括集群管理的权限。
该角色权限包含命令操作:changeCustomData、changePassword、createRole、createUser、dropRole、dropUser、grantRole、revokeRole、setAuthenticationRestriction、viewRole、viewUser。
4.集群管理角色
clusterManager
clusterManager角色包含对集群监控和管理操作的权限。拥有此角色的用户能够访问集群中的config数据库和local数据库。
对于整个集群该角色包含命令操作:addShard、appendOplogNote、applicationMessage、cleanupOrphaned、flushRouterConfig、listSessions (3.6新增)、listShards、removeShard、replSetConfigure、replSetGetConfig、replSetGetStatus、replSetStateChange、resync。
对于集群中所有的数据库包含命令操作:enableSharding、moveChunk、splitChunk、splitVector。
对于集群中config数据库和local数据库包含的命令操作可以参考官方文档:
https://docs.mongodb.com/manual/reference/built-in-roles/#clusterManager。
clusterMonitor
clusterMonitor角色包含针对监控工具具有只读操作的权限。如工具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。
hostManager
hostManager角色包含针对数据库服务器的监控和管理操作权限。
对于整个集群该角色包含命令操作:applicationMessage、closeAllDatabases、connPoolSync、cpuProfiler、flushRouterConfig、fsync、invalidateUserCache、killAnyCursor (4.0新增)、killAnySession (3.6新增)、killop、logRotate、resync、setParameter、shutdown、touch、unlock。
对于集群中所有的数据库包含命令操作:killCursors、repairDatabase。
clusterAdmin
clusterAdmin角色包含MongoDB集群管理最高的操作权限。该角色包含clusterManager、clusterMonitor和hostManager三个角色的所有权限,并且还拥有dropDatabase操作命令的权限。
5.备份和恢复角色
backup
backup角色包含备份MongoDB数据最小的权限。
对于MongoDB中所有的数据库资源包含命令操作:listDatabases、listCollections、listIndexes。
对于整个集群包含命令操作:appendOplogNote、getParameter、listDatabases。
对于以下数据库资源提供find操作权限:
- 对于集群中的所有非系统集合,包括自身的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操作权限。
restore
restore角色包含从备份文件中还原恢复MongoDB数据(除了system.profile集合)的权限。
restore角色有以下注意事项:
- 如果备份中包含system.profile集合而恢复目标数据库没有system.profile集合,mongorestore会尝试重建该集合。因此执行用户需要有额外针对system.profile集合的createCollection和convertToCapped操作权限;
- 如果执行mongorestore命令时指定选项
--oplogReplay
,则restore角色包含的权限无法进行重放oplog。如果需要进行重放oplog,则需要只对执行mongorestore的用户授予包含对实例中任何资源具有任何权限的自定义角色。
对于整个集群包含命令操作:getParameter。
对于所有非系统集合包含命令操作:bypassDocumentValidation、changeCustomData、changePassword、collMod、convertToCapped、createCollection、createIndex、createRole、createUser、dropCollection、dropRole、dropUser、grantRole、insert、revokeRole、viewRole、viewUser。
关于restore角色包含其它的命令操作可以参考官方文档:https://docs.mongodb.com/manual/reference/built-in-roles/#restore。
6.全数据库级角色
以下角色只存在于admin数据库,并且适用于除了config和local之外所有的数据库。
readAnyDatabase
readAnyDatabase角色包含对除了config和local之外所有数据库的只读权限。同时对于整个集群包含listDatabases命令操作。
在MongoDB3.4版本之前,该角色包含对config和local数据库的读取权限。当前版本如果需要对这两个数据库进行读取,则需要在admin数据库授予用户对这两个数据库的read角色。
readWriteAnyDatabase
readWriteAnyDatabase角色包含对除了config和local之外所有数据库的读写权限。同时对于整个集群包含listDatabases命令操作。
在MongoDB3.4版本之前,该角色包含对config和local数据库的读写权限。当前版本如果需要对这两个数据库进行读写,则需要在admin数据库授予用户对这两个数据库的readWrite角色。
userAdminAnyDatabase
userAdminAnyDatabase角色包含类似于userAdmin角色对于所有数据库的用户管理权限,除了config数据库和local数据库。
对于集群包含命令操作:authSchemaUpgrade、invalidateUserCache、listDatabases。
对于系统集合admin.system.users和admin.system.roles包含命令操作:collStats、dbHash、dbStats、find、killCursors、planCacheRead、createIndex、dropIndex。
该角色不会限制用户授予权限的操作,因此,拥有角色的用户也有可能授予超过角色范围内的权限给自己或其它用户,也可以使自己成为超级用户,userAdminAnyDatabase角色也可以认为是MongoDB中的超级用户角色。
dbAdminAnyDatabase
dbAdminAnyDatabase角色包含类似于dbAdmin角色对于所有数据库管理权限,除了config数据库和local数据库。同时对于整个集群包含listDatabases命令操作。
在MongoDB3.4版本之前,该角色包含对config和local数据库的管理权限。当前版本如果需要对这两个数据库进行管理,则需要在admin数据库授予用户对这两个数据库的dbAdmin角色。
7.超级用户角色
以下角色包含在任何数据库授予任何用户任何权限的权限。这意味着用户如果有以下角色之一可以为自己在任何数据库授予任何权限。
dbOwner角色(作用范围为admin数据库)
userAdmin角色(作用范围为admin数据库)
userAdminAnyDatabase角色
以下角色包含数据库所有资源的所有操作权限。
root
root角色包含角色readWriteAnyDatabase、dbAdminAnyDatabase、userAdminAnyDatabase、clusterAdmin、restore和backup联合之后所有的权限。
8.内部角色
__system
MongoDB将此角色授予代表集群成员的用户对象,如副本集(replica set)成员或mongos实例。该角色允许用户对于需要的数据库操作都具有相应的权限,不要将该角色授予应用程序用户或其它管理员用户。
9.用户自定义角色
虽然MongoDB提供了一系列内置角色,但有时内置角色所包含的权限并不满足所有需求,所以MongoDB也提供了创建自定义角色的方法。当创建一个自定义角色时需要进入指定数据库进行操作,因为MongoDB通过数据库和角色名称对角色进行唯一标识。
除了在admin数据库中创建的角色之外,在其它数据库中创建的自定义角色包含的权限只适用于角色所在的数据库,并且只能继承同数据库其它角色的权限。在admin数据库中创建的自定义角色则不受此限制。
MongoDB将所有的角色信息存储在admin数据库的system.roles集合中,不建议直接访问此集合内容,而是通过角色管理命令来查看和编辑自定义角色。
10.创建用户自定义角色
在admin数据库中创建自定义用户dbabd,对集合city有find,update权限,对集合user_operation只有find权限。
> db.createRole(
{
role: "test",
privileges: [
{ resource: { db: "testdb", collection: "test1" }, actions: ["find", "update"] },
{ resource: { db: "testdb", collection: "test2" }, actions: ["find"] },
],
roles: []
}
)
或
> db.adminCommand(
{
createRole: "test",
privileges: [
{ resource: { db: "testdb", collection: "test1" }, actions: ["find", "update"] },
{ resource: { db: "testdb", collection: "test2" }, actions: ["find"] }
],
roles: []
}
)
11.查看自定义角色
> db.getRole("test", { showPrivileges: true })
或
> db.getRoles({ rolesInfo: 1, showPrivileges: true })
或
> use admin
> db.runCommand( { rolesInfo: { role: "test", db: "admin" }, showPrivileges: true } )
12.更新自定义角色
为自定义角色dbabd更新集合dbabd.user_operation的insert权限。
> db.updateRole(
"test",
{
privileges: [
{ resource: { db: "testdb", collection: "test1" }, actions: ["find", "update"] },
{ resource: { db: "testdb", collection: "test2" }, actions: ["find", "insert"] }
],
roles: []
}
)
或
> db.adminCommand(
{
updateRole: "test",
privileges: [
{ resource: { db: "testdb", collection: "test1" }, actions: ["find", "update"] },
{ resource: { db: "testdb", collection: "test2" }, actions: ["find", "insert"] }
],
roles: []
}
)
13.添加角色权限
为自定义角色test添加集合testdb.test2的remove权限。
db.grantPrivilegesToRole( "test", [ { resource: { db: "testdb", collection: "test2" }, actions: ["remove"] } ] )
或
> use admin
> db.runCommand( { grantPrivilegesToRole: "test", privileges: [ { resource: { db: "testdb", collection: "test2" }, actions: ["remove"] } ] } )
14.删除角色权限
为自定义角色test收回集合testdb.test1的update权限。
> db.revokePrivilegesFromRole( "test", [ { resource: { db: "testdb", collection: "test1" }, actions: ["update"] } ] )
或
> use admin
> db.runCommand( { revokePrivilegesFromRole: "test", privileges: [ { resource: { db: "testdb", collection: "test1" }, actions: ["update"] } ] } )
15.添加角色的继承角色
为自定义角色dbabd添加dbabd数据库的read角色,继承其角色权限。
> use testdb
> db.grantRolesToRole("test", [{ role: "read", db: "testdb" }])
或
> use testdb
> db.runCommand({ grantRolesToRole: "test", roles: [{ role: "read", db: "testdb" }] })
// 查询角色信息验证
> db.getRole("test")
{
"role" : "test",
"db" : "admin",
"isBuiltin" : false,
"roles" : [
{
"role" : "read",
"db" : "testdb"
}
],
"inheritedRoles" : [
{
"role" : "read",
"db" : "testdb"
}
]
}
16.删除角色继承的角色
为自定义角色test收回testdb数据库的read角色及其角色权限。
> use testdb
> db.revokeRolesFromRole("test", [{ role: "read", db: "testdb" }])
或
> use testdb
> db.runCommand({ revokeRolesFromRole: "test", roles: [{ role: "read", db: "testdb" }] })
//查询角色信息验证
> db.getRole("test")
{ "role" : "test", "db" : "admin", "isBuiltin" : false, "roles" : [ ], "inheritedRoles" : [ ] }
17.删除自定义角色
删除自定义角色test
> use admin
> db.dropRole("test")
或
> use admin
> db.runCommand({ dropRole: "test" })