作者介绍
上海小胖[Miracle Young],中国第十五位MONGODB PROFESSIONAL获得者,资深Python开发、DBA。DevOps的践行者,曾独立开发Web服务平台,电商爬虫系统、运维管理系统,涵盖数据热力图、核心数据监控、服务器监控系统等。个人博客:https://segmentfault.com/u/shanghaixiaopang。
原本这周想写一个系列关于 GDPR(General Data Protection Regulation) MongoDB 的,但是9月5日爆出了超2.6W 个MongoDB 节点被劫持。所以临阵变卦,决定写一篇关于MongoDB安全的文章。
是什么心理让各位Developer & DBAer 在发生了如此大的比特币勒索事件后,还是敢于裸奔?纵使觉得数据不重要、有备份,出于对安全的意识,是不是也应该使用一些安全保护措施呢?
(注:裸奔在此处的解释为,使用默认端口27017,并对公网开放,未做任何防火墙措施,同时未开启认证和鉴权的MongoDB 数据库)
一、现状



- 通过类似SHODAN 这样的网站(诸如:ZoomEye等)提供的API,进行全网扫描,MongoDB 那就是扫描27017端口
- 获取到IP后,进行嗅探
- 如果可以获取到登录信息,那么运行脚本(备份全库、清理journal、留下打款账号信息)
- 具体的实现,这里不做过多描述,目的不是为了教学攻破MongoDB,而是为了给大家敲响警钟。
二、防范
use admin
db.createUser(
{
user: “myUserAdmin”,
pwd: “abc123”,
roles: [ { role: “userAdminAnyDatabase”, db: “admin” } ]
}
)
2.在启动项中加入–auth,或者在配置文件中加入 security.authorization: enabled.
mongod –auth –port 27017 –dbpath /data/db1
3.使用之前创建的myUserAdmin 用户登录mongo
mongo –port 27017 -u “myUserAdmin” -p “abc123” –authenticationDatabase “admin”
4.在应用库中创建一个具有读写权限的应用账号。(注意:在MongoDB中,账号跟着数据库走,也就是说在哪个数据库下创建的,该账号就属于哪个库)
use test
db.createUser(
{
user: “myTester”,
pwd: “xyz123”,
roles: [ { role: “readWrite”, db: “test” },
{ role: “read”, db: “reporting” } ]
}
)
Configure Role-Based Access Control
这里需要明确的是,MongoDB的基本安全分为两种:一种是认证,一种是鉴权。其实英语会说的比较明白点: authorization, authentication。
认证是作为用户登录的一种账号密码校验,类似MySQL 的 root/password ,在大部分应用中,一旦创建一个连接(用于连接池的),那么该连接只会做一次,所以大可不必担心因为认证而带来的开销。
鉴权是在数据库中的账号拥有的权限做鉴定,类似MySQL中的privilege。
Encrypt Communication
打开MongoDB 的TLS/SSl 的配置,社区版需要下载一个SSL版本,或者可以从社区版通过升级步骤升级到SSl版本,企业版自带SSL。
SSL 可以保证MongoDB的 所有连接(输入和输出的连接)都是加密的。
Encrypt and Protect Data
MongoDB 3.2 WT 引擎推出了一个新的加密功能,仅限企业版,可以对物理数据文件进行加密,若不打开,则默认通过系统对文件进行加密。
Limit Network Exposure
通过指定bindIp ,并在生产线上关闭MongoDB 的Http接口来达到规避网络进口的安全问题。
Audit System Activity
MongoDB 企业版同时提供了审计功能,帮助用户更好的巡检自己的数据库。
Run MongoDB with a Dedicated User
使用MongoDB用户 启动MongoDB,而不是使用root 用户。
三、后续
希望大家在经过2次 MongoDB 的打劫后,都提高警惕了。把自己的生产节点都check 一遍。避免同样的悲剧在发生。
原文来自微信公众号:DBAplus社群
本文链接:http://www.yunweipai.com/22614.html