mongodb使用者許可權安全認證
阿新 • • 發佈:2018-12-20
問題復現:
在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庫做相應的操作,但是現在對其他的資料庫也可以操作了,那這樣許可權完全亂掉了,也就沒有了許可權分離。
解決方法:
兩種場景:
- 單例項
- 分片叢集和副本集
針對單例項:
簡單說就是MongoDB啟動的時候沒有配置許可權驗證! 兩種方法:
- 配置檔案裡面新增auth=true
- 啟動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進行認證的。 具體步驟如下:
- 建立祕鑰檔案 openssl rand -base64 100 > /mysql/mongodb/keyfile0 //檔案內容採base64編碼,一共100個字元
- 修改檔案的許可權 Chmod 600 /mysql/mongodb/keyfile0
注意:許可權一定要改,否則後面啟動會報錯:I ACCESS [main] permissions on /mysql/mongodb/keyfile0 are too open
- 將檔案傳到叢集中的其他機器上面
- 將keyFile =/mysql/mongodb/keyfile0新增到配置檔案或者啟動的時候指定 --keyFile選項,重啟MongoDB即可。
注意: 1.新增祕鑰引數前也要向單例項的時候一樣,先設定一個管理使用者 2.啟動時可以不使用 --auth引數,因為使用了 --keyFile就必須驗證,也就是隱含了 --auth。但是–auth並不隱含 --keyFile。