如何保證MongoDB的安全性?

上周寫了個簡短的新聞《MongoDB裸奔,2億國人求職簡歷泄漏!》:

根據安全站點HackenProof的報告,由于MongoDB數據庫沒有采取任何安全保護措施,導致共計202,730,434份國人求職簡歷泄漏。

然后很多人評論說MongoDB躺槍了。

MongoDB確實躺槍了,因為這事的責任當然不在數據庫,而在于使用數據庫的人沒有做必要的安全配置。

那么我們應該如何保證MongoDB的安全性?下面我將介紹保護MongoDB的3個簡單的方法:

  • 綁定局域網IP,杜絕互聯網訪問
  • 配置防火墻,保護27017端口
  • 配置賬號密碼,對數據庫進行訪問控制

本教程所使用的系統配置如下:

  • 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 start

1. 綁定局域網IP,杜絕互聯網訪問

話說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是局域網的呢?按照標準,有下面這些網段:

  • 10.0.0.0 – 10.255.255.255
  • 172.16.0.0 – 172.31.255.255
  • 192.168.0.0 – 192.168.255.255

最常用的局域網網段就是192.168.0.0到192.168.255.255了。

修改MongoDB的配置文件

vim /etc/mongod.conf

將net.bindIp設為局域網IP地址192.168.59.99

net:port: 27017bindIp: 192.168.59.99

重啟MongoDB

sudo service mongod restart

2. 配置防火墻,保護27017端口

MongoDB默認使用的是27017端口,我們應該配置本地防火墻把這個端口保護起來,禁止外部IP訪問。

在MongoDB綁定0.0.0.0,且沒有配置防火墻的情況下,使用nmap命令遠程掃描27017端口,結果如下:

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數據庫。

配置UFW防火墻

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: 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端口,結果如下:

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端口的狀態為"filtered",已經被防火墻保護起來了,更加安全。

Linux上常用的防火墻工具還有iptables,這里就不再贅述了。

另外,云服務器都支持配置防火墻,也有必要配置一下,它們與本機的防火墻是獨立的,可以共同來保證數據庫的安全。

3. 配置賬號密碼,對數據庫進行訪問控制

默認情況下,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連接,這樣做會在一定程度上犧牲性能,大家可以根據需要來配置。

另外,保證數據庫的訪問安全非常重要,同時也需要保證數據的安全性,做好必要的數據備份。關于如何保護數據的安全性,可以參考我們的博客《Fundebug是這樣備份數據的》。

參考

  • MongoDB裸奔,2億國人求職簡歷泄漏!
  • Fundebug是這樣備份數據的

關于Fundebug

Fundebug專注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java線上應用實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了9億+錯誤事件,付費客戶有Google、360、金山軟件、百姓網等眾多品牌企業。歡迎大家免費試用!

版權聲明

轉載時請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2019/01/21/how-to-protect-mongodb/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449606.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449606.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449606.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LXC是什么

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。Linux Container容器是一種內核虛擬化技術,可以提供輕量級的虛擬化,以便隔離進程和資源。LXC為Linux Container的簡…

C++ 標準庫 vector list map使用方法

[cpp] view plaincopyList(鏈表) List將元素按順序儲存在鏈表中. 與 向量(vectors)相比, 它允許快速的插入和刪除,但是隨機訪問卻比較慢.list對象函數 assign() 給list賦值 back() 返回最后一個元素 begin() 返回指向第一個元素的迭代器…

導航守衛

