如何保证MongoDB的安全性?
上周寫了個簡短的新聞《MongoDB裸奔,2億國人求職簡歷泄漏!》:
根據(jù)安全站點HackenProof的報告,由于MongoDB數(shù)據(jù)庫沒有采取任何安全保護措施,導(dǎo)致共計202,730,434份國人求職簡歷泄漏。然后很多人評論說MongoDB躺槍了。
MongoDB確實躺槍了,因為這事的責(zé)任當(dāng)然不在數(shù)據(jù)庫,而在于使用數(shù)據(jù)庫的人沒有做必要的安全配置。
那么我們應(yīng)該如何保證MongoDB的安全性?下面我將介紹保護MongoDB的3個簡單的方法:
- 綁定局域網(wǎng)IP,杜絕互聯(lián)網(wǎng)訪問
- 配置防火墻,保護27017端口
- 配置賬號密碼,對數(shù)據(jù)庫進行訪問控制
本教程所使用的系統(tǒng)配置如下:
- Ubuntu 16.04
- mongodb 4.0.5
Ubuntu 16.04安裝MongoDB
參考MongoDB文檔:Install MongoDB Community Edition on Ubuntu
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4 echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list sudo apt-get update sudo apt-get install -y mongodb-org=4.0.5 mongodb-org-server=4.0.5 mongodb-org-shell=4.0.5 mongodb-org-mongos=4.0.5 mongodb-org-tools=4.0.5 sudo service mongod start1. 綁定局域網(wǎng)IP,杜絕互聯(lián)網(wǎng)訪問
話說MongoDB被黑了這么多年,自身確實有一定的責(zé)任。版本3.6之前,MongoDB默認綁定的居然是0.0.0.0,這就意味著我們可以通過互聯(lián)網(wǎng)訪問MongoDB,那黑客當(dāng)然也可以。這樣的默認配置是一個很大的安全漏洞,很多MongoDB初學(xué)者都栽在這一點。關(guān)于這個問題,MongoDB的文檔說得很委婉:
Default Bind to LocalhostStarting with MongoDB 3.6, MongoDB binaries, mongod and mongos, bind to localhost by default. From MongoDB versions 2.6 to 3.4, only the binaries from the official MongoDB RPM (Red Hat, CentOS, Fedora Linux, and derivatives) and DEB (Debian, Ubuntu, and derivatives) packages would bind to localhost by default.
也就是說,從3.6開始,MongoDB默認綁定localhost,這就意味著我們只能在本機訪問MongoDB。至于2.6到3.4,只有從MongoDB RPM與DEB下載的安裝包才默認綁定localhost,換句話說,其他方式下載的安裝包則默認綁定0.0.0.0。因此,如果你使用的MongoDB是3.6之前的版本,就要特別注意這一點了。
在開發(fā)環(huán)境下,MongoDB綁定localhost沒毛病。但是,在生產(chǎn)環(huán)境下,我們通常會有多個節(jié)點,這時需要修改MongoDB綁定的IP,通過配置net.bindIp可以實現(xiàn)。
如果為了省事,直接把net.bindIp配置為0.0.0.0,那就不太妙了。正確的做法應(yīng)該是綁定局域網(wǎng)IP,這樣只有局域網(wǎng)內(nèi)的節(jié)點可以訪問MongoDB。除非黑客端掉了你的服務(wù)器,否則他是沒法訪問你的MongoDB的。
哪些IP是局域網(wǎng)的呢?按照標(biāo)準(zhǔn),有下面這些網(wǎng)段:
- 10.0.0.0 – 10.255.255.255
- 172.16.0.0 – 172.31.255.255
- 192.168.0.0 – 192.168.255.255
最常用的局域網(wǎng)網(wǎng)段就是192.168.0.0到192.168.255.255了。
修改MongoDB的配置文件
vim /etc/mongod.conf將net.bindIp設(shè)為局域網(wǎng)IP地址192.168.59.99:
net:port: 27017bindIp: 192.168.59.99重啟MongoDB
sudo service mongod restart2. 配置防火墻,保護27017端口
MongoDB默認使用的是27017端口,我們應(yīng)該配置本地防火墻把這個端口保護起來,禁止外部IP訪問。
在MongoDB綁定0.0.0.0,且沒有配置防火墻的情況下,使用nmap命令遠程掃描27017端口,結(jié)果如下:
nmap -p 27017 113.207.35.149Starting Nmap 6.49BETA3 ( https://nmap.org ) at 2019-01-19 14:17 CST Nmap scan report for 113.207.35.149 Host is up (0.042s latency). PORT STATE SERVICE 27017/tcp open mongodNmap done: 1 IP address (1 host up) scanned in 14.34 seconds可知,27017端口是"open"的,這就意味著我們可以遠程訪問MongoDB數(shù)據(jù)庫。
配置UFW防火墻
Ubuntu上默認的防火墻軟件是UFW,配置起來非常簡單。默認情況下,ufw并沒有激活:
sudo ufw status Status: inactive執(zhí)行以下命令,即可配置ufw規(guī)則,并啟動防火墻:
sudo ufw default deny incoming // 默認禁止訪問本機所有端口 sudo ufw default allow outgoing // 允許本機訪問外部網(wǎng)絡(luò) sudo ufw allow 22/tcp // 允許SSH登陸 sudo ufw allow from 192.168.59.100 to any port 27017 // 僅允許局域網(wǎng)內(nèi)IP為192.168.59.100的服務(wù)器訪問mongodb sudo ufw enable我所配置的規(guī)則也非常容易理解,根據(jù)命令就能看出來。這時,再查看ufw的狀態(tài),可以發(fā)現(xiàn)防火墻已經(jīng)激活了:
sudo ufw status Status: activeTo Action From -- ------ ---- 22/tcp ALLOW Anywhere 80/tcp ALLOW Anywhere 443/tcp ALLOW Anywhere 27017 ALLOW 192.168.59.100 22/tcp (v6) ALLOW Anywhere (v6)這時,再使用nmap命令遠程掃描27017端口,結(jié)果如下:
nmap -p 27017 113.207.35.149Starting Nmap 6.49BETA3 ( https://nmap.org ) at 2019-01-19 14:40 CST Nmap scan report for 113.207.35.149 Host is up (0.053s latency). PORT STATE SERVICE 27017/tcp filtered mongodNmap done: 1 IP address (1 host up) scanned in 13.68 seconds可知,27017端口的狀態(tài)為"filtered",已經(jīng)被防火墻保護起來了,更加安全。
Linux上常用的防火墻工具還有iptables,這里就不再贅述了。
另外,云服務(wù)器都支持配置防火墻,也有必要配置一下,它們與本機的防火墻是獨立的,可以共同來保證數(shù)據(jù)庫的安全。
3. 配置賬號密碼,對數(shù)據(jù)庫進行訪問控制
默認情況下,MongoDB并沒有配置賬號和密碼,黑客只要登陸你的服務(wù)器之后可以直接查看數(shù)據(jù)庫。給MongoDB配置賬號密碼,可以有效解決這個問題。
連接mongodb
mongo配置賬號密碼
賬號為"myUserAdmin",密碼為"abc123"。
use admin db.createUser({user: "myUserAdmin",pwd: "abc123",roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]} )修改MongoDB的配置文件
vim /etc/mongod.conf將security.authorization設(shè)為"enabled":
security:authorization: enabled重啟MongoDB
sudo service mongod restart連接mongodb
再次連接mongodb時,則需要指定賬號與密碼。
mongo -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"如果不提供賬號密碼,則無法查看數(shù)據(jù)庫,會出現(xiàn)如下這種錯誤:
show dbs 2019-01-20T22:13:53.477+0800 E QUERY [js] Error: listDatabases failed:{"ok" : 0,"errmsg" : "command listDatabases requires authentication","code" : 13,"codeName" : "Unauthorized" }另外,MongoDB還支持配置多個權(quán)限不同的賬號,針對性地對特定數(shù)據(jù)庫的讀寫權(quán)限進行配置。這樣更加細致的訪問控制可以增強安全性,舉個不太恰當(dāng)?shù)睦?#xff0c;對于團隊中的實習(xí)生,應(yīng)該只給他們讀權(quán)限,這樣可以有效防止出現(xiàn)誤操作導(dǎo)致刪庫等極端情況。
總結(jié)
可以發(fā)現(xiàn),本文介紹的方法都非常簡單,屬于常識,但是都是必要的。作為數(shù)據(jù)庫管理者,如果這些都沒有配置,那顯然是非常不專業(yè)的,責(zé)怪MongoDB也沒有用,因為換個數(shù)據(jù)庫也會有同樣的問題。
根據(jù)MongoDB文檔提供的Security Checklist,我們還可以使用TLS/SSL來加密MongoDB連接,這樣做會在一定程度上犧牲性能,大家可以根據(jù)需要來配置。
另外,保證數(shù)據(jù)庫的訪問安全非常重要,同時也需要保證數(shù)據(jù)的安全性,做好必要的數(shù)據(jù)備份。關(guān)于如何保護數(shù)據(jù)的安全性,可以參考我們的博客《Fundebug是這樣備份數(shù)據(jù)的》。
參考
- MongoDB裸奔,2億國人求職簡歷泄漏!
- Fundebug是這樣備份數(shù)據(jù)的
關(guān)于Fundebug
Fundebug專注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java線上應(yīng)用實時BUG監(jiān)控。 自從2016年雙十一正式上線,Fundebug累計處理了9億+錯誤事件,付費客戶有Google、360、金山軟件、百姓網(wǎng)等眾多品牌企業(yè)。歡迎大家免費試用!
版權(quán)聲明
轉(zhuǎn)載時請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2019/01/21/how-to-protect-mongodb/
總結(jié)
以上是生活随笔為你收集整理的如何保证MongoDB的安全性?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql重复数据取日期小的_excel快速
- 下一篇: vb.net textbox如何输入的时