xuanhao 发表于 2017-12-15 15:27:38

记一次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 &quot;D:\MongoDB\mongod.conf&quot; --auth  带上 --auth 就是开启授权访问。
  最后客户端访问也需要稍微修改下,只需要修改 mongoAddress 配置即可:
# MongoDB Connection String Format  
mongodb://host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[?options]]
  

  
# 实例地址
  
const mongoAddress = 'mongodb://admin:Pwd0603@127.0.0.1:27017/dojo'

就这么一点简单的步骤,就能实现 MongoDB 较高的安全性,可这却是非常容易忽略的点。希望大家引以为戒。

总结


[*]一定不能疏忽大意,安全意识要加强。
[*]一定要结果实际验证,才能下结论。不能不清楚外置条件,人云亦云。
[*]不要有我的应用小,就不会被黑这种想法。批量攻击,才不会放过你。
[*]定期做好数据备份,被攻击是一回事,能否恢复又是另外一回事了。
页: [1]
查看完整版本: 记一次MongoDB裸奔