1. 程式人生 > >mongodb使用者許可權安全認證

mongodb使用者許可權安全認證

問題復現:

在test庫下面建立一個test使用者,許可權是readwrite

> use test
switched to db test
> db.createUser(  
...   { user: "test",  
...     pwd: "test",  
...     roles: [ { role: "readWrite", db: "test" } ]  
...   }  )
Successfully added user: {
	"user" : "test",
	"roles" : [
		{
			"role" : "readWrite",
			"db" : "test"
		}
	]
}
> db.auth('test','test')      //驗證使用者
1

test使用者登入系統

[[email protected] mongodb]# mongo --port 27001 -u test -p test --authenticationDatabase test  		

> show dbs				//進行一些操作
admin  0.000GB
local  0.000GB
test   0.000GB
wsh    0.000GB

> use wsh
switched to db wsh
> db.aaa.insert({'name':123})
WriteResult({ "nInserted" : 1 })	//竟然在非test庫下面插入成功了一條資料!!!

> db.aaa.find()
{ "_id" : ObjectId("59eb6098e9b2b2c737fd72ae"), "name" : 123 }

這是不正常的,因為給test使用者配置的是test庫的許可權,他只能對test庫做相應的操作,但是現在對其他的資料庫也可以操作了,那這樣許可權完全亂掉了,也就沒有了許可權分離。

解決方法:

兩種場景:

  1. 單例項
  2. 分片叢集和副本集

針對單例項:

簡單說就是MongoDB啟動的時候沒有配置許可權驗證! 兩種方法:

  1. 配置檔案裡面新增auth=true
  2. 啟動MongoDB的時候加上–auth引數啟動

在增加這個引數之前我們需要在admin下面建立一個管理使用者(類比MySQL中的root),因為MongoDB是預設不會建立任何管理使用者的。 因為如果沒有提前建立好使用者,啟動許可權認證的時候是沒有使用者可以用來登陸的。

>use admin
> db.createUser({user:"root", pwd:"123456", roles:[{role:"root", db:"admin"}]})
Successfully added user: {
	"user" : "root",
	"roles" : [
		{
			"role" : "root",
			"db" : "admin"
		}
	]
}

開啟認證:

mongod -f /mongodb/config.conf    --auth &

驗證管理員root:

> use admin
switched to db admin
> db.auth('root','123456')
1

切換資料庫建立一個普通使用者:

> db.createUser({user:"wsh", pwd:"wsh", roles:[{role:"readWrite", db:"wsh"}]}) 
Successfully added user: {
	"user" : "wsh",
	"roles" : [
		{
			"role" : "readWrite",
			"db" : "wsh"
		}
	]
}
> db.auth('wsh','wsh')				//一定要在賦權的資料庫上面驗證
1

登入驗證許可權問題:

> use wsh
switched to db wsh
> db.aaa.insert({'name':'wang'})			//插入成功
WriteResult({ "nInserted" : 1 })
> use test				//切換到其他非授權的資料庫
switched to db test
> show collections			//測試檢視collections
2017-10-22T00:10:31.009+0800 E QUERY    [thread1] Error: listCollections failed: {
	"ok" : 0,
	"errmsg" : "not authorized on test to execute command { listCollections: 1.0, filter: {} }",
	"code" : 13,
	"codeName" : "Unauthorized"
} :
> db.aaa.insert({'name':123})		//測試插入一條資料
WriteResult({
	"writeError" : {
		"code" : 13,
		"errmsg" : "not authorized on test to execute command { insert: \"aaa\", documents: [ { _id: ObjectId('59eb71f74faa433a15c4b5b6'), name: 123.0 } ], ordered: true }"

指定的使用者只能對指定的庫訪問。

針對分片叢集

在叢集中是使用祕鑰檔案keyfile進行認證的。 具體步驟如下:

  1. 建立祕鑰檔案 openssl rand -base64 100 > /mysql/mongodb/keyfile0 //檔案內容採base64編碼,一共100個字元
  2. 修改檔案的許可權 Chmod 600 /mysql/mongodb/keyfile0

注意:許可權一定要改,否則後面啟動會報錯:I ACCESS [main] permissions on /mysql/mongodb/keyfile0 are too open

  1. 將檔案傳到叢集中的其他機器上面
  2. 將keyFile =/mysql/mongodb/keyfile0新增到配置檔案或者啟動的時候指定 --keyFile選項,重啟MongoDB即可。

注意: 1.新增祕鑰引數前也要向單例項的時候一樣,先設定一個管理使用者 2.啟動時可以不使用 --auth引數,因為使用了 --keyFile就必須驗證,也就是隱含了 --auth。但是–auth並不隱含 --keyFile。