记一次MongoDB裸奔
导言
大意失荆州,裸奔的 MongoDB 被黑了。虽然并不是什么非常重要的数据,但也给自己敲响的一个警钟。虽然我们平时不容易接触到数据安全,但我们在开发,部署项目的时候,一定要养成良好的安全意识。
根据木桶原理,整个系统的安全性,取决于整个系统最薄弱的环节。所以,我们要尽可能多的考虑更多组成部分的安全性。
事件发现
本月初,发生了大家所熟知的 MondoDB赎金事件。当时本人也保持了一定的关注,并去 https://www.shodan.io/ 溜达了一圈,顺便连了几个裸奔的MongoDB(当然,绝未做任何更改)。
直到昨天下午,发现我应用的管理员账户登录不上了。多次检查密码,发现还是无法解决,此时有点怀疑被黑了。由于应用有新建用户功能,新建一个和管理员账户同名的账户,居然成功了。这个时候,我想多半是遭了,只等晚上回去确认了。
回到家,远程到服务器,一连接,果然遭了(可怜我那几十个代码片段 + 几个Gist),需要赎金0.1BTC。
原因分析
此时可能就要问了,都知道了裸奔不安全,为嘛还不修复?
我能说我懒么?心大么?
因为当时我部署的版本的3.2,据说3.2默认没有开启外网访问。我心大到直接未经尝试就认为这是对的。
实际这句话也没错,Linux版本的 3.x 确实是默认绑定到 127.0.0.1 上的。可TM我是运行在 Windows 上的,由于安装的时候,默认没有创建配置文件,导致一运行就绑定到所有host上了。
当上,以上都是外因!根本原因还是自己疏忽大意,安全意识薄弱。
解决(重头再来)
没有备份,直接无法恢复。
另外,0.1个BTC我是拿不出来的(我也不相信他会好心给你恢复),再加上数据也不是太重要,就直接把安全设置配置上,重头开始。
那现在是如何配置安全性的呢?
以下操作,均在未开启授权访问时执行
首先是添加用户并设置角色:
# 切换到admin库
use admin
# 创建User
db.createUser({user: '<name>', pwd: '<password>', roles: [
{role: 'readWrite', db: '<dbname>'},
{role: 'dbAdmin', db: '<dbname>'}
]})
接下来就是创建一个配置文件(2.6之后,配置文件是yaml格式),内容如下:
systemLog:
destination: file
path: c:\data\log\mongod.log
storage:
dbPath: c:\data\db
net:
bindIp: 127.0.0.1
port: 27017
注意:配置文件中一定要设定 log path 和 db path
注意2:如果要限制外网访问,就可以配置 net -> bindIp,另外也可以调整端口
此时如何运行呢?
mongod --config "D:\MongoDB\mongod.conf" --auth
带上 --auth 就是开启授权访问。
最后客户端访问也需要稍微修改下,只需要修改 mongoAddress 配置即可:
# MongoDB Connection String Format
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
# 实例地址
const mongoAddress = 'mongodb://admin:Pwd0603@127.0.0.1:27017/dojo'
就这么一点简单的步骤,就能实现 MongoDB 较高的安全性,可这却是非常容易忽略的点。希望大家引以为戒。
总结
- 一定不能疏忽大意,安全意识要加强。
- 一定要结果实际验证,才能下结论。不能不清楚外置条件,人云亦云。
- 不要有我的应用小,就不会被黑这种想法。批量攻击,才不会放过你。
- 定期做好数据备份,被攻击是一回事,能否恢复又是另外一回事了。
记一次MongoDB裸奔的更多相关文章
- 裸奔的智能插座:博联Broadlink SP2/SP mini的分析、破解
https://www.jianshu.com/p/028b10bc3dd1 智能设备的联动通常采用IFTTT的方式,但这种方式受限于官方软件提供的功能.想要自主地灵活控制,需要有官方SDK,或知道协 ...
- S3C6410裸奔之旅——RVDS2.2编译、仿真、调试过程 LED流水灯---转的
S3C6410裸奔之旅——RVDS2.2编译.仿真.调试过程 LED流水灯 (2012-10-13 23:56:30) 转载▼ 标签: s3c6410裸奔 ok6410 rvds2.2 rvds2.2 ...
- (转)裸奔的后果!一次ssh被篡改的入侵事件
裸奔的后果!一次ssh被篡改的入侵事件 原文:http://blog.51cto.com/phenixikki/1546669 通常服务器安全问题在规模较小的公司常常被忽略,没有负责安全的专员,尤其是 ...
- 裸奔着造房子——对政府禁止采购Win8系统的一些看法
前段时间有消息称政府招标的项目将禁止使用Win8系统,原因是Win8系统的安全架构将有利于暴露敏感信息给微软,而微软的老子是美利坚,老子想要知道什么,儿子当然不敢不从.因此Win8也被打入冷宫,微软多 ...
- 裸奔的支付X聊天,你还敢用吗?
- 语音消息 使用HTTP明文传输,没有任何加密措施,使用域名为up-mayi.django.t.taobao.com,从报文中可以看出,语音消息是以文件形式在网络中传输的,下图为一次语音的发送传输过 ...
- PJzhang:如何在裸奔的年代找到一些遮羞布
猫宁!!! 很久以前的一篇,搬过来. 我一直在“裸奔”,而且很久了,只是不太愿意承认. 想起了“皇帝的新装”,好奇何种经历和灵感让安徒生写出了如此精彩的故事. 一次百度了一个商品,不久接到了大规模电话 ...
- 跟我一起学.NetCore之WebApi接口裸奔有风险(Jwt)
前言 撸码需谨慎,裸奔有风险.经常在一些技术交流群中了解到,还有很多小伙伴的项目中Api接口没有做任何安全机制验证,直接就裸奔了,对于一些临时项目或是个人小项目还好,其余的话,建议小伙伴们酌情考虑都加 ...
- 网骗欺诈?网络裸奔?都是因为 HTTP?
先跟大家讲个故事,我初恋是在初中时谈的,我的后桌的后桌.那个时候没有手机这类的沟通工具,上课交流有三宝,脚踢屁股.笔戳后背以及传纸条,当然我只能是那个屁股和后背,还不是能让初恋踢到的后背. 但是说实话 ...
- 裸奔mysql
centos 7 下裸奔mysql # vim /etc/my.cnf在[mysqld]的段中加上一句:skip-grant-tables例如:[mysqld]datadir=/var/lib/mys ...
随机推荐
- 一种快速部署开发用oracle的办法
前段时间工作中需要在不少开发环境中快速提供开发可用的oracle环境,由于一一培训并部署原生oracle人力和时间成本过高,后来使用docker版本oracle,大大方便了开发工作的快速启动,方法记录 ...
- [20180627]测试bbed是否支持管道命令.txt
[20180627]测试bbed是否支持管道命令.txt --//测试bbed是否支持管道命令.txt 1.环境:SCOTT@test01p> @ ver1PORT_STRING ...
- 转:更改SQLServer实例默认字符集
需求 安装数据库时,将字符集安装成了“SQL_Latin1_General_CP1_CI_AS”,现在需要将其更改为“Chinese_PRC_CI_AS”. 方法 重新生成系统数据库 ,然后还原配 ...
- 添加RPMfusion仓库
先添加epel Fedora的意识形态很是严谨,它不会自带任何非自由组件.官方仓库不会提供一些包含有非自由组件的基本软件,比如像多媒体编码.因此,安装一些第三方仓库很有必要,这些仓库会为我们提供一些基 ...
- 12个HTML和CSS必须知道的重点难点问题
这12个问题,基本上就是HTML和CSS基础中的重点个难点了,也是必须要弄清楚的基本问题,其中定位的绝对定位和相对定位到底相对什么定位?这个还是容易被忽视的,浮动也是一个大坑,有很多细节.这12个知识 ...
- 第 16 章 C 预处理器和 C 库(qsort() 函数)
/*---------------------------------------- qsorter.c -- 用 qsort() 排序一组数字 --------------------------- ...
- Dubbo+zookeeper+SpringMVC搭建最简单的分布式项目
Dubbo 是什么 一款分布式服务框架 高性能和透明化的RPC远程服务调用方案 SOA服务治理方案 Dubbo 架构流程图 Provider:服务提供方 Consumer:服务消费者 Registry ...
- Spring AOP的实现研究
1. 背景 在前文Spring IOC容器创建bean过程浅析已经介绍了Spring IOC创建初始化bean的大致过程.现在对Spring的AOP实现机制进行研究分析. 2. 名词与概念 名词 概念 ...
- luogu P2860 [USACO06JAN]冗余路径Redundant Paths
题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1- ...
- 原生js删除元素
//删除id var idObject = document.getElementById('sidebar'); if (idObject != null) idObject.parentNode. ...