摘要:另外,保證數(shù)據(jù)庫(kù)的訪問(wèn)安全非常重要,同時(shí)也需要保證數(shù)據(jù)的安全性,做好必要的數(shù)據(jù)備份。關(guān)于如何保護(hù)數(shù)據(jù)的安全性,可以參考我們的博客是這樣備份數(shù)據(jù)的。
上周寫了個(gè)簡(jiǎn)短的新聞《MongoDB裸奔,2億國(guó)人求職簡(jiǎn)歷泄漏!》:
根據(jù)安全站點(diǎn)HackenProof的報(bào)告,由于MongoDB數(shù)據(jù)庫(kù)沒(méi)有采取任何安全保護(hù)措施,導(dǎo)致共計(jì)202,730,434份國(guó)人求職簡(jiǎn)歷泄漏。
然后很多人評(píng)論說(shuō)MongoDB躺槍了。
MongoDB確實(shí)躺槍了,因?yàn)?strong>這事的責(zé)任當(dāng)然不在數(shù)據(jù)庫(kù),而在于使用數(shù)據(jù)庫(kù)的人沒(méi)有做必要的安全配置。
那么我們應(yīng)該如何保證MongoDB的安全性?下面我將介紹保護(hù)MongoDB的3個(gè)簡(jiǎn)單的方法:
綁定局域網(wǎng)IP,杜絕互聯(lián)網(wǎng)訪問(wèn)
配置防火墻,保護(hù)27017端口
配置賬號(hào)密碼,對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn)控制
本教程所使用的系統(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)訪問(wèn)
話說(shuō)MongoDB被黑了這么多年,自身確實(shí)有一定的責(zé)任。版本3.6之前,MongoDB默認(rèn)綁定的居然是0.0.0.0,這就意味著我們可以通過(guò)互聯(lián)網(wǎng)訪問(wèn)MongoDB,那黑客當(dāng)然也可以。這樣的默認(rèn)配置是一個(gè)很大的安全漏洞,很多MongoDB初學(xué)者都栽在這一點(diǎn)。關(guān)于這個(gè)問(wèn)題,MongoDB的文檔說(shuō)得很委婉:
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.
也就是說(shuō),從3.6開始,MongoDB默認(rèn)綁定localhost,這就意味著我們只能在本機(jī)訪問(wèn)MongoDB。至于2.6到3.4,只有從MongoDB RPM與DEB下載的安裝包才默認(rèn)綁定localhost,換句話說(shuō),其他方式下載的安裝包則默認(rèn)綁定0.0.0.0。因此,如果你使用的MongoDB是3.6之前的版本,就要特別注意這一點(diǎn)了。
在開發(fā)環(huán)境下,MongoDB綁定localhost沒(méi)毛病。但是,在生產(chǎn)環(huán)境下,我們通常會(huì)有多個(gè)節(jié)點(diǎn),這時(shí)需要修改MongoDB綁定的IP,通過(guò)配置net.bindIp可以實(shí)現(xiàn)。
如果為了省事,直接把net.bindIp配置為0.0.0.0,那就不太妙了。正確的做法應(yīng)該是綁定局域網(wǎng)IP,這樣只有局域網(wǎng)內(nèi)的節(jié)點(diǎn)可以訪問(wèn)MongoDB。除非黑客端掉了你的服務(wù)器,否則他是沒(méi)法訪問(wèn)你的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: 27017 bindIp: 192.168.59.99
重啟MongoDB
sudo service mongod restart2. 配置防火墻,保護(hù)27017端口
MongoDB默認(rèn)使用的是27017端口,我們應(yīng)該配置本地防火墻把這個(gè)端口保護(hù)起來(lái),禁止外部IP訪問(wèn)。
在MongoDB綁定0.0.0.0,且沒(méi)有配置防火墻的情況下,使用nmap命令遠(yuǎn)程掃描27017端口,結(jié)果如下:
nmap -p 27017 113.207.35.149 Starting 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 mongod Nmap done: 1 IP address (1 host up) scanned in 14.34 seconds
可知,27017端口是"open"的,這就意味著我們可以遠(yuǎn)程訪問(wèn)MongoDB數(shù)據(jù)庫(kù)。
配置UFW防火墻Ubuntu上默認(rèn)的防火墻軟件是UFW,配置起來(lái)非常簡(jiǎn)單。默認(rèn)情況下,ufw并沒(méi)有激活:
sudo ufw status Status: inactive
執(zhí)行以下命令,即可配置ufw規(guī)則,并啟動(dòng)防火墻:
sudo ufw default deny incoming // 默認(rèn)禁止訪問(wèn)本機(jī)所有端口 sudo ufw default allow outgoing // 允許本機(jī)訪問(wèn)外部網(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ù)器訪問(wèn)mongodb sudo ufw enable
我所配置的規(guī)則也非常容易理解,根據(jù)命令就能看出來(lái)。這時(shí),再查看ufw的狀態(tài),可以發(fā)現(xiàn)防火墻已經(jīng)激活了:
sudo ufw status Status: active To 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)
這時(shí),再使用nmap命令遠(yuǎn)程掃描27017端口,結(jié)果如下:
nmap -p 27017 113.207.35.149 Starting 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 mongod Nmap done: 1 IP address (1 host up) scanned in 13.68 seconds
可知,27017端口的狀態(tài)為"filtered",已經(jīng)被防火墻保護(hù)起來(lái)了,更加安全。
Linux上常用的防火墻工具還有iptables,這里就不再贅述了。
另外,云服務(wù)器都支持配置防火墻,也有必要配置一下,它們與本機(jī)的防火墻是獨(dú)立的,可以共同來(lái)保證數(shù)據(jù)庫(kù)的安全。
3. 配置賬號(hào)密碼,對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn)控制默認(rèn)情況下,MongoDB并沒(méi)有配置賬號(hào)和密碼,黑客只要登陸你的服務(wù)器之后可以直接查看數(shù)據(jù)庫(kù)。給MongoDB配置賬號(hào)密碼,可以有效解決這個(gè)問(wèn)題。
連接mongodb
mongo
配置賬號(hào)密碼
賬號(hào)為"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時(shí),則需要指定賬號(hào)與密碼。
mongo -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
如果不提供賬號(hào)密碼,則無(wú)法查看數(shù)據(jù)庫(kù),會(huì)出現(xiàn)如下這種錯(cuò)誤:
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還支持配置多個(gè)權(quán)限不同的賬號(hào),針對(duì)性地對(duì)特定數(shù)據(jù)庫(kù)的讀寫權(quán)限進(jìn)行配置。這樣更加細(xì)致的訪問(wèn)控制可以增強(qiáng)安全性,舉個(gè)不太恰當(dāng)?shù)睦樱瑢?duì)于團(tuán)隊(duì)中的實(shí)習(xí)生,應(yīng)該只給他們讀權(quán)限,這樣可以有效防止出現(xiàn)誤操作導(dǎo)致刪庫(kù)等極端情況。
總結(jié)可以發(fā)現(xiàn),本文介紹的方法都非常簡(jiǎn)單,屬于常識(shí),但是都是必要的。作為數(shù)據(jù)庫(kù)管理者,如果這些都沒(méi)有配置,那顯然是非常不專業(yè)的,責(zé)怪MongoDB也沒(méi)有用,因?yàn)閾Q個(gè)數(shù)據(jù)庫(kù)也會(huì)有同樣的問(wèn)題。
根據(jù)MongoDB文檔提供的Security Checklist,我們還可以使用TLS/SSL來(lái)加密MongoDB連接,這樣做會(huì)在一定程度上犧牲性能,大家可以根據(jù)需要來(lái)配置。
另外,保證數(shù)據(jù)庫(kù)的訪問(wèn)安全非常重要,同時(shí)也需要保證數(shù)據(jù)的安全性,做好必要的數(shù)據(jù)備份。關(guān)于如何保護(hù)數(shù)據(jù)的安全性,可以參考我們的博客《Fundebug是這樣備份數(shù)據(jù)的》。
參考MongoDB裸奔,2億國(guó)人求職簡(jiǎn)歷泄漏!
Fundebug是這樣備份數(shù)據(jù)的
關(guān)于FundebugFundebug專注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java線上應(yīng)用實(shí)時(shí)BUG監(jiān)控。 自從2016年雙十一正式上線,F(xiàn)undebug累計(jì)處理了9億+錯(cuò)誤事件,付費(fèi)客戶有Google、360、金山軟件、百姓網(wǎng)等眾多品牌企業(yè)。歡迎大家免費(fèi)試用!
版權(quán)聲明轉(zhuǎn)載時(shí)請(qǐng)注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2019/01/21/how-to-protect-mongodb/
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/19459.html
摘要:關(guān)于數(shù)據(jù)安全在早期的版本引發(fā)了很多爭(zhēng)論。端能確保收到了寫入數(shù)據(jù),但依然有短暫的日志落盤時(shí)差導(dǎo)致潛在的數(shù)據(jù)丟失可能。而每個(gè)分片上的數(shù)據(jù)又以的形式組織類似于的概念,以便于集群內(nèi)部的數(shù)據(jù)遷移和再平衡。 showImg(https://segmentfault.com/img/remote/1460000009222606?w=1024&h=683); 在系統(tǒng)引入 MongoDB 也有幾年了,...
摘要:在前面一篇文章中,我介紹了如何在單臺(tái)上設(shè)置鑒權(quán),以防范對(duì)數(shù)據(jù)未經(jīng)授權(quán)的訪問(wèn)。本文介紹在配置了主從和分片的情況下,如何為數(shù)據(jù)庫(kù)添加鑒權(quán)。創(chuàng)建用戶并賦予合適的角色這點(diǎn)參考前面的單臺(tái)如何設(shè)置鑒權(quán)即可,使用客戶端連上數(shù)據(jù)庫(kù),創(chuàng)建用戶,過(guò)程完全一樣。 在前面一篇文章中,我介紹了如何在單臺(tái) MongoDB 上設(shè)置鑒權(quán),以防范對(duì)數(shù)據(jù)未經(jīng)授權(quán)的訪問(wèn)。本文介紹在配置了主從(Replica Set)和分片...
摘要:缺省是沒(méi)有設(shè)置鑒權(quán)的,業(yè)界大部分使用的項(xiàng)目也沒(méi)有設(shè)置訪問(wèn)權(quán)限。本文介紹如何在單臺(tái)服務(wù)器上設(shè)置鑒權(quán)。類似的,為規(guī)劃用戶鑒權(quán)時(shí),至少要規(guī)劃兩種角色用戶管理員和數(shù)據(jù)庫(kù)用戶。缺省方式下是不進(jìn)行鑒權(quán)檢查的。 MongoDB 缺省是沒(méi)有設(shè)置鑒權(quán)的,業(yè)界大部分使用 MongoDB 的項(xiàng)目也沒(méi)有設(shè)置訪問(wèn)權(quán)限。這就意味著只要知道 MongoDB 服務(wù)器的端口,任何能訪問(wèn)到這臺(tái)服務(wù)器的人都可以查詢和操作 ...
摘要:可以發(fā)現(xiàn),整個(gè)同步過(guò)程是依賴于來(lái)進(jìn)行的。不考慮導(dǎo)致的問(wèn)題,正常的應(yīng)用升級(jí)也會(huì)導(dǎo)致應(yīng)用中斷運(yùn)行。注意事項(xiàng)為了避免被回滾的更新被發(fā)布出去,選擇只在一個(gè)變更到達(dá)大多數(shù)節(jié)點(diǎn)不可能被回滾時(shí),才會(huì)將這些變更發(fā)布到應(yīng)用。 Change Stream是MongoDB從3.6開始支持的新特性。這個(gè)新特性有哪些奇妙之處,會(huì)給我們帶來(lái)什么便利?本次的文章將就這個(gè)主題進(jìn)行初步討論。 Change Stream...
閱讀 1063·2021-11-12 10:34
閱讀 991·2021-09-30 09:56
閱讀 671·2019-08-30 15:54
閱讀 2606·2019-08-30 11:14
閱讀 1470·2019-08-29 16:44
閱讀 3210·2019-08-29 16:35
閱讀 2496·2019-08-29 16:22
閱讀 2445·2019-08-29 15:39