前言
Mongodb 數據庫默認情況下是沒有訪問控制的,整個數據庫對外是開發的,只要能連上數據庫,則可以進行任何操作,這會對數據帶來很大的風險。當然,我們可以啟用mongodb的訪問控制,只讓通過認證的用戶才能對數據庫進行角色范圍內的操作。
啟用訪問控制可以通過在啟動 mongodb 時指定 --auth
參數來設置,另外還涉及到創建用戶 db.createUser
操作以及一些角色的定義,我們先來看這部分內容。
db.createUser() 用法
db.createUser({
user: "$USERNAME",
pwd: "$PASSWROD",
roles: [
{ role: "$ROLE_NAME", db: "$DBNAME"}
]
})
參數說明:
- user 是用戶名
- pwd 是密碼
- role 來指定用戶的角色
- db 來指定所屬的數據庫
- roles 是用戶所有角色的集合
Mongodb 預定義角色
Mongodb 中預定義了一些角色,把這些角色賦予給適當的用戶上,用戶就只能進行角色范圍內的操作。
1、數據庫用戶角色 (所有數據庫都有)
- read 用戶可以讀取當前數據庫的數據
- readWrite 用戶可以讀寫當前數據庫的數據
2、數據庫管理角色(所有數據庫都有)
- dbAdmin 管理員用戶但不能對用戶和角色管理授權
- dbOwner 數據庫所有者可進行任何管理任務
- userAdmin 可以管理當前數據的用戶和角色
3、集群管理角色(admin數據庫可用)
- clusterAdmin 集群所有管理權限,是 clusterManager , clusterMonitor, hostManager 合集
- clusterManager 集群管理和監控
- clusterMonitor 集群監控,只讀的
- hostManager 監控和管理服務器
4、備份和恢復角色(admin數據庫可用)
- backup
- restore
5、所有數據庫角色(admin數據庫可用)
- readAnyDatabase 讀取所有數據庫
- readWriteAnyDatabase 讀寫所有數據庫
- userAdminAnyDatabase 所有數據庫的 userAdmin 權限
- dbAdminAnyDatabase 所有數據庫的 dbAdmin 權限
6、超級角色(admin數據庫可用)
- root 超級用戶
7、內部角色
更多預定于角色的信息請參看:https://docs.mongodb.com/manual/core/security-built-in-roles/
啟用訪問控制的步驟
1, 啟動 mongodb 實例,關閉 訪問控制
不帶 --auth
2, 連接上 mongodb 實例
3,創建用戶管理員
在 admin 數據庫中添加一個 具有 userAdminAnyDatabase 角色的用戶作為用戶管理用戶。下面的例子中創建了 admin 為用戶管理員。
> 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,重啟數據庫啟用訪問控制
命令行啟動,只需要添加 --auth 參數
5,使用管理用戶連接,有兩種方法
- 使用命令行
./mongo -u "$USERNAME" -p "$PASSWROD" --authenticationDatabase "admin"
- 使用
db.auth()
我們使用第二種
>
> use admin
switched to db admin
> db.auth("admin", "admin")
1
>
1 表示認證成功
6, 為某個數據庫創建獨立用戶
以下為 test 數據庫 創建具有讀寫權限的用戶 test
admin 用戶由于只有 userAdminAnyDatabase 權限,所以沒有 test 數據的讀寫權限,所以,為了讀寫 test 數據庫,我們需要創建一個用戶。先看一下直接用 admin 會報什么錯誤
> 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 , 則報錯:not authorized on test to execute command ,意思是沒有權限。
> 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”)
, 再執行命令 則沒有報錯
> db.auth("test", "test")
1
>
> show collections
試著寫入一條數據,也是正常的。
> db.t.insert({name:"buzheng"});
WriteResult({ "nInserted" : 1 })
> db.t.find();
{ "_id" : ObjectId("58786c84bf5dd606ddfe1144"), "name" : "buzheng" }
>
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
您可能感興趣的文章:- MongoDB 3.0+安全權限訪問控制詳解
- 分布式文檔存儲數據庫之MongoDB備份與恢復的實踐詳解
- 分布式文檔存儲數據庫之MongoDB分片集群的問題
- 分布式文檔存儲數據庫之MongoDB訪問控制的操作方法