2017.09.18 19:04:25字數 1174閱讀 772html
https://www.jianshu.com/p/cead54bd1e81mongodb
MongoDB認證和受權詳解
MongoDB安全介紹及配置身份認證
MondoDB安全數據庫
要想了解MongoDB的權限必須先了解以下一些關鍵字:vim
user:
用戶,用於提供客戶端鏈接MongoDB的認證帳戶;centos
role:
角色,數據權限的集合,建立用戶的時候必需要指定對應的角色,不然用戶沒法操做數據庫;數組
resource:
資源,包括database或collection 也能夠是database和collection的組合;
如 {db:<db>, collection:<collection>}
安全
actions:
權限操做,定義了 user 可以對 resource document 執行的操做;
如 增、刪、改、查;服務器
privilege:
權限,privilege 是一組 resource 和 action的組合,對資源擁有什麼操做稱爲權限;工具
authenticationDatabase:
認證庫,及建立角色或用戶時所在的庫;
如,在admin下建立MongoDB用戶那麼登陸的時候須要指定認證庫 admin;
在 test 庫下建立的用戶登陸的時候指定認證庫 test;spa
MongodDB存儲全部的用戶信息在admin數據庫的集合system.users中,保存數據庫、密碼和數據庫信息。MongoDB默認不啓用權限認證,只要能鏈接到服務器,就可鏈接到mongod。
若要啓用安全認證,須要更改配置文件Authorization,也可簡寫爲 auth。或者在命令行啓動MongoDB時加上 -auth
參數啓動,這樣當MongoDB啓動後就須要用戶和密碼進行認證了。
這是老版本MongoDB2.x中:
vim /etc/mongod.conf auth = true
MongoDB3.x中:
vim /etc/mongod.conf security: authorization:enabled
可是,不使用用戶名和密碼依然能夠鏈接到數據庫。可是將沒有權限查看數據庫。這裏能夠認證用戶:
mongo use 庫(如admin) db.auth("user","pwd")
或直接 mongo 127.0.0.1/admin -u user -p
來鏈接數據庫。
在MongoDB受權部分,其中admin數據庫中的用戶名能夠管理全部的數據庫,其餘數據庫中的用戶只能管理其所在的數據庫。
若是在副本集機制下開啓了 -auth
認證,那麼此時MongoDB副本集狀態就會變成不健康狀態,這就須要另一個認證方式 KeyFile
。
簡單來講 KeyFile
就是用在副本集羣間開啓認證的狀況下須要的另外一種認證方式,用來驗證集羣間身份的。
在各個節點的配置文件中加入KeyFile(600):
vim /etc/mongod.conf security: authorization:enabled KeyFile:/path/.KeyFile
在副本集模式下,在整個配置完成前不要建立任何用戶,當認證好了以後,就能夠建立用戶了。
MondoDB支持基於角色的訪問控制(RBAC)來管理對MongoDB系統的訪問。一個用戶能夠被受權一個或多個角色以決定該用戶對數據庫資源和操做的訪問權限。在權限之外,用戶是沒法訪問系統的。
數據庫角色在建立用戶的role參數中設置。角色分爲內建角色和自定義角色。
MongoDB內建角色包括如下幾類:
read:容許用戶讀取指定數據庫; readWrite:容許用戶讀寫指定數據庫;
dbAdmin:容許用戶進行索引建立、刪除,查看統計或訪問system.profile,但沒有角色和用戶管理的權限; userAdmin:提供了在當前數據庫中建立和修改角色和用戶的能力; dbOwner:提供對數據庫執行任何操做的能力。這個角色組合了readWrite、dbAdmin和userAdmin角色受權的特權;
hostManager:提供監視和管理服務器的能力; clusterManager:在集羣上提供管理和監視操做。能夠訪問配置和本地數據庫,這些數據庫分別用於分片和複製; clusterMonitor:提供對監控工具的只讀訪問; clusterAdmin:提供最強大的集羣管理訪問(副本集、分片、主從等)。組合了clusterManager、clusterMonitor和hostManager角色的能力,還提供了dropDatabase操做;
backup:提供備份數據所需的能力; restore: 提供使用mongorestore恢復數據的能力;
readAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的讀權限; readWriteAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的讀寫權限; userAdminAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的userAdmin權限; dbAdminAnyDataBase:只在admin數據庫中可用,賦予用戶全部數據庫的adAdmin權限;
root:超級權限,只能針對admin庫;
__system:提供對數據庫中任何對象的任何操做的特權;
MongoDB內置角色通常來講都是夠用的,但當內置角色不知足需求時就能夠自定義角色了。使用 db.createRole()
方法來自定義角色。
只能在 admin庫 中建立角色;
use admin db.createRole( { role:<role_name>, #定義角色名稱 privilege:[ #權限集 {resource:{cluster:true, actions:[<action_name>]}, {resource: {db:<db_name>, collection:<coll_name>}, actions:[<action_name>]} #定義對這個庫或集合可進行的權限操做,這是一個數組 ], roles:[{role:<role_name>, db:<db_name>}] #是否繼承其餘的角色
角色建立完畢後 MongoDB 會在系統庫 admin 下建立一個系統 collection 名叫 system.roles,裏面存儲的便是角色相關的信息。使用以下命令查看:
db.system.roles.find()
查看角色
db.getRole()
角色繼承
db.grantRolesToRole() #角色受權 db.revokeRolesfromRole() #角色移權
db.createUser({ user:"xxx", pwd:"xxxx", customDate:"xxx", roles:[{ #指定角色名稱以及認證庫 role:"xxx", db:"xxxx" }] })
認證
vim /etc/mongo.conf security: authorization:enabled
db.auth("user","passwd") #在use db後 或 mongo -u user -p passwd --authenticationDatabase xxx #在哪一個庫建立的用戶就須要使用哪一個庫進行認證
查看用戶
db.getUser("user") db.system.users.find()
刪除用戶
db.dropUser("user") db.dropAllUsers() #刪除當前庫全部用戶
添加用戶權限
db.grantRolesToUser()
修改密碼
db.changeUserPassword("user","new_passwd")
關閉MongoDB,千萬不要 kill -9 pid
,使用 db.shutdownServer()
。
在MongoDB中刪除庫和集合並不會級聯刪除對應的角色和用戶。所以若是想完全刪除對應的業務應該先刪除庫與其對應的角色和用戶。
若是既想實現精細化權限控制又想簡化用戶管理,原則上建議只給開發建立一個帳戶,而且使用admin作認證庫,這樣能夠避免清理過時業務庫而致使沒法登錄的問題。
2人點贊