mongodb權限管理二


1、創建用戶:

1.1 語法格式:
  1. mongo>db.createUser(
  2. { user: "<name>",
  3. pwd: "<cleartext password>",
  4. customData: { <any information> },
  5. roles: [
  6. { role: "<role>", db: "<database>" } | "<role>",
  7. ...
  8. ]}
  9. )
例:
  1. > use admin
  2. >db.createUser(
  3. { user:'useradmin',
  4. pwd: '123456',
  5. customData:{ "desc":"This user is for administrators"},
  6. roles:[{role:'userAdminAnyDatabase',db:'admin'}]
  7. })
user:用戶名
pwd:密碼
customData: 用於描述賬戶信息
roles:指定用戶的角色,可以用一個空數組給新用戶設定空角色;在roles字段,可以指定內置角色和用戶定義的角色。
role里的角色可以選:
  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:允許用戶讀寫指定數據庫
backup,retore:在進行備份、恢復時可以單獨指定的角色,在db.createUser()方法中roles里面的db必須寫成是admin庫,要不然會 報錯
dbAdmin:允許用戶在指定數據庫中執行管理函數,如索引創建、刪除,查看統計或訪問system.profile
userAdmin:允許用戶向system.users集合寫入,可以找指定數據庫里創建、刪除和管理用戶
clusterAdmin:只在admin數據庫中可用,賦予用戶所有分片和復制集相關函數的管理權限。
readAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的讀權限
readWriteAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的讀寫權限
userAdminAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的userAdmin權限,
dbAdminAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的dbAdmin權限。
root:只在admin數據庫中可用。超級賬號,超級權限
 
1.2、創建具體權限的用戶例子:
  1. use admin
  2. db.createUser({ user:'superadmin',pwd:'123456', roles:[{role:'root', db:'admin'}]}) ---創建超級管理員用戶
  3.  
  4. db.createUser({ user:'useradmin',pwd:'123456', roles:[{role:'userAdminAnyDatabase', db:'admin'}]}) ---創建用戶管理員賬戶(能查詢其他庫集合,但不能查詢集合內容)
  5.  
  6. db.createUser({ user:'admin',pwd:'123456', roles:[{role:'readWriteAnyDatabase', db:'admin'}]}) ---創建訪問任意庫讀寫的賬戶
  7.  
  8. db.createUser({ user:'user1',pwd:'user1',roles:[{role:'readWrite',db:'test'}]}) ---創建只對test庫有讀寫權限的用戶
  9.  
  10. db.createUser({ user:"bkuser2",pwd:"Bkuser2",roles:[{role:"backup",db:"admin"}]}) ---創建用於備份時的用戶,如若是恢復權限,則將backup換為restore即可
注:新建backup賬戶時,roles里面的db必須是admin,要不然會報錯,如下:
  1. rs1:PRIMARY> db.createUser({ user:"bkuser2",pwd:"Bkuser2",
  2.                             roles:[{role:"backup",db:"test"}]
  3.                            })
  4.  
  5. Error: couldn't add user: No role named backup@test :
1.3、驗證新建用戶
用戶在哪個庫新建授權,則需要在哪個庫進行auth驗證,注意一點,帳號是跟着庫走的,所以在指定庫里授權,必須也在指定庫里驗證(auth)。    
  1. >db ---查看當前所在庫
  2. test
  3. >db.createUser({user:'test1',pwd:'test1',roles:[{role:'readWrite',db:'test'},{role:'read',db:'Johnny'})})
  4. > use Johnny
  5. Johnny
  6. >db.auth( 'test1','test1')
  7. Error:Authentication failed.
  8. 0 ---表示auth驗證失敗
  9.  
  10. > use test
  11. >db.auth( 'test1','test1')
  12. 1 ---表示驗證成功
所以說明一點,用戶在哪個庫創建,就要在哪個庫auth認證,並在mongo登錄時也要先連接認證庫
 
1.4、查詢用戶:
     查詢實例中所有的用戶信息
>use admin
>db.system.users.find().pretty()          ---將所有用戶信息查詢出來
 
顯示某一庫下的所有用戶
>use test
>show users                              ---顯示在此庫授權的用戶信息
 
查詢指定用戶的相關信息:
  1. rs1:PRIMARY>db
  2. Johnny
  3. rs1:PRIMARY> db.getUser("jianlong") ---需要在用戶所在庫才能執行此命令並獲得信息,查詢到的信息和“show user”一樣,只是可以指定用戶罷了
  4. {
  5. "_id" : "Johnny.jianlong",
  6. "user" : "jianlong",
  7. "db" : "Johnny",
  8. "roles" : [
  9. {
  10. "role" : "readWrite",
  11. "db" : "test"
  12. },
  13. {
  14. "role" : "readWrite",
  15. "db" : "Johnny"
  16. }
  17. ]
  18. }
  19. rs1:PRIMARY> use tt
  20. switched to db tt
  21. rs1:PRIMARY> db.getUser( "jianlong") ---在賬戶非授權庫進行用戶信息查詢則會提示NULL
  22. null
  23.  
2、修改用戶

db.updateUser(username,update,writeConcern)
username部分是必須要有的,添加需要更新的username
update部分里內容是可選,但必須有其中一項,例customData、roles、pwd
writeConcern部分是可選項
語法結構:
  1. db.updateUser(
  2. "<username>",
  3. {
  4. customData : { <any information> },
  5. roles : [
  6. { role: "<role>", db: "<database>" } | "<role>",
  7. ...
  8. ],
  9. pwd: "<cleartext password>"
  10. },
  11. writeConcern: { <write concern> })
2.1、修改用戶權限
可以通過此命令修改用戶的權限,但使用此命令修改權限時,則會覆蓋原先的所有權限
例:
rs1:PRIMARY> db.updateUser("root",
                         { roles:[{role:"readWriteAnyDatabase",
                                   db:"admin"}]
                          })
                        
     在原來權限上新增權限:
  1. rs1:PRIMARY> use Johnny
  2. switched to db Johnny
  3. rs1:PRIMARY> db.grantRolesToUser( "jianlong",[{role:'readWrite',db:'test'}]) ---不會覆蓋原權限信息,只新增權限
  4. rs1:PRIMARY> show users;
  5. {
  6. "_id" : "Johnny.jianlong",
  7. "user" : "jianlong",
  8. "db" : "Johnny",
  9. "roles" : [
  10. {
  11. "role" : "readWrite",
  12. "db" : "test"
  13. },
  14. {
  15. "role" : "readWrite",
  16. "db" : "Johnny"
  17. }
  18. ]
  19. }
  20. rs1:PRIMARY> use tt
  21. rs1:PRIMARY> db.grantRolesToUser( "jianlong",[{role:'read',db:'tt'}])
  22. 2016-11-09T15:59:20.154+0800 E QUERY [thread1] Error: Could not find user jianlong@tt
  23. ---不能在用戶非授權庫進行用戶的權限添加,否則會報錯,即表現出賬戶跟着庫走的特點
2.2、修改用戶密碼:
     使用db.changeUserPassword(“username","newPasswd")
rs1:PRIMARY> use tt
switched to db tt
rs1:PRIMARY> db.changeUserPassword("tuser"," 123456")          ---注意要在賬戶所在授權庫執行此命令
 
3、刪除用戶
>db.dropUser("test1")
 
 
4、用戶自定義角色Role

語法格式:
  1. >db.createRole(
  2. {
  3. role: "<name>", ---role名字
  4. privileges: [
  5. { resource: { <resource> }, actions: [ "<action>", ... ] }, ---配置具體對象的權限,比如對某集合的find,insert等權限
  6. ...
  7. ],
  8. roles: [
  9. { role: "<role>", db: "<database>" } | "<role>", ---繼承其他角色權限,可以數組為空
  10. ...
  11. ]
  12. }
  13. )
官方網站上有這樣一句話需要注意:
Except for roles created in the  admin database, a role can only include privileges that apply to its database and can only inherit from other roles in its database.
也就是說除了admin庫里的role以外,自定義角色擁有的權限只能應用到本庫並且也只能從本庫的角色進行權限繼承(如果理解有誤還望指點)
但是我試驗了一下:雖然配置角色權限時不能映射其他庫的對象權限,但是角色可以跨庫授權給用戶(如果你不明白這句話,沒關系,咱直接上實驗)
 
舉例:
  1. db.createRole({
  2. role:"SenderHis_Read",
  3. privileges:[
  4. {resource:{db:"APP_MSG_GW",collection:"SenderHis"},actions:["find"]}
  5. ],
  6. roles:[
  7. {role:"read",db:"admin"} ---繼承的角色可以為空數組[]
  8. ]
  9. })

如果想在此角色上添加其他庫中集合的查詢權限則會報錯:
     
若在APP_SUPERPROXY庫上另建一角色
  1. db.createRole({
  2. role:"MONITOR_Read",
  3. privileges:[
  4. {resource:{db:"APP_SUPERPROXY",collection:"MONITOR"},actions:["find"]}
  5. ],
  6. roles:[]
  7. })

此時可以將兩個角色同時授權給APP_MSG_GW庫下的一個用戶,使其擁有兩個庫中某些集合的查詢權限
  1. >db
  2. APP_MSG_GW
  3. > show users;
  4. {
  5. "_id" : "APP_MSG_GW.zbx_Moniter",
  6. "user" : "zbx_Moniter",
  7. "db" : "APP_MSG_GW",
  8. "customData" : {
  9. "desc" : "zabbix monitor account"
  10. },
  11. "roles" : [
  12. {
  13. "role" : "MONITOR_Read",
  14. "db" : "APP_SUPERPROXY"
  15. },
  16. {
  17. "role" : "SenderHis_Read",
  18. "db" : "APP_MSG_GW"
  19. }
  20. ]
  21. }
 
查看角色的具體privilege(權限)
>db.getRole("SenderHis_Read",{showPrivileges:true})
另一參數:showBuiltinRoles
 
5、創建執行eval()命令的權限
說明:
     比如你想在Python腳本中調用寫好的mongo存儲函數(存於system.js系統表中),如果你只是擁有普通權限,那么執行的時候就會報錯如下:
    
就算是你用root賬號去連接mongo來執行命令也沒用
解決辦法:
     創建一個角色,擁有anyResource的anyAction的權限
之后賦角色給用戶即可
     
安全性:
     如果必須要外部調用eval,否則請慎重創建此角色且賦給用戶      
anyAction
Allows any action on a resource.  Do not assign this action unless it is absolutely necessary.   
anyResource
The internal resource anyResource gives access to every resource in the system and is intended for internal use. Do not use this resource, other than in exceptional circumstances. The syntax for this resource is {anyResource: true }.
 

 


免責聲明!

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



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