MongoDB 內置角色


(1).數據庫用戶角色

針對每一個數據庫進行控制。
read :提供了讀取所有非系統集合,以及系統集合中的system.indexes, system.js, system.namespaces
readWrite: 包含了所有read權限,以及修改所有非系統集合的和系統集合中的system.js的權限.

 

(2).數據庫管理角色

每一個數據庫包含了下面的數據庫管理角色。
dbOwner:該數據庫的所有者,具有該數據庫的全部權限。
dbAdmin:一些數據庫對象的管理操作,但是沒有數據庫的讀寫權限。(參考:http://docs.mongodb.org/manual/reference/built-in-roles/#dbAdmin
userAdmin:為當前用戶創建、修改用戶和角色。擁有userAdmin權限的用戶可以將該數據庫的任意權限賦予任意的用戶。

 

(3).集群管理權限

admin數據庫包含了下面的角色,用戶管理整個系統,而非單個數據庫。這些權限包含了復制集和共享集群的管理函數。
clusterAdmin:提供了最大的集群管理功能。相當於clusterManager, clusterMonitor, and hostManager和dropDatabase的權限組合。
clusterManager:提供了集群和復制集管理和監控操作。擁有該權限的用戶可以操作config和local數據庫(即分片和復制功能)
clusterMonitor:僅僅監控集群和復制集。
hostManager:提供了監控和管理服務器的權限,包括shutdown節點,logrotate, repairDatabase等。
備份恢復權限:admin數據庫中包含了備份恢復數據的角色。包括backup、restore等等。

 

(4).所有數據庫角色

admin數據庫提供了一個mongod實例中所有數據庫的權限角色:
readAnyDatabase:具有read每一個數據庫權限。但是不包括應用到集群中的數據庫。
readWriteAnyDatabase:具有readWrite每一個數據庫權限。但是不包括應用到集群中的數據庫。
userAdminAnyDatabase:具有userAdmin每一個數據庫權限,但是不包括應用到集群中的數據庫。
dbAdminAnyDatabase:提供了dbAdmin每一個數據庫權限,但是不包括應用到集群中的數據庫。

(5). 超級管理員權限

root: dbadmin到admin數據庫、useradmin到admin數據庫以及UserAdminAnyDatabase。但它不具有備份恢復、直接操作system.*集合的權限,但是擁有root權限的超級用戶可以自己給自己賦予這些權限。

(6). 備份恢復角色:backup、restore;

(7). 內部角色:__system

PS:關於每個角色所擁有的操作權限可以點擊上面的內置角色鏈接查看詳情。

官方實例

  1. use products # mongoDB的權限設置是以庫為單位的,必選要先選擇庫  
  2. db.createUser(   
  3. "user" : "accountAdmin01",   
  4.  "pwd": "cleartext password",  
  5.  "customData" : { employeeId: 12345 },  
  6.  "roles" : [ { role: "clusterAdmin", db: "admin" },   
  7.              { role: "readAnyDatabase", db: "admin" },  
  8.              "readWrite" ] },  
  9. { w: "majority" , wtimeout: 5000 } ) # readWrite 適用於products庫,clusterAdmin與readAnyDatabase角色適用於admin庫  

 

熟 悉 Oracle 的童鞋們都知道,數據庫用戶有兩種,一種是管理員,用來管理用戶,一種是普通用戶,用來訪問數據。類似的,為 MongoDB 規划用戶鑒權時,至少要規划兩種角色:用戶管理員和數據庫用戶。如果搭建了分片或主從,可能還會要規划數據庫架構管理員的角色,它們專門用來調整數據庫的 分布式架構。

在創建用戶之前,我們首先要修改 MongoDB 的啟動方式。缺省方式下 MongoDB 是不進行鑒權檢查的。我們只要在運行 MongoDB 的命令后面加上一個 --auth 參數即可,例如:

  1. mongod --dbpath ./db1 --port 20000 --auth  

 

MongoDB默認不啟用安全授權機制。在單節點環境下,你需要在啟動mongod時指定–auth,或者在參數里設置auth=true來啟用這個特性。

如果上述命令無效的話,那就 手動開啟用戶權限認證

  1. [gideon@ikeepstudying]$ vi /etc/mongodb.conf           //將auth=true前面的注釋拿掉  
  2. [gideon@ikeepstudying]$ /etc/init.d/mongod restart      //重啟生效  
  3. // 或者使用 sudo service mongod restart 重啟  

 

如何創建用戶管理員

用戶管理員是第一個要創建的用戶。在沒有創建任何用戶之前,你可以隨意創建用戶;但數據庫中一旦有了用戶,那么未登錄的客戶端就沒有權限做任何操作了,除非使用db.auth(username, password)方法登錄。

用戶管理員的角色名叫 userAdminAnyDatabase,這個角色只能在 admin 數據庫中創建。下面是一個例子:

  1. > use admin  
  2. switched to db admin  
  3. > db.createUser({user:"root",pwd:"root123",roles:["userAdminAnyDatabase"]})  
  4. Successfully added user: { "user" : "root", "roles" : [ "userAdminAnyDatabase" ] }  

 

這個例子創建了一個名為 root 的用戶管理員。創建完了這個用戶之后,我們應該馬上以該用戶的身份登錄:

  1. > db.auth("root","root123")  
  2. 1  

 

db.auth() 方法返回 1 表示登錄成功。接下來我們為指定的數據庫創建訪問所需的賬號。

 

如何創建數據庫用戶

首先保證你已經以用戶管理員的身份登錄 admin 數據庫。然后用 use 命令切換到目標數據庫,同樣用db.createUser() 命令來創建用戶,其中角色名為 “readWrite”。

普通的數據庫用戶角色有兩種,read 和 readWrite。顧名思義,前者只能讀取數據不能修改,后者可以讀取和修改。

下面是一個例子:

  1. > use test  
  2. switched to db test  
  3. > db.createUser({user:"testuser",pwd:"testpass",roles:["readWrite"]})  
  4. Successfully added user: { "user" : "testuser", "roles" : [ "readWrite" ] }  
  5. > db.auth("testuser","testpass")  
  6. 1  

 

這樣 MongoDB 的數據安全性就得到保障了,沒有登錄的客戶端將無法執行任何命令。

除了db.createUser(),下面幾個函數也是常用的:
獲得數據庫的所有用戶權限信息:db.getUsers()
獲得某個用戶的權限信息:db.getUser()
創建角色: db.createRole()
更新角色:db.updateRole()
刪除角色:db.dropRole()
獲得某個角色信息:db.getRole()
刪除用戶:db.dropUser()
刪除所有用戶:db.dropAllUsers()
將一個角色賦予給用戶:db.grantRolesToUser()
撤銷某個用戶的某個角色權限:db.revokeRolesFromUser()
更改密碼:db.changeUserPassword()
更多內容可以去看下 reference

那么,設置完這些后,如果需要登陸Rockmongo的話,可參考如下設置:

進入Rockmongo安裝的根目錄下,通常在/var/www/rockmongo路徑下。找到config.php文件並打開,在文件下面添加如下幾行配置代碼:

  1. /** 
  2.  * This is the configuration  for remote mongodb 
  3.  */  
  4. $MONGO["servers"][$i]["mongo_name"] = "The name of mongodb"; // 隨便自己命名,顯示在rockmongo的db昵稱,如: mongoHQ-helloworld  
  5. $MONGO["servers"][$i]["mongo_host"] = "The host of mongodb"; // 遠程mongodb服務器的主域名,如:troup.mongohq.com  
  6. $MONGO["servers"][$i]["mongo_port"] = "The port of mongodb"; // 遠程mongodb服務器提供的端口,如37017  
  7. $MONGO["servers"][$i]["mongo_user"] = "The username of mongodb"; // 擁有權限操作該db的用戶名,如:pigerla  
  8. $MONGO["servers"][$i]["mongo_pass"] = "The password of mongodb"; // 擁有權限操作該db的用戶密碼,如:xxxxxx  
  9. $MONGO["servers"][$i]["mongo_db"] = "The database's name of mongodb"; // 數據庫的名稱,如:helloworld  
  10. $MONGO["servers"][$i]["mongo_auth"] = false; // 當值為false時,表示rockmongo使用這里的配置去連接遠程mongodb,否則,只能在rockmongo登錄界面輸入以上信息進行登錄  
  11. $MONGO["servers"][$i]["control_users"]["admin"] = "admin"; // 當mongo_auth為false時,這設置才有效,表示在rockmongo登錄界面,用戶名為admin,密碼為  
  12. admin,這也是默認配置。  
  13. $i ++;  

 

我個人設置如下:

  1. /**  
  2. * Configuration of MongoDB servers 
  3. *  
  4. * @see more details at http://rockmongo.com/wiki/configuration?lang=en_us 
  5. */  
  6. $MONGO["servers"][$i]["mongo_name"] = "Localhost";//mongo server name  
  7. //$MONGO["servers"][$i]["mongo_sock"] = "/var/run/mongo.sock";//mongo socket path (instead of host and port)  
  8. $MONGO["servers"][$i]["mongo_host"] = "127.0.0.1";//mongo host  
  9. $MONGO["servers"][$i]["mongo_port"] = "27017";//mongo port  
  10. $MONGO["servers"][$i]["mongo_timeout"] = 0;//mongo connection timeout  
  11. //$MONGO["servers"][$i]["mongo_db"] = "MONGO_DATABASE";//default mongo db to connect, works only if mongo_auth=false  
  12. //$MONGO["servers"][$i]["mongo_user"] = "MONGO_USERNAME";//mongo authentication user name, works only if mongo_auth=false  
  13. //$MONGO["servers"][$i]["mongo_pass"] = "MONGO_PASSWORD";//mongo authentication password, works only if mongo_auth=false  
  14. $MONGO["servers"][$i]["mongo_auth"] = TRUE;//enable mongo authentication?  
  15.   
  16. $MONGO["servers"][$i]["control_auth"] = true;//enable control users, works only if mongo_auth=false  
  17. $MONGO["servers"][$i]["control_users"]["admin"] = "admin";//one of control users ["USERNAME"]=PASSWORD, works only if mongo_auth=false  
  18.   
  19. $MONGO["servers"][$i]["ui_only_dbs"] = "";//databases to display  
  20. $MONGO["servers"][$i]["ui_hide_dbs"] = "";//databases to hide  
  21. $MONGO["servers"][$i]["ui_hide_collections"] = "";//collections to hide  
  22. $MONGO["servers"][$i]["ui_hide_system_collections"] = false;//whether hide the system collections  
  23.   
  24. //$MONGO["servers"][$i]["docs_nature_order"] = false;//whether show documents by nature order, default is by _id field  
  25. //$MONGO["servers"][$i]["docs_render"] = "default";//document highlight render, can be "default" or "plain"  
  26.   
  27. $i ++;  

 

這樣,rockmongo可以自動查詢登陸信息是否正確了。

另外 mongo_host 和 mongo_port 都可以在 /etc/mongodb.conf 文件中找到,下面是我個人的截圖:

Selection_063


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM