理解admin數據庫
安裝MongoDB時,會自動創建admin數據庫,這是一個特殊的庫。有些用戶賬戶角色賦予用戶操作多個數據庫的權限,而這些用戶只能在admin數據庫中創建。要創建有權操作所有數據庫的超級用戶,必須將該用戶加入到admin數據庫中。檢查憑證時,MongoDB將在指定數據庫和admin數據庫中檢查用戶賬戶。
管理用戶賬戶
在MongoDB shell中,可添加、刪除和配置用戶。
創建用戶賬戶
數據庫管理的一個重要部分是創建能夠管理用戶和數據庫以及讀寫數據庫的用戶賬戶。
創建一個數據庫新用戶用db.createUser()方法,如果用戶存在則返回一個用戶重復錯誤。
db.createUser(user, writeConcern)
user: 這個文檔創建關於用戶的身份認證和訪問信息。
writeConcern: 這個文檔描述保證MongoDB提供寫操作的成功報告。
user文檔,定義了用戶的以下形式
{ user: "<name>", pwd: "<cleartext password>", customData: { <any information> }, roles: [ { role: "<role>", db: "<database>" } | "<role>", ... ] }
user文檔字段介紹
user | 獨一無二的用戶名 |
pwd | 用戶的密碼 |
cusomData | 為任意內容,例如可以為用戶全名介紹 |
roles | 指定用戶的角色,可以用一個空數組給用戶設定空角色 |
在roles字段,可以指定內置角色和用戶定義的角色。
內置角色(Built-In Roles)
內置角色是MongoDB預定義的角色,操作的資源是在DB級別上。MongoDB擁有一個SuperUser的角色:root,擁有最大權限,能夠執行任意操作。
數據庫用戶角色(Database User Roles):
- read:授予User用戶只讀權限
- readWriter:授予User用戶讀寫權限
數據庫管理角色(Database Administration Riles):
- dbAdmin:在當前DB中執行管理操作
- adOwner:在當前DB中執行任意操作
- userAdmin:在當前DB中管理用戶
集群管理角色(Cluster Administration Roles):
- clusterAdmin:授予管理集群的最高權限
- clusterManager:授予管理和監控集群的權限
- clusterMonitor:授予監控集群的權限,對監控工具具有readonly的權限
- hostManager:管理Server
備份恢復角色(Backup and Restoration Roles):
- backup
- restore
所有數據庫角色(All-Database Roles):
- readAnyDatabase:授予在所有數據庫上讀取數據的權限
- readWriterAnyDatabase:授予在所有數據庫上讀取數據的權限
- userAdminAnyDatabase:授予在所有數據庫上管理用戶的權限
- dbAdminAnyDatabase:授予管理所有數據庫的權限
writeConcern文檔
- w選項:允許的值分別是 1、0、大於1的值、"majority"、<tag set>;
- j選項:確保mongod實例寫數據到磁盤上的journal(日志),這可以確保mongd以外關閉不會丟失數據。設置true啟用。
- wtimeout:指定一個時間限制,以毫秒為單位。wtimeout只適用於w值大於1。
實例
在admin數據庫中創建一個管理員用戶。
use admin db.createUser( { user: "testadmin", pwd: "123456", roles:[ "dbAdmin" ] } );
如圖表示添加成功。
列出用戶
在每個數據庫中,用戶賬戶都存儲在集合db.system.users中。要獲取用戶列表,可以使用兩種不同的方法。
方法一:
切換到要列出其用戶賬戶的數據庫,再執行命令show users。
1 use admin 2 show users
方法二:
切換到要列出其用戶賬戶的數據庫,對集合db.system.users執行find等查詢。db.system.users.find()返回一個游標對象,可以用它來訪問User文檔。
1 var cur = db.system.users.find() 2 cur.count() 3 cur.toArray()
如圖不光可列出用戶,還可調用 count() 方法顯示出有幾個用戶。
刪除用戶
要將用戶從MongoDB數據庫中刪除,可使用方法 dropUser(<username>)。
實例
刪除之前演示中在 admin 數據庫中創建的 testadmin。
1 use admin 2 db.dropUser("testAdmin")
配置訪問控制
MongoDB提供了數據庫級身份驗證和授權,這意味着用戶賬戶存在與單個數據庫中。為支持基本的身份驗證,MongoDB在每個數據庫中都將用戶憑證存儲在集合system.users中。
MongoDB安裝后,數據庫admin中沒有任何用戶賬戶,此時MongoDB向從本地主機發起的連接提供全面的數據庫管理權限。配置MongoDB時,首先需要創建用戶管理員賬戶和數據庫管理員賬戶。用戶管理員賬戶可在admin和其他數據庫中創建用戶賬戶。數據庫管理員賬戶可作為管理數據庫、集群、復制和MongoDB其他方面的超級用戶。
注意:
用戶管理員賬戶和數據庫管理員賬戶都是在admin數據庫中創建的。
創建用戶管理員賬戶
用戶管理員應只有創建用戶賬戶的權限,而不能管理數據庫或執行其他管理任務。
用戶管理員的角色應為 userAdminAnyDatabase,這可以讓用戶管理員能夠新建用戶賬戶,但不能對數據庫執行其他操作。
1 use admin 2 db.createUser( { user: "userAdmin", pwd:"123456", roles: [ "userAdminAnyDatabase" ] } )
啟用身份驗證
創建用戶管理員賬戶后,使用參數--auth重啟MongoDB服務器,也可在配置文件中指定auth設置。
mongod -dbpath <mongo_data_location>/data/db -auth
或配置文件
配置完成后,再想從MongoDB shell訪問MongoDB服務器管理用戶時,必須向數據庫驗證身份,不然沒有權限管理用戶。
可以執行下面的命令向admin數據庫驗證身份。
use admin
db.auth("userAdmin","123456")
或在啟動MongoDB shell 時使用選項 --username和--password 向數據庫admin驗證身份。
mongo --username "userAdmin" --password "123456"
創建數據庫管理員賬戶
數據庫管理員的角色應為 readWriteAnyDatabase、dbAdminAnyDatabase 和 clusterAdmin 。這讓這名用戶能夠訪問系統中所有數據庫、創建新的數據庫以及管理MongoDB集群和副本集。
use admin db.createUser( { user: "dbadmin", pwd:"123456", roles: [ "readWriteAnyDatabase","dbAdminAnyDatabase","clusterAdmin" ] } )
注意:用戶管理員沒有權限通過MongoDB shell關閉mongod服務器,必須切換到數據庫管理員賬戶才可關閉mongod服務器。