前言
Mongodb 數(shù)據(jù)庫(kù)默認(rèn)情況下是沒(méi)有訪問(wèn)控制的,整個(gè)數(shù)據(jù)庫(kù)對(duì)外是開(kāi)發(fā)的,只要能連上數(shù)據(jù)庫(kù),則可以進(jìn)行任何操作,這會(huì)對(duì)數(shù)據(jù)帶來(lái)很大的風(fēng)險(xiǎn)。當(dāng)然,我們可以啟用mongodb的訪問(wèn)控制,只讓通過(guò)認(rèn)證的用戶(hù)才能對(duì)數(shù)據(jù)庫(kù)進(jìn)行角色范圍內(nèi)的操作。
啟用訪問(wèn)控制可以通過(guò)在啟動(dòng) mongodb 時(shí)指定 --auth
參數(shù)來(lái)設(shè)置,另外還涉及到創(chuàng)建用戶(hù) db.createUser
操作以及一些角色的定義,我們先來(lái)看這部分內(nèi)容。
db.createUser() 用法
db.createUser({ user: "$USERNAME", pwd: "$PASSWROD", roles: [ { role: "$ROLE_NAME", db: "$DBNAME"} ] })
參數(shù)說(shuō)明:
Mongodb 預(yù)定義角色
Mongodb 中預(yù)定義了一些角色,把這些角色賦予給適當(dāng)?shù)挠脩?hù)上,用戶(hù)就只能進(jìn)行角色范圍內(nèi)的操作。
1、數(shù)據(jù)庫(kù)用戶(hù)角色 (所有數(shù)據(jù)庫(kù)都有)
2、數(shù)據(jù)庫(kù)管理角色(所有數(shù)據(jù)庫(kù)都有)
3、集群管理角色(admin數(shù)據(jù)庫(kù)可用)
4、備份和恢復(fù)角色(admin數(shù)據(jù)庫(kù)可用)
5、所有數(shù)據(jù)庫(kù)角色(admin數(shù)據(jù)庫(kù)可用)
6、超級(jí)角色(admin數(shù)據(jù)庫(kù)可用)
7、內(nèi)部角色
更多預(yù)定于角色的信息請(qǐng)參看:https://docs.mongodb.com/manual/core/security-built-in-roles/
啟用訪問(wèn)控制的步驟
1, 啟動(dòng) mongodb 實(shí)例,關(guān)閉 訪問(wèn)控制
不帶 --auth
./mongod
2, 連接上 mongodb 實(shí)例
./mongo
3,創(chuàng)建用戶(hù)管理員
在 admin 數(shù)據(jù)庫(kù)中添加一個(gè) 具有 userAdminAnyDatabase 角色的用戶(hù)作為用戶(hù)管理用戶(hù)。下面的例子中創(chuàng)建了 admin 為用戶(hù)管理員。
> use admin switched to db admin > db.createUser({ ... user: "admin", ... pwd: "admin", ... roles: [ ... { role: "userAdminAnyDatabase", db: "admin"} ... ] ... }) Successfully added user: { "user" : "admin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] } >
退出連接
4,重啟數(shù)據(jù)庫(kù)啟用訪問(wèn)控制
命令行啟動(dòng),只需要添加 --auth 參數(shù)
./mongo --auth
5,使用管理用戶(hù)連接,有兩種方法
./mongo -u "$USERNAME" -p "$PASSWROD" --authenticationDatabase "admin"
db.auth()
我們使用第二種
> > use admin switched to db admin > db.auth("admin", "admin") 1 >
1 表示認(rèn)證成功
6, 為某個(gè)數(shù)據(jù)庫(kù)創(chuàng)建獨(dú)立用戶(hù)
以下為 test 數(shù)據(jù)庫(kù) 創(chuàng)建具有讀寫(xiě)權(quán)限的用戶(hù) test
admin 用戶(hù)由于只有 userAdminAnyDatabase 權(quán)限,所以沒(méi)有 test 數(shù)據(jù)的讀寫(xiě)權(quán)限,所以,為了讀寫(xiě) test 數(shù)據(jù)庫(kù),我們需要?jiǎng)?chuàng)建一個(gè)用戶(hù)。先看一下直接用 admin 會(huì)報(bào)什么錯(cuò)誤
> use test > show collections 2017-01-13T13:49:17.691+0800 E QUERY [thread1] Error: listCollections failed: { "ok" : 0, "errmsg" : "not authorized on test to execute command { listCollections: 1.0, filter: {} }", "code" : 13 } : _getErrorWithCode@src/mongo/shell/utils.js:25:13 DB.prototype._getCollectionInfosCommand@src/mongo/shell/db.js:773:1 DB.prototype.getCollectionInfos@src/mongo/shell/db.js:785:19 DB.prototype.getCollectionNames@src/mongo/shell/db.js:796:16 shellHelper.show@src/mongo/shell/utils.js:754:9 shellHelper@src/mongo/shell/utils.js:651:15 @(shellhelp2):1:1
我們直接使用 show collections , 則報(bào)錯(cuò):not authorized on test to execute command ,意思是沒(méi)有權(quán)限。
> 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”)
, 再執(zhí)行命令 則沒(méi)有報(bào)錯(cuò)
> db.auth("test", "test") 1 > > show collections
試著寫(xiě)入一條數(shù)據(jù),也是正常的。
> db.t.insert({name:"buzheng"}); WriteResult({ "nInserted" : 1 }) > db.t.find(); { "_id" : ObjectId("58786c84bf5dd606ddfe1144"), "name" : "buzheng" } >
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
標(biāo)簽:興安盟 自貢 泰安 玉林 廈門(mén) 無(wú)錫 遼陽(yáng) 雞西
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Mongodb如何開(kāi)啟用戶(hù)訪問(wèn)控制詳解》,本文關(guān)鍵詞 Mongodb,如何,開(kāi)啟,用戶(hù),訪問(wèn),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。