前言

某个早期技术债务项目线上有一个mongoDB服务,用途很简单,存一些文件而已。不过用户那边突然报个bug说上边的图片丢失了,起初没当回事认为是代码遇到错了,直到后来看了用户详细的bug复现后,登进db一看,发现竟然是被入侵了。还被入侵者留了个Warning数据库,只写了一句: 你丫的数据备份在我们安全服务器上,0.2个比特币就还你。

【入侵分析】

当然,根据大家前段时间的比特币勒索的情况看,支付也没用的概率极大,何况也仅仅是大约10M的文件而已。既然不影响生产,也就无所谓恢复不恢复了。

从MongoDB的日志中发现几个被ipip.Net标注为机器人、肉鸡的地址,反查了下时间发现正好对得上被清除的数据时间。当然,这个攻击是来自公网的,很不走运,被攻击的那段时间某个坑逼图方便把到db的端口映射到了公网上,然后就GG了。

当然GG的更深原因是,项目时间太早,MongoDB版本还是2.x,写文件服务的人还在用一个很早版本的.Net Driver,据开发说这个Driver最大的bug是不能执行用户名密码登录,会报错,而Java版本却没问题,因此在配置时就没有要求mongoDB带验证,更别说ssl了。【根据目前对mongoDB的研究,个人对此表示怀疑...】 总之,这次事件铁定是某开发的锅,当然没有及时采用新版Driver等也是不合理的。

在及时止损把服务端口从路由器上去掉、服务器全盘查杀并重新配置了防火墙策略后,还是决定重新建独立的文件服务,让MongoDB不会有机会再暴露,也正好迭代一下旧产品的技术。

【正文开始】

这篇博客主要聊聊部署测试环境时遇到的几个坑。

首先,MongoDB已经升级到3.6版本,最新的Driver是2.5版本,是17年12月发布的Release,同样可以在Nuget上更新。因此,测试环境放在Server 2016服务器上,防火墙开启,MongoDB采用配置文件方式启动并注册为服务。

mongoDB如今支持通过配置文件形式启动,这就远比之前编写bat方便得多。其配置文件语法为YAML,是从2.6开始引入的方式。官方介绍地址:https://docs.mongodb.com/manual/reference/configuration-options

这么一看发现配置项还真不少。很长时间没再回来细看MongoDB的东西,发现原来这么复杂。当然目前的用途我们只需要配置以下这些信息即可:

带配置文件启动很简单:

.\mongod --config ".\MongoDB\mongo.conf" --install

--install参数是用来安装Windows服务的,关于服务的设置,参见配置文件中 processManagement部分。

然而现实是:

仔细对比了很久也没发现配置上有错,并且这个error的提示基本等于没说。

在调整了几遍配置顺序后几近崩溃,最终决定复制错误信息去查,结果发现还真是同样的报错信息,原因是——配置文档中不能用Tab

当然附带的一个小问题是文件的编码必须是ASCI,否则会解析出错。

改完之后,服务正确安装了,启动后可以进行连接。

切换到admin数据库,由于我们是设置带验证登录,目前是没有账户的,所以需要在Admin中创建。

于是我们尝试执行:

db.createUser({user:"user01"})

然而报错:

到这我们是可以想到的,由于服务已经带验证启动了,所以目前直接登录虽然允许访问admin数据库,但是没有任何权限。

所以我们要将服务改为不带验证的方式。

因为服务安装时指定了配置文件,所以我们只需要注释掉配置文件中的authoriation项或改为disabled即可,重启服务后生效。

这时候我们跟着官方文档走,创建一个管理员账户:

db.createUser(
{
user:"usr01",
pwd:"123456",
roles:["dbAdmin"]
}

参考官方介绍, roles参数是一个Bson结构的数组,写法可以是简化的角色名,也可以是完整的角色对象:

roles:[
{role:"readWrite", db:"file"},
{role:"DbAdmin", db:"file"}
]

用户创建好了之后,就可以将服务改回带验证启动了。

再登录:

.\mongo.exe -u usr01 -p 123456rt --authenticationDatabase "admin" -port 27018

即可进入被授权的admin数据库。

关于mongoDB的用户角色分为内置角色和用户定义角色,具体可参考:

https://docs.mongodb.com/manual/reference/built-in-roles/#built-in-roles

这里有一点坑的是,当我在localhost下以前边创建的usr01账户登录,并且希望为新的Collection创建一个专用账户并赋予权限时,始终报错提示我没有权限进行操作,即便我重新使用root账户登录,也依然不行。

最后是在官方文档里发现这样一段:

换到另一台机器上,使用客户端连接,可以修改或新增用户了。

【其他】

顺便一提,配置文件中的BindIP选项不知道是什么原理,如果第一位写了127.0.0.1,虽然官方文档说可以 用逗号分隔,设置多个地址,但这样配置之后只能通过localhost客户端去连接。大概需要把范围更大的放前边吧。。

最新文章

  1. for循环中的占位 pass
  2. hibernate-cascade级联关系
  3. java 中 ArrayList LinkedList Vector 三者的异同点
  4. Android学习笔记(十三)——广播机制
  5. grunt初体验
  6. java基础知识回顾之java Thread类学习(三)--java线程实现常见的两种方式实现好处:
  7. Android 中使用 html 作布局文件
  8. javascript模式——Mixin
  9. WampServer PHP服务配置方法(允许外部访问、phpmyadmin设置为输入用户名密码才可登录等)
  10. ORACLE触发特定的解释
  11. Leetcode::JumpGame
  12. 关于Visio Studio 2012使用Nuget获取Sqlite驱动包报错:“System.Data.SQLite.EF6”的架构版本与 NuGet 的版本 2.0.30625.9003 不兼容
  13. Python字符串的格式化,看这一篇就够了
  14. 想在已创建的Vue工程里引入vux组件
  15. dump增加的表数据
  16. linux c使用socket进行http 通信,并接收任意大小的http响应(五)
  17. Android开发 - 获取Android设备的唯一标识码(Android 6.0或更高)
  18. Android: 设置 app 字体大小不跟随系统字体调整而变化
  19. Python自动化之跨域访问jsonp
  20. Teamwork(The third day of the team)

热门文章

  1. CSUST 8.5 早训
  2. Lucene整理--中文分词
  3. django2.0url的变动
  4. java的idea项目文件夹合并,怎么分开
  5. ECMAScrip5 二
  6. vue中项目如何引入sass (vue-cli项目)
  7. Linux 下编写.sh文件运行JAR下的Class
  8. Linux系统性能测试工具(七)——网络性能工具之iperf
  9. 2019长安大学ACM校赛网络同步赛 B Trial of Devil (递归)
  10. Codeforces 934 最长不递减子序列 多项式系数推导