(一)用户管理
(1)创建用户
1.要添加用户,MongoDB提供了db.createUser()方法。添加用户时,可以为用户分配角色,授予权限。
2.在数据库中创建的第一个用户应该具有管理其他用户的权限。
3.添加用户时,可以在特定的数据库中创建该用户,该数据库是用户的身份验证数据库。用户可以在不同的数据库之间拥有特权,也就是说,用户的权限不限于其身份验证数据库,通过分配其他数据库中的角色,在一个数据库中创建的用户可以对其它数据库执行操作。
4.用户名和身份验证数据库用作该用户的唯一标识,也就是说,如果两个用户具有相同的名称,但是在不同的数据库中创建,则他们是2个不同的用户,如果打算让一个用户对多个数据库拥有操作权限,请在适当的数据库中创建一个具有角色的单个用户,而不是在不同的数据库中多次创建该用户。
例子1:在lijiamandb数据库中,创建用户lijiaman,对该库具有读写权限。
use lijiamandb db.createUser( { user:"lijiaman", pwd:passwordPrompt(), roles:[{role:"readWrite",db:"lijiamandb"}] } )
例子2:在reportdb数据库中,创建用户report,对reportdb数据库具有读写权限,对lijiamandb具有读的权限。
use reportdb db.createUser( { user:"report", pwd:passwordPrompt(), roles:[ {role:"readWrite",db:"reportdb"}, {role:"read",db:"lijiamandb"} ] } )
(2)删除用户
db.dropUser("user_name")
(3)修改用户密码
例如,把lijiamandb数据库中的user1用户的密码改为123456。
use lijiamandb db.changeUserPassword("user1", "123456")
(二)认证机制
从MongoDB4.0版本开始,MongoDB删除了MONGODB-CR认证方式,MongoDB支持如下认证方式:
--SCRAM(默认方式)
--x.509
(三)基于角色的访问控制
1.MongoDB使用基于角色访问控制(Role-Based Access Control,RBAC)来管理对MongoDB系统的访问,授予用户一个或者多个角色,来决定用户对数据库资源的访问以及操作权限。
MongoDB默认不启用访问控制,管理员可以再启动中使用--auth或者配置文件中使用security.authorization参数来启用访问控制。
2.角色被授予权限,从而对资源执行指定的操作。
权限由指定的资源和对该资源允许的操作组成,一个资源可以是一个数据库、集合、或者是集群。如果资源师集群,则相关操作会影响系统状态。
(四)数据库内置角色
MongoDB在每一个数据库上提供内置的Database User Roles和Database Administration Roles,仅仅对admin数据库提供所有内置角色。
(4.1)Database User Roles
(4.1.1)read
读取所有非系统集合和system.js的功能。
该角色包含以下操作:
changeStream
collStats
dbHash
dbStats
find
killCursors
listIndexes
listCollections
(4.1.2)readWrite
在read角色的基础上,增加了对所有非系统集合和system.js集合的修改功能
该角色包含以下操作:
collStats
convertToCapped
createCollection
dbHash
dbStats
dropCollection
createIndex
dropIndex
find
insert
killCursors
listIndexes
listCollections
remove
renameCollectionSameDB
update
(4.2)Database Administration Roles
(4.2.1)dbAdmin
提供执行管理任务的能力,例如与schema相关的任务,索引和统计信息收集。该角色没有用户和角色管理的权限。
(4.2.2)dbOwner
数据库所有者可以对数据库执行任何操作,该角色由readWrite,dbAdmin,userAdmin角色组合授权。
(4.2.3)userAdmin
提供在当前数据库上创建和修改角色和用户的功能,由于该角色允许用户向任何用户(包括自己)授予任何特权,该角色间接提供了超级用户的权限(后面理解不了,附原文)。
原文:Provides the ability to create and modify roles and users on the current database. Since the userAdmin role allows users to grant any privilege to any user, including themselves, the role also indirectly provides superuser access to either the database or, if scoped to the admin database, the cluster.
(4.3)Cluster Administration Roles
仅仅可以对创建在admin数据库中的用户授予集群管理角色。
(4.3.1)clusterAdmin
最大的集群管理权限,该角色包含clusterManager、clusterMonitor、hostManager角色,此外,还提供了dropDatabase操作权限。
(4.3.2)clusterManager
提供对集群的管理和监视操作,具有此角色的用户可以访问config和local数据库,分别用于分片和复制。
(4.3.3)clusterMonitor
提供对集群监视的只读访问。
(4.3.4)hostManager
提供监视和管理服务器的功能。
(4.4)Backup and Restoration Roles
仅仅可以对创建在admin数据库中的用户授予备份与恢复角色。
(4.4.1)backup
提供了最小的使用MongoDB Cloud Manager,Ops Manager,mongodump工具备份数据库的权限。
(4.4.2)restore
提供了使用mongorestore恢复数据的权限。
(4.5)All-Database Roles
仅仅可以对创建在admin数据库中的用户授予对全部数据库操作的角色。
(4.5.1)readAnyDatabase
除了local和config数据库,提供了对其它所有数据库只读(read)的权限。
(4.5.2)readWriteDatabase
除了local和config数据库,提供了对其它所有数据库读写(readWrite)的权限。
(4.5.3)userAdminAnyDatabase
除了local和config数据库,提供了对其它所有数据库userAdmin角色的权限。
(4.5.4)dbAdminAnyDatabase
除了local和config数据库,提供了对其它所有数据库dbAdmin角色的权限。
(4.6)Superuser Roles
以下角色具有授予任意数据库中任意用户任意权限的能力,这意味着具有以下角色的用户可以授予自己任何权限。
-- 在admin数据库中,具有dbOwner角色的用户
-- 在admin数据库中,具有userAdmin角色的用户
-- 具有userAdminAnyDatabase角色的用户
(4.6.1)root
root角色包含了以下角色:
readWriteAnyDatabase
dbAdminAnyDatabase
userAdminAnyDatabase
clusterAdmin
restore
backup
(4.7)Internal Role
(4.7.1)__system
MongoDB将该角色分配给集群成员,例如副本集成员和mongos实例。授予该角色的用户能够对任意数据库进行任意操作,不要将此角色授予给应用程序用户。
(五)角色查看、授予、撤销
(5.1)前提条件
如果要授权角色给其它用户,必须要有grantRole权限;
如果要回收角色,必须要有revokeRole权限;
如果查看角色信息,必须要有viewRole权限。
(5.2)查看用户
(5.2.1)可以使用db.getUsers()查看某个数据库中的所有用户
use lijiamandb rstest:PRIMARY> db.getUsers() [ { "_id" : "lijiamandb.lijiaman", "userId" : UUID("3372dc4f-6c83-43fd-8693-a0845e43c16a"), "user" : "lijiaman", "db" : "lijiamandb", "roles" : [ { "role" : "readWrite", "db" : "lijiamandb" } ], "mechanisms" : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ] }, { "_id" : "lijiamandb.user1", "userId" : UUID("95fd5c9a-82d5-48dc-8cdc-0fea31e77d13"), "user" : "user1", "db" : "lijiamandb", "roles" : [ { "role" : "readWrite", "db" : "lijiamandb" } ], "mechanisms" : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ] }, { "_id" : "lijiamandb.user2", "userId" : UUID("f2a1cbf1-9e4d-46ab-b7c5-3a4bd6806465"), "user" : "user2", "db" : "lijiamandb", "roles" : [ { "role" : "readWrite", "db" : "lijiamandb" } ], "mechanisms" : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ] } ]
(5.2.2)可以使用db.getUser("user1")查看数据库中特定用户
use lijiamandb rstest:PRIMARY> db.getUser("user1") { "_id" : "lijiamandb.user1", "userId" : UUID("95fd5c9a-82d5-48dc-8cdc-0fea31e77d13"), "user" : "user1", "db" : "lijiamandb", "roles" : [ { "role" : "readWrite", "db" : "lijiamandb" } ], "mechanisms" : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ] } rstest:PRIMARY>
(5.3)查看角色
通过查看角色,可以看到角色的权限(action)。
use lijiamandb rstest:PRIMARY> db.getRole( "readWrite", { showPrivileges: true } )
(5.4)角色授予
use lijiamandb db.grantRolesToUser( "lijiaman", [ { role: "read", db: "lijiaman" } ] )
(5.5)角色回收
use lijiamandb db.revokeRolesFromUser( "lijiaman", [ { role: "readWrite", db: "lijiamandb" } ] )
【完】