根據安全站點HackenProof的報告,因爲MongoDB數據庫沒有采起任何安全保護措施,致使共計202,730,434份國人求職簡歷泄漏。java
而後不少人評論說MongoDB躺槍了。mongodb
MongoDB確實躺槍了,由於這事的責任固然不在數據庫,而在於使用數據庫的人沒有作必要的安全配置。shell
那麼咱們應該如何保證MongoDB的安全性?下面我將介紹保護MongoDB的3個簡單的方法:數據庫
本教程所使用的系統配置以下:ubuntu
Ubuntu 16.04安裝MongoDBvim
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 start |
話說MongoDB被黑了這麼多年,自身確實有必定的責任。版本3.6以前,MongoDB默認綁定的竟然是0.0.0.0,這就意味着咱們能夠經過互聯網訪問MongoDB,那黑客固然也能夠。這樣的默認配置是一個很大的安全漏洞,不少MongoDB初學者都栽在這一點。關於這個問題,MongoDB的文檔說得很委婉:安全
Default Bind to Localhost服務器
Starting 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以前的版本,就要特別注意這一點了。架構
在開發環境下,MongoDB綁定localhost沒毛病。可是,在生產環境下,咱們一般會有多個節點,這時須要修改MongoDB綁定的IP,經過配置net.bindIp能夠實現。
若是爲了省事,直接把net.bindIp配置爲0.0.0.0,那就不太妙了。正確的作法應該是綁定局域網IP,這樣只有局域網內的節點能夠訪問MongoDB。除非黑客端掉了你的服務器,不然他是無法訪問你的MongoDB的。
哪些IP是局域網的呢?按照標準,有下面這些網段:
最經常使用的局域網網段就是192.168.0.0到192.168.255.255了。
修改MongoDB的配置文件
vim /etc/mongod.conf |
將net.bindIp設爲局域網IP地址192.168.59.99:
net: port: 27017 bindIp: 192.168.59.99 |
重啓MongoDB
sudo service mongod restart |
MongoDB默認使用的是27017端口,咱們應該配置本地防火牆把這個端口保護起來,禁止外部IP訪問。
在MongoDB綁定0.0.0.0,且沒有配置防火牆的狀況下,使用nmap命令遠程掃描27017端口,結果以下:
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」的,這就意味着咱們能夠遠程訪問MongoDB數據庫。
Ubuntu上默認的防火牆軟件是UFW,配置起來很是簡單。默認狀況下,ufw並無激活:
sudo ufw status Status: inactive |
執行如下命令,便可配置ufw規則,並啓動防火牆:
sudo ufw default deny incoming // 默認禁止訪問本機全部端口 sudo ufw default allow outgoing // 容許本機訪問外部網絡 sudo ufw allow 22/tcp // 容許SSH登錄 sudo ufw allow from 192.168.59.100 to any port 27017 // 僅容許局域網內IP爲192.168.59.100的服務器訪問mongodb sudo ufw enable |
我所配置的規則也很是容易理解,根據命令就能看出來。這時,再查看ufw的狀態,能夠發現防火牆已經激活了:
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) |
這時,再使用nmap命令遠程掃描27017端口,結果以下:
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端口的狀態爲」filtered」,已經被防火牆保護起來了,更加安全。
Linux上經常使用的防火牆工具還有iptables,這裏就再也不贅述了。
另外,雲服務器都支持配置防火牆,也有必要配置一下,它們與本機的防火牆是獨立的,能夠共同來保證數據庫的安全。
默認狀況下,MongoDB並無配置帳號和密碼,黑客只要登錄你的服務器以後能夠直接查看數據庫。給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設爲」enabled」:
security: authorization: enabled |
重啓MongoDB
sudo service mongod restart |
鏈接mongodb
再次鏈接mongodb時,則須要指定帳號與密碼。
mongo -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin" |
若是不提供帳號密碼,則沒法查看數據庫,會出現以下這種錯誤:
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還支持配置多個權限不一樣的帳號,針對性地對特定數據庫的讀寫權限進行配置。這樣更加細緻的訪問控制能夠加強安全性,舉個不太恰當的例子,對於團隊中的實習生,應該只給他們讀權限,這樣能夠有效防止出現誤操做致使刪庫等極端狀況。
能夠發現,本文介紹的方法都很是簡單,屬於常識,可是都是必要的。做爲數據庫管理者,若是這些都沒有配置,那顯然是很是不專業的,責怪MongoDB也沒有用,由於換個數據庫也會有一樣的問題。
根據MongoDB文檔提供的Security Checklist,咱們還可使用TLS/SSL來加密MongoDB鏈接,這樣作會在必定程度上犧牲性能,你們能夠根據須要來配置。
歡迎學Java和大數據的朋友們加入java架構交流: 855835163 羣內提供免費的架構資料還有:Java工程化、高性能及分佈式、高性能、深刻淺出。高架構。性能調優、Spring,MyBatis,Netty源碼分析和大數據等多個知識點高級進階乾貨的免費直播講解 能夠進來一塊兒學習交流哦