Mongodb enable authentication
MongoDB 默認(rèn)直接連接,無須身份驗(yàn)證捻脖,如果當(dāng)前機(jī)器可以公網(wǎng)訪問,且不注意Mongodb 端口(默認(rèn) 27017)的開放狀態(tài)檀头,那么Mongodb就會產(chǎn)生安全風(fēng)險行剂,被利用此配置漏洞蹬刷,入侵?jǐn)?shù)據(jù)庫遥金。
容易遭受入侵的環(huán)境
- 使用默認(rèn) mongod 命令啟動 Mongodb
- 機(jī)器可以被公網(wǎng)訪問
- 在公網(wǎng)上開放了 Mongodb 端口
安全風(fēng)險
- 數(shù)據(jù)庫隱私泄露
- 數(shù)據(jù)庫被清空
- 數(shù)據(jù)庫運(yùn)行緩慢
解決方案
1. 禁止公網(wǎng)訪問 Mongodb 端口
1.1 網(wǎng)絡(luò)配置
由于網(wǎng)絡(luò)配置因人而異可很,需要根據(jù)自己實(shí)際環(huán)境進(jìn)行配置鳄虱,不作冗述弟塞。大致可以從以下方面禁止。
- 在路由器中關(guān)閉端口轉(zhuǎn)發(fā)
- 防火墻 iptables 禁止訪問
1.2 驗(yàn)證端口能否訪問方式
在外網(wǎng)機(jī)器命令行中運(yùn)行
telnet your.machine.open.ip 27017
2. 啟用驗(yàn)證
2.1 創(chuàng)建用戶管理員賬戶
當(dāng)前數(shù)據(jù)庫版本:Mongodb 3.4
使用 mongod 啟動數(shù)據(jù)庫
新建終端
mongod --port 27017 --dbpath /data/db1
參數(shù)默認(rèn)可以不加拙已,若有自定義參數(shù)决记,才要加上,下同倍踪。
另起一個終端系宫,運(yùn)行下列命令
mongo --port 27017
use admin
db.createUser(
{
user: "adminUser",
pwd: "adminPass",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
管理員創(chuàng)建成功,現(xiàn)在擁有了用戶管理員
用戶名:adminUser
密碼:adminPass
然后建车,斷開 mongodb 連接扩借, 關(guān)閉數(shù)據(jù)庫
兩個終端下 <C - c>
2.2 Mongodb 用戶驗(yàn)證登陸
啟動帶訪問控制的 Mongodb
新建終端
mongod --auth --port 27017 --dbpath /data/db1
現(xiàn)在有兩種方式進(jìn)行用戶身份的驗(yàn)證
第一種 (類似 MySql)
客戶端連接時,指定用戶名缤至,密碼潮罪,db名稱
mongo --port 27017 -u "adminUser" -p "adminPass" --authenticationDatabase "admin"
第二種
客戶端連接后,再進(jìn)行驗(yàn)證
mongo --port 27017
use admin
db.auth("adminUser", "adminPass")
// 輸出 1 表示驗(yàn)證成功
2.3 創(chuàng)建普通用戶
過程類似創(chuàng)建管理員賬戶,只是 role 有所不同
use foo
db.createUser(
{
user: "simpleUser",
pwd: "simplePass",
roles: [ { role: "readWrite", db: "foo" },
{ role: "read", db: "bar" } ]
}
)
現(xiàn)在我們有了一個普通用戶
用戶名:simpleUser
密碼:simplePass
權(quán)限:讀寫數(shù)據(jù)庫 foo错洁, 只讀數(shù)據(jù)庫 bar秉宿。
注意
NOTE
WARN
use foo
表示用戶在 foo 庫中創(chuàng)建,就一定要 foo 庫驗(yàn)證身份屯碴,即用戶的信息跟隨隨數(shù)據(jù)庫描睦。比如上述 simpleUser 雖然有 bar 庫的讀取權(quán)限,但是一定要先在 foo 庫進(jìn)行身份驗(yàn)證导而,直接訪問會提示驗(yàn)證失敗忱叭。
use foo
db.auth("simpleUser", "simplePass")
use bar
show collections
還有一點(diǎn)需要注意,如果 admin 庫沒有任何用戶的話今艺,即使在其他數(shù)據(jù)庫中創(chuàng)建了用戶韵丑,啟用身份驗(yàn)證,默認(rèn)的連接方式依然會有超級權(quán)限
2.4 內(nèi)建角色
- Read:允許用戶讀取指定數(shù)據(jù)庫
- readWrite:允許用戶讀寫指定數(shù)據(jù)庫
- dbAdmin:允許用戶在指定數(shù)據(jù)庫中執(zhí)行管理函數(shù)虚缎,如索引創(chuàng)建撵彻、刪除,查看統(tǒng)計或訪問system.profile
- userAdmin:允許用戶向system.users集合寫入实牡,可以找指定數(shù)據(jù)庫里創(chuàng)建陌僵、刪除和管理用戶
- clusterAdmin:只在admin數(shù)據(jù)庫中可用,賦予用戶所有分片和復(fù)制集相關(guān)函數(shù)的管理權(quán)限创坞。
- readAnyDatabase:只在admin數(shù)據(jù)庫中可用碗短,賦予用戶所有數(shù)據(jù)庫的讀權(quán)限
- readWriteAnyDatabase:只在admin數(shù)據(jù)庫中可用,賦予用戶所有數(shù)據(jù)庫的讀寫權(quán)限
- userAdminAnyDatabase:只在admin數(shù)據(jù)庫中可用题涨,賦予用戶所有數(shù)據(jù)庫的userAdmin權(quán)限
- dbAdminAnyDatabase:只在admin數(shù)據(jù)庫中可用偎谁,賦予用戶所有數(shù)據(jù)庫的dbAdmin權(quán)限。
- root:只在admin數(shù)據(jù)庫中可用纲堵。超級賬號巡雨,超級權(quán)限
2.5 URI 形式的訪問
生產(chǎn)中常用 URI 形式對數(shù)據(jù)庫進(jìn)行連接
mongodb://your.db.ip.address:27017/foo
添加用戶名密碼驗(yàn)證
mongodb://simpleUser:simplePass@your.db.ip.address:27017/foo
參考鏈接
結(jié)語
在使用數(shù)據(jù)庫的過程中,一定要注意安全風(fēng)險婉支,由于 Mongodb 的默認(rèn)配置鸯隅,使得數(shù)據(jù)庫有入侵風(fēng)險,應(yīng)該予以防范向挖。