上周写了个简短的新闻《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: 27017
bindIp: 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.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数据库。

配置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: 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,这里就不再赘述了。

另外,云服务器都支持配置防火墙,也有必要配置一下,它们与本机的防火墙是独立的,可以共同来保证数据库的安全。

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是这样备份数据的》。

参考

关于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/

如何保证MongoDB的安全性?的更多相关文章

  1. HTTPS 怎样保证数据传输的安全性

    大家都知道,在客户端与服务器数据传输的过程中,HTTP协议的传输是不安全的,也就是一般情况下HTTP是明文传输的.但HTTPS协议的数据传输是安全的,也就是说HTTPS数据的传输是经过加密的. 在客户 ...

  2. 一文看懂https如何保证数据传输的安全性的【转载、收藏】

    一文看懂https如何保证数据传输的安全性的   一文看懂https如何保证数据传输的安全性的 大家都知道,在客户端与服务器数据传输的过程中,http协议的传输是不安全的,也就是一般情况下http是明 ...

  3. PHP做APP接口时,如何保证接口的安全性??????????

    PHP做APP接口时,如何保证接口的安全性? 1.当用户登录APP时,使用https协议调用后台相关接口,服务器端根据用户名和密码时生成一个access_key,并将access_key保存在sess ...

  4. 【转】HTTPS 如何保证数据传输的安全性?

    大家都知道,在客户端与服务器数据传输的过程中,HTTP协议的传输是不安全的,也就是一般情况下HTTP是明文传输的.但HTTPS协议的数据传输是安全的,也就是说HTTPS数据的传输是经过加密的. 在客户 ...

  5. 《即时消息技术剖析与实战》学习笔记6——IM系统如何保证消息的安全性

    在消息产生.流转的各个环节中,需要保证消息传输安全性.消息存储安全性.消息内容安全性. 一.消息传输安全性 消息传输的重要防范点有两个,一是访问入口安全,二是传输链路安全. 1.HttpDNS保证访问 ...

  6. MongoDB的安全性

    上篇文章介绍Mongo启动了,一般数据库启动,下面的操作就是登录数据库了,之前测试数据库是否正常安装的时候也登录过数据库,现在回想一下,好像连用户名和密码都没有输入,找几篇帖子来探究下Mongodb的 ...

  7. HTTPS如何保证数据传输的安全性 -- 结合加密

    什么是HTTPS: HTTP就是我们平时浏览网页时候使用的一种协议 HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全.为了保证这些隐私数据能加密传输,于是网 ...

  8. HTTPS 如何保证数据传输的安全性

    为什么需要 HTTPS? 我们知道 HTTP 是一个纯文本传输协议,对传输过程中的数据包不进行加密,是明文传输,那这样的话对于介于在发送端和接收端之间的任何 一个节点都能知道传输的内容,这些节点可能是 ...

  9. MongoDB 基础 -安全性-(权限操作)

    和其他所有数据库一样,权限的管理都差不多一样.mongodb存储所有的用户信息在admin 数据库的集合system.users中,保存用户名.密码和数据库信息.mongodb默认不启用授权认证,只要 ...

随机推荐

  1. 学用HBuilder开发App的看过来

    自己的呕心沥血之作吧,花了一年时间,系统介绍HTML5 App开发的相关技术. 越来越多的公司采用HTML5来快速开发移动跨平台App,它支持当前市场流行的移动设备. 本书主要介绍了HTML5在移动A ...

  2. hadoop基础操作

    通过hadoop上的hive完成WordCount 启动hadoop Hdfs上创建文件夹 上传文件至hdfs 启动Hive 创建原始文档表 导入文件内容到表docs并查看 用HQL进行词频统计,结果 ...

  3. HttpClient 调用WebAPI时,传参的三种方式

    public void Post() { //方法一,传json参数 var d = new { username = " ", password = " ", ...

  4. 史上最全java面试题

    基本概念 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 Java 的反射机制 什么是 ACID BS与CS的联系与区别 Cookie ...

  5. vue+mescroll=VScrollFull

    VScrollFull 介绍 这个组件是什么? 是为了方便的使用下拉刷新,上拉加载而去封装的一个依赖于 mescroll.js 的 vue 组件(未发布,文末代码~) 封装这个组件使用了什么? mes ...

  6. 源码级调试的XNU内核

    i春秋翻译小组-FWorldCodeZ 源码级调试的XNU内核 无论你是在开发内核扩展,进行漏洞研究,还是还有其他需要进入macOS / iOS内核,XNU,有时你需要附加调试器.当你这样做时,使用源 ...

  7. #Java学习之路——基础阶段(第六篇)

    我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...

  8. Kali学习笔记44:SQLMAP

    SQLMAP漏洞检测技术: 1.基于布尔的盲注检测:' and 1=1   'and 1=2等 2.基于时间的盲注检测:' and (select * from (select(sleep(20))) ...

  9. [Swift]LeetCode263. 丑数 | Ugly Number

    Write a program to check whether a given number is an ugly number. Ugly numbers are positive numbers ...

  10. PHP文件域上传

    PHP中使用文件域上传文件,需要几个步骤,首先先判断有无文件域,然后判断是否选择了文件,最后判断文件是否上传成功. 需要注意的是 表单中有文件域,必须将method设置为post, enctype设置 ...