前言
Mongodb 數(shù)據(jù)庫默認(rèn)情況下是沒有訪問控制的,整個數(shù)據(jù)庫對外是開發(fā)的,只要能連上數(shù)據(jù)庫,則可以進(jìn)行任何操作,這會對數(shù)據(jù)帶來很大的風(fēng)險。當(dāng)然,我們可以啟用mongodb的訪問控制,只讓通過認(rèn)證的用戶才能對數(shù)據(jù)庫進(jìn)行角色范圍內(nèi)的操作。
啟用訪問控制可以通過在啟動 mongodb 時指定 --auth
參數(shù)來設(shè)置,另外還涉及到創(chuàng)建用戶 db.createUser
操作以及一些角色的定義,我們先來看這部分內(nèi)容。
db.createUser() 用法
db.createUser({ user: "$USERNAME", pwd: "$PASSWROD", roles: [ { role: "$ROLE_NAME", db: "$DBNAME"} ]})
參數(shù)說明:
Mongodb 預(yù)定義角色
Mongodb 中預(yù)定義了一些角色,把這些角色賦予給適當(dāng)?shù)挠脩羯希脩艟椭荒苓M(jìn)行角色范圍內(nèi)的操作。
1、數(shù)據(jù)庫用戶角色 (所有數(shù)據(jù)庫都有)
2、數(shù)據(jù)庫管理角色(所有數(shù)據(jù)庫都有)
3、集群管理角色(admin數(shù)據(jù)庫可用)
4、備份和恢復(fù)角色(admin數(shù)據(jù)庫可用)
5、所有數(shù)據(jù)庫角色(admin數(shù)據(jù)庫可用)
6、超級角色(admin數(shù)據(jù)庫可用)
7、內(nèi)部角色
更多預(yù)定于角色的信息請參看:https://docs.mongodb.com/manual/core/security-built-in-roles/
啟用訪問控制的步驟
1, 啟動 mongodb 實例,關(guān)閉 訪問控制
不帶 --auth
./mongod
2, 連接上 mongodb 實例
./mongo
3,創(chuàng)建用戶管理員
在 admin 數(shù)據(jù)庫中添加一個 具有 userAdminAnyDatabase 角色的用戶作為用戶管理用戶。下面的例子中創(chuàng)建了 admin 為用戶管理員。
> use adminswitched 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ù)庫啟用訪問控制
命令行啟動,只需要添加 --auth 參數(shù)
./mongo --auth
5,使用管理用戶連接,有兩種方法
./mongo -u "$USERNAME" -p "$PASSWROD" --authenticationDatabase "admin"
db.auth()
我們使用第二種
> > use adminswitched to db admin> db.auth("admin", "admin")1>
1 表示認(rèn)證成功
6, 為某個數(shù)據(jù)庫創(chuàng)建獨立用戶
以下為 test 數(shù)據(jù)庫 創(chuàng)建具有讀寫權(quán)限的用戶 test
admin 用戶由于只有 userAdminAnyDatabase 權(quán)限,所以沒有 test 數(shù)據(jù)的讀寫權(quán)限,所以,為了讀寫 test 數(shù)據(jù)庫,我們需要創(chuàng)建一個用戶。先看一下直接用 admin 會報什么錯誤
> use test> show collections2017-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:13DB.prototype._getCollectionInfosCommand@src/mongo/shell/db.js:773:1DB.prototype.getCollectionInfos@src/mongo/shell/db.js:785:19DB.prototype.getCollectionNames@src/mongo/shell/db.js:796:16shellHelper.show@src/mongo/shell/utils.js:754:9shellHelper@src/mongo/shell/utils.js:651:15@(shellhelp2):1:1
我們直接使用 show collections , 則報錯:not authorized on test to execute command ,意思是沒有權(quán)限。
> use testswitched 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í)行命令 則沒有報錯
> db.auth("test", "test")1> > show collections
試著寫入一條數(shù)據(jù),也是正常的。
> db.t.insert({name:"buzheng"});WriteResult({ "nInserted" : 1 })> db.t.find();{ "_id" : ObjectId("58786c84bf5dd606ddfe1144"), "name" : "buzheng" }>
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
新聞熱點
疑難解答