
(一)用戶管理
(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)可以在admin數據庫中使用db.system.users.find()查看所有數據庫的所有用戶
> use admin
switched to db admin
> db.system.users.find().pretty()
(5.2.2)可以使用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.3)可以使用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" } ] )
【完】