導航守衛 to 準備跳轉到哪個頁面 from 從哪個頁面中離開 next 函數 全局守衛 router.beforeEach((to,from,next) > {if(to.path /login || to.path /register){    next();}else{    alert(先登錄)    next(/login)} }) 組件守衛 data () {  return{   …

Django中使用Pagination的分頁范例源碼

將做工程過程重要的內容做個珍藏,下面代碼內容是關于Django中使用Pagination的分頁范例的代碼。 from django.core.paginator import Paginatorobjects [john, paul, george, ringo]p Paginator(objects, 2) p.count4p.num_pages2p.page_range[1, 2] page1 p.pag…

Docker:集裝箱式“運輸”在軟件上的實現

Docker是由PaaS提供商dotCloud在2013年年初創建的一款開源應用引擎,Docker可以自動將任何應用打包成輕量、可移植、自包涵的容器引擎。開發者構建的應用可以一次構建全平臺運行,包括本地開發機器,生產環境,虛擬機和云等。 Docker基…

CAMP選股

挑選五只股票:萬科A、中國平安、貴州茅臺、萬華化學和科大訊飛,然后我們以滬深300作為市場基準。import pandas as pd import tushare as ts # 獲取數據 pro ts.pro_api() wanke pro.daily(ts_code000002.SZ, start_date20170101) pingan pro.daily(t…

大二下周總結(三)

記錄時間第三周所花時間(包括上課)13h代碼行500博客量2所了解到的知識點html java-script java本周用在練習代碼的時間自己感覺還可以,由于在第二周課堂練習后覺得自己有許多不足,所以有了必須奮進的壓力。 除了編寫代碼能力的提高…

C讀寫ini文件

/* read/write ini file with c function file testini.c chinayaosir blog: http://blog.csdn.net/chinayaosir connect.ini [database] 此程序有些BUG 當ini文件不存在時,第一次建立connect.ini文件時, 在[database]前面會多一個空格. */ #include…

包含天,時,分,秒的倒計時

這個很基礎的東西寫的過程中出了很多小的錯誤&#xff0c;在此記錄一下。 原生的js。 結構&#xff1a; <p id"time"></p> js: <script>  var start new Date().getTime(); // 獲取開始時間  var end new Dat…

計算相關度

# 使用numpy import numpy as np R [0.01, 0.05, 0.02, -0.03] var1 np.var(R) std1 np.std(R) # # 使用pandas import pandas as pd R pd.Series([0.01, 0.05, 0.02, -0.03]) var2 R.var() std2 R.std() import pandas as pd import tushare as ts pro ts.pro_api() w…

如何使用Dockerfile構建鏡像

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Dockfile是一種被Docker程序解釋的腳本&#xff0c;Dockerfile由一條一條的指令組成&#xff0c;每條指令對應Linux下面的一條命令。Doc…

今時今日,C還適合當下之所需么?

本文來源于我在InfoQ中文站翻譯的文章&#xff0c;原文地址是&#xff1a;http://www.infoq.com/cn/news/2013/01/C-Language 來自Couchbase的Damien Katz認為C依然是非常適合于后端編程的一門語言&#xff0c;然而有的開發者則覺得C有太多的瑕疵&#xff0c;他們支持C或是Java…

《吳軍.科技史綱60講》摘錄

本文由Markdown語法編輯器編輯完成&#xff0e; 《科技史綱60講》是吳軍老師最新開設的專欄名稱&#xff0c;該專欄主要是講解人類文明和科技發展史。吳軍老師在專欄的發刊詞《歷史總在重演&#xff0c;科技永遠向前》中提到&#xff0c;能量和信息是貫穿人類文明發展的兩條線索…

API Gateway——KONG簡單入門

一、簡介 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Kong&#xff0c;是由Mashape公司開源的&#xff0c;基于Nginx的API gateway。 二、特點 可擴展&#xff1a;支持分布式 模塊化…

小程序 公眾號/h5相互跳轉-webview

小程序與h5的跳轉 前提小程序管理后臺配置域名白名單&#xff0c;并且h5頁面是嵌在小程序里面&#xff08;相互跳的前提條件&#xff09; 在業務域名中設置好訪問的h5地址 微信官方web-view 介紹地址 https://developers.weixin.qq.com/miniprogram/dev/component/web-view.ht…

十、eclipse快捷鍵大全

eclipse快捷鍵大全轉載于:https://www.cnblogs.com/zheaven/p/10541531.html

如何保證代碼的高質量?

代碼的高質量是軟件的靈魂&#xff0c;代碼 數據結構 算法&#xff0c; 而高質量的代碼 優良的變量、函數命名 優良的代碼結構、代碼層次結構 數據結構 算法。 時時刻刻想這上面的四點&#xff0c;你的代碼就會漸漸的上新臺階&#xff0c;老板不給你加工資還…

centos6.5 安裝 kong 網關

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 最近要求了解下kong網關&#xff0c;然后在網上一頓找&#xff0c;說實話&#xff0c;度娘的力量還是不行啊&#xff0c;找出來的那些跟…

lucene學習的小結

pom.xml設置 <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.apache.lucene</groupId&…

并行計算的專訪

摘要&#xff1a;社區之星第9期采訪的嘉賓是香港浸會大學計算機在讀博士、浪潮高性能計算顧問趙開勇。此次他為我們揭開了高性能計算的神秘面紗&#xff0c;為讀者講解自己的經驗心得。并且他認為基于移動設備的高性能計算將會成為未來潮流&#xff0c;低功耗、高性能也將成為一…