MongoDB 2.4新引入了一套權限控制的機制,而舊的addUser的方法在3.0已經再也不提供,這對咱們管理MongoDB形成了諸多不便。本文簡單總結一下新版MongoDB關於權限管控的一些技巧。
· MongoDB使用了基於角色的訪問策略來管理MongoDB的安全控制。能夠賦予用於一個或多個權限來讓用戶能訪問數據庫的資源並進行某項數據庫的操做。若是不對用於賦予權限,用戶沒有任何權限。
· MongoDB默認不啓用安全受權機制。在單節點環境下,你須要在啓動mongod時指定–auth,或者在參數裏設置auth=true
來啓用這個特性。若是你是一個shard集羣或者RS的環境時,你就須要爲每個節點指定keyfile,這個文件內包含相同的字符串信息(不能包含符號),用於節點成員驗證。若是制定了keyfile,就默認對RS/集羣啓用了auth。例如以此對MongoDB中的member執行:mongodb
echo "mongomemberspassword" > /etc/mongod.key echo "keyfile=/etc/mongod.key" >> /etc/mongod.conf chown mongodb:root /etc/mongod.key chmod 600 /etc/mongod.key service mongod restart
· MongoDB提供了不少內建角色,用戶通用的數據庫管理。內建角色的文檔在這裏http://docs.mongodb.org/manual/reference/built-in-roles/。MongoDB提供了數據庫管理權限和數據庫用戶權限兩種類型,其餘的權限只能做用於admin數據庫上。具體以下:數據庫
針對每個數據庫進行控制。
read :提供了讀取全部非系統集合,以及系統集合中的system.indexes, system.js, system.namespaces
readWrite: 包含了全部read權限,以及修改全部非系統集合的和系統集合中的system.js的權限.數組
每個數據庫包含了下面的數據庫管理角色。
dbOwner:該數據庫的全部者,具備該數據庫的所有權限。
dbAdmin:一些數據庫對象的管理操做,可是沒有數據庫的讀寫權限。(參考:http://docs.mongodb.org/manual/reference/built-in-roles/#dbAdmin)
userAdmin:爲當前用戶建立、修改用戶和角色。擁有userAdmin權限的用戶能夠將該數據庫的任意權限賦予任意的用戶。安全
admin數據庫包含了下面的角色,用戶管理整個系統,而非單個數據庫。這些權限包含了複製集和共享集羣的管理函數。
clusterAdmin:提供了最大的集羣管理功能。至關於clusterManager, clusterMonitor, and hostManager和dropDatabase的權限組合。
clusterManager:提供了集羣和複製集管理和監控操做。擁有該權限的用戶能夠操做config和local數據庫(即分片和複製功能)
clusterMonitor:僅僅監控集羣和複製集。
hostManager:提供了監控和管理服務器的權限,包括shutdown節點,logrotate, repairDatabase等。
備份恢復權限:admin數據庫中包含了備份恢復數據的角色。包括backup、restore等等。服務器
admin數據庫提供了一個mongod實例中全部數據庫的權限角色:
readAnyDatabase:具備read每個數據庫權限。可是不包括應用到集羣中的數據庫。
readWriteAnyDatabase:具備readWrite每個數據庫權限。可是不包括應用到集羣中的數據庫。
userAdminAnyDatabase:具備userAdmin每個數據庫權限,可是不包括應用到集羣中的數據庫。
dbAdminAnyDatabase:提供了dbAdmin每個數據庫權限,可是不包括應用到集羣中的數據庫。函數
root: dbadmin到admin數據庫、useradmin到admin數據庫以及UserAdminAnyDatabase。但它不具備備份恢復、直接操做system.*集合的權限,可是擁有root權限的超級用戶能夠本身給本身賦予這些權限。
瞭解權限了以後,就是賦權語句了。新版的函數比以前的要麻煩不少:
db.createUser(user, writeConcern)
user
關於用戶的身份認證和訪問信息(JSON);
writeConcern
這個文檔描述MongoDB提供寫操做的成功報告。
user文檔,定義了用戶的如下形式:ui
{ user: "<name>", pwd: "<cleartext password>", customData: { <any information> }, roles: [ { role: "<role>", db: "<database>" } | "<role>", ... ] }
user文檔字段介紹:spa
user字段,用戶的名字;
pwd字段,用戶的密碼;
cusomData字段,爲任意內容,例如能夠爲用戶全名介紹;
roles字段,指定用戶的角色,能夠用一個空數組給新用戶設定空角色;roles字段,能夠指定內置角色和用戶定義的角色。
那麼建立一個管理員,直接給幾個全部數據庫權限便可。rest
db.createUser({ user:"test", pwd:"test.com", roles: [ { role:"userAdminAnyDatabase", db:"admin" }, { role:"readWriteAnyDatabase", db:"admin" }, { role:"dbAdminAnyDatabase", db:"admin" } ]})
建立某個數據庫的只讀權限,該用戶首先要使用」use db_name;」到對應的數據庫下建立權限,不然它會建立在其餘數據庫下面(好比admin)。code
db.createUser({ user:"test", pwd:"test.com", roles: [ { role:"read", db:"test" } ]
以此類推。咱們能夠經過db.auth("username","password")
或者下面的方式來驗證:
mongo -u test -p test.com --authenticationDatabase test
除了db.createUser()
,下面幾個函數也是經常使用的:
得到數據庫的全部用戶權限信息:db.getUsers()
得到某個用戶的權限信息:db.getUser()
建立角色: db.createRole()
更新角色:db.updateRole()
刪除角色:db.dropRole()
得到某個角色信息:db.getRole()
刪除用戶:db.dropUser()
刪除全部用戶:db.dropAllUsers()
將一個角色賦予給用戶:db.grantRolesToUser()
撤銷某個用戶的某個角色權限:db.revokeRolesFromUser()
更改密碼:db.changeUserPassword()