Mongodb 之 安全權限控制

MongoDB3.0+的權限,網上搜出來的解決方法都是3.0如下的版本的,因此不適合3.0+以上的版本,因爲這版本改變的有些大,解決了好久,終於解決,下面把解決的步驟以及思路分享給你們。linux

一,不使用 --authmongodb

1.首先,不使用--auth參數啓動MongoDB:shell

./mongod -config /opt/mongodb/conf/mongodb.conf

2.接着,在命令窗口中輸入:數據庫

show dbs

看到只有一個local數據庫,admin是不存在的(這是3.0以上版本改變了的),咱們須要本身給他建立個admin數據庫函數

3.打開 mongo shell:code

./mongo  192.168.31.101:27017/admin

4.添加管理用戶server

use admin  
db.createUser(  
  {  
    user: "admin",  
pwd: "admin",  
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]  
  }  
)

roles 中的 db 參數是必須的,否則會報錯:Error: couldn’t add user: Missing expected field 「db」。另外,有不少文章記錄的是使用 db.addUser(…) 方法,這個方法是舊版的,3.0中已經不存在xml

5.切換到admin下,查看剛纔建立的用戶:索引

show users  
或  
db.system.users.find()
{ "_id" : "admin.buru", "user" : "admin", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "gwVwuA/dXvxgSHavEnlyvA==", "storedKey" : "l2QEVTEujpkCuqDEKqfIWbSv4ms=", "serverKey" : "

 

怎麼關閉 mongoDB?千萬不要 kill -9 pid,能夠 kill -2 pid 或 db.shutdownServer()get

二,使用--auth

1.使用--auth參數啓動MongoDB:

./mongod --auth -f /opt/mongodb/conf/mongodb.conf

2.再次打開 mongo shell:

./mongodb-linux-i686-3.0.0/bin/mongo  
use admin  
db.auth("admin","admin") #認證,返回1表示成功  
或  
./mongodb-linux-i686-3.0.0/bin/mongo -u admin -p admin --authenticationDatabase admin

此時

show collections

報錯

2017-10-17T10:15:56.011+0800 EQUERYError: listCollections failed: {  
"ok" : 0,  
"errmsg" : "not authorized on admin to execute command { listCollections: 1.0 }",  
"code" : 13  
}  
  at Error (<anonymous>)  
  at DB._getCollectionInfosCommand (src/mongo/shell/db.js:643:15)  
  at DB.getCollectionInfos (src/mongo/shell/db.js:655:20)  
  at DB.getCollectionNames (src/mongo/shell/db.js:666:17)  
  at shellHelper.show (src/mongo/shell/utils.js:625:12)  
  at shellHelper (src/mongo/shell/utils.js:524:36)  
  at (shellhelp2):1:1 at src/mongo/shell/db.js:643

由於,用戶admin只有用戶管理的權限

3.下面建立用戶,用戶都跟着庫走,建立的用戶都是

use test  
db.createUser(  
 {  
   user: "test1",  
pwd: "test1",  
   roles: [  
      { role: "readWrite", db: "test" }  
   ]  
 }  
)

4.查看剛剛建立的用戶

show users
{  
"_id" : "test.test1",  
"user" : "test1",  
"db" : "test",  
"roles" : [  
    {  
"role" : "readWrite",  
"db" : "test"  
    }  
  ]  
}

5.查看整個mongoDB所有的用戶:

use admin  
db.system.users.find()
use admin  
db.system.users.find()  
  
{ "_id" : "admin.admin", "user" : "admin", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "gwVwuA/dXvxgSHavEnlyvA==", "storedKey" : "l2QEVTEujpkCuqDEKqfIWbSv4ms=", "serverKey" : "M1ofNKXg2sNCsFrBJbX4pXbSgvg=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }  
{ "_id" : "test.test1", "user" : "test1", "db" : "test", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "//xy1V1fbqEHC1gzQqZHGQ==", "storedKey" : "ZS/o54zzl/FdcXLQJ98KdAVTfF0=", "serverKey" : "iIpNYz2Gk8KhyK3zgz6muBt0PI4=" } }, "roles" : [ { "role" : "readWrite", "db" : "test" } ] }

6.建立完畢,驗證一下:

use admin  
show collections
2017-10-17T10:30:06.461+0800 EQUERYError: listCollections failed: {  
"ok" : 0,  
"errmsg" : "not authorized on buru to execute command { listCollections: 1.0 }",  
"code" : 13  
}  
  at Error (<anonymous>)  
  at DB._getCollectionInfosCommand (src/mongo/shell/db.js:643:15)  
  at DB.getCollectionInfos (src/mongo/shell/db.js:655:20)  
  at DB.getCollectionNames (src/mongo/shell/db.js:666:17)  
  at shellHelper.show (src/mongo/shell/utils.js:625:12)  
  at shellHelper (src/mongo/shell/utils.js:524:36)  
  at (shellhelp2):1:1 at src/mongo/shell/db.js:643

7.顯然沒權限,先auth:

db.auth("test1","test1")  
1  
show collections  
news  
system.indexes

完畢!

 

 

注意:

 

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數據庫中可用。超級帳號,超級權限
相關文章
相關標籤/搜索