前言:

  今天发现前段时间自己搭建的一个系统的MongoDB数据找不到了,觉得很奇妙,然后登上MongoDB数据库发现多了一个名为READ__ME_TO_RECOVER_YOUR_DATA的数据库,里面还有一个README的集合里面包含了下面描述的勒索信息。没错我的MongoDB数据库被攻击了,不过还好这个系统里面的数据都是自己学习的一些没有任何价值的数据。但是换个角度,假如在公司层面遇到这样的事情那一定是天大的事情了,你要面临公司、客户信息安全问题。所以无论是自己学习,还是工作方面我们都要养成时刻做好保护自己软件程序,及其数据源安全的问题。今天主要来讲讲为什么MongoDB这么容易遭遇勒索的原因和我们该如何做好防护措施。

README文档内容如下:

All your data is a backed up. You must pay 0.06 BTC to 168i2g62fcXwu3GYAJM4FAksxEmNnDjCkm 48 hours for recover it. After 48 hours expiration we will leaked and exposed all your data. In case of refusal to pay, we will contact the General Data Protection Regulation, GDPR and notify them that you store user data in an open form and is not safe. Under the rules of the law, you face a heavy fine or arrest and your base dump will be dropped from our server! You can buy bitcoin here, does not take much time to buy https://localbitcoins.com or https://buy.moonpay.io/ After paying write to me in the mail with your DB IP: rambler+1duuz@onionmail.org and/or mariadb@mailnesia.com and you will receive a link to download your database dump.

翻译过来就是:

你所有的数据都有备份。你必须支付0.06比特币到168i2g62fcXwu3GYAJM4FAksxEmNnDjCkm 48小时来恢复它。在48小时到期后,我们将泄露和暴露您的所有数据。在拒绝付款的情况下,我们将联系通用数据保护条例(GDPR),并通知他们您以公开形式存储用户数据,这是不安全的。根据法律规定,你将面临巨额罚款或逮捕你的数据库将从我们的服务器上删除!你可以在这里购买比特币,不需要太多时间购买https://localbitcoins.com或https://buy.moonpay.io/支付后写信给我的邮件与你的DB IP: rambler+1duuz@onionmail.org和/或mariadb@mailnesia.com,你会收到一个链接下载你的数据库转储。

MongoDB漏洞成因:

  在初始安装完毕的时候MongoDB都默认有一个admin数据库,此时admin数据库是空的,没有记录权限相关的信息!当admin.system.users一个用户都没有时,即使mongod启动时添加了—auth参数,如果没有在admin数据库中添加用户,此时不进行任何认证还是可以做任何操作(不管是否是以—auth 参数启动),直到在admin.system.users中添加了一个用户。加固的核心是只有在admin.system.users中添加用户之后,mongodb的认证,授权服务才能生效。

遭遇勒索的原因分析:

  首先我这个MongoDB数据库是安装在Docker上面的,因为都是是有默认安装的方式,并且安装完成以后都没有开启默认权限验证登录的功能。开启MongoDB服务时不添加任何参数时默认是没有权限验证的,登录的用户可以通过默认端口无需密码对数据库任意操作(增删改高危动作)而且可以远程访问数据库。并且我还使用了27017这个默认端口,所以黑客可以通过批量扫描Ip很快就能检索到。

MongoDB安全加固措施:

1、配置账号密码,开启MongoDB的权限访问

Docker安装MongoDB时开启权限验证的命令:

docker run -itd --name mongo-test -p 27017:27017 mongo --auth

参数说明:

  • -itd:其中,i是交互式操作,t是一个终端,d指的是在后台运行。
  • --name mongo-test:容器名称
  • -p 27017:27017 :映射容器服务的 27017 端口到宿主机的 27017 端口。外部可以直接通过 宿主机 ip:27017 访问到 mongo 的服务。
  • --auth:需要密码才能访问容器服务(注意:安全问题,MongoDB默认是不开启权限验证的,不过设置了这里就相当于修改MongoDB的配置auth=ture启用权限访问)。

2、使用非默认的端口,减少互联网上被端口扫描并定向爆破的概率

对MongoDB监听的端口和IP做调整有下面2个目的

  • IP: 默认监听IP为127.0.0.1,我们可能需要开放特定的CIDR来让处于不同主机上的客户端可以连接. 最简单的就是直接允许任意IP的客户端连接,这时CIDR为0.0.0.0.但是这也是很危险的一个操作,意味着全球互联网上的任意一台电脑都可以连接上来,这虽然方便但是也是最危险的,建议指定具体的CIDR,这样可以排除互联网的大量肉鸡进行恶意的连接。
  • 端口: 默认的监听端口为27017,我们可以改为其他端口,躲开互联网上的恶意程序的扫描和连接。

修改/etc/mongod.conf

vim /etc/mongod.conf

在端口和IP监听部分我们改为如下设置:

#network interfaces
net:
port: 7017
bindIp: 0.0.0.0 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.

修改完成后重启服务:

systemctl restart mongod

如果重启失败,可能是SELinux的安全策略限制了MongoDB使用新的端口,我们需要放行MongoDB使用新的端口:

[root@localhost thinktik]# semanage port -a -t mongod_port_t -p tcp 7017
bash: semanage: command not found
# 如果出现上面的错误,可以这样这个解决:
[root@localhost thinktik]# dnf install policycoreutils-python-utils
Last metadata expiration check: 0:10:50 ago on Mon 27 Dec 2021 03:11:19 PM CST.
...

SELinux放行后,我们继续重启即可.

配置防火墙

如果你需要服务被互联网上的其他电脑访问,那么你需要配置防火墙,运行你的端口被访问

# 开放7017端口
[root@thinkvm01 thinktik]# firewall-cmd --zone=public --add-port=7017/tcp --permanent
# 重载防火墙
[root@thinkvm01 thinktik]# firewall-cmd --reload

3、限制访问IP

MongoDB可以限制只允许某一特定IP来访问,只要在启动时加一个参数bind_ip即可,或者在/etc/mongodb.conf中添加bind_ip配置,如下:

# 方法一
mongod --bind_ip 127.0.0.1,10.0.133.14 # 方法二
在/etc/mongodb.conf文件中添加以下内容:
bind_ip = 127.0.0.1,10.0.133.14
这样之后,MongoDB服务端只有127.0.0.1和10.0.133.14这两个 IP 可以访问了。

4、关闭万网访问权限

关闭外网访问权限,也就是限定只能是内网访问。
在/etc/mongodb.conf中配置:

bind_ip 127.0.0.1

预防方法:

经过这里勒索经历,我总结了一下几点:

  • 不要裸奔,首先把你数据库的账户密码设置好,做好权限验证登录!
  • 尽量不要把你的数据库摆上公网,业务处理都尽量在内网进行!
  • 如果要摆上公网,一定要设置好访问权限,绑定访问源 IP!
  • 记得养成数据备份的好习惯!

参考文章:

https://new.qq.com/rain/a/20210330A06AYX00

https://www.cnblogs.com/fundebug/p/how-to-protect-mongodb.html

https://juejin.cn/post/7049315722039656479

MongoDB安全加固,防止数据库攻击删除勒索威胁的更多相关文章

  1. mongodb csv 文件导入数据库,删除特定字段

    1. 导入数据库 mongoimport -h host_ip -p port -d db_name -c collection_name --fields name1,name2,name3,nam ...

  2. MongoDB安全加固方案,防止数据泄露被勒索

    早上起来,发现生产数据库被删了,留下一个数据库名叫“PLEASE_READ”,里面内容如下: "Info" : "Your DB is Backed up at our ...

  3. MongoDB 教程(五):连接、新建数据库、删除数据库

    连接 启动 MongoDB 服务 只需要在 MongoDB 安装目录的 bin 目录下执行 mongodb 即可. 执行启动操作后,mongodb 在输出一些必要信息后不会输出任何信息,之后就等待连接 ...

  4. MongoDB学习笔记(3)--删除数据库

    MongoDB 删除数据库 语法 MongoDB 删除数据库的语法格式如下: db.dropDatabase() 删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名. 实例 以下 ...

  5. Mongodb自动备份数据库并删除指定天数前的备份

    1.创建Mongodb数据库备份目录 mkdir -p /home/backup/mongod_bak/mongod_bak_now mkdir -p /home/backup/mongod_bak/ ...

  6. MongoDB创建数据库和删除数据库05-14学习笔记

    MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写,是一个基于分布式文件存储的开源数据库系统.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关 ...

  7. MongoDB 数据库创建删除

    在MongoDB数据库里面是存在有数据库的概念,但是没有模式(所有的信息都是按照文档保存的),保存数据的结构就是JSON结构,只不过在进行一些数据处理的时候才会使用到MongoDB自己的一些操作符号 ...

  8. 三、MongoDB的创建、更新和删除

    一.MongoDB的下载.安装与部署 二.MongoDB的基础知识简介 三.MongoDB的创建.更新和删除 概要 下面开始学习MongoDB最重要也是最基础的部分:C(创建)R(查询)U(更新)D( ...

  9. MongoDB学习(管理数据库和集合)

    管理数据库 显示数据库列表 show dbs 切换到其他数据库 use <database_name> 创建数据库 MongoDB没有提供显式的创建数据库的MongoDB shell命令. ...

  10. MongoDb 命令查询所有数据库列表

    原文:http://blog.csdn.net/huxu981598436/article/details/47216493 MongoDb 命令查询所有数据库列表 CODE: > show d ...

随机推荐

  1. Loki 简明教程

    文章转载参考自:https://jishuin.proginn.com/p/763bfbd2ac34 Loki 是 Grafana Labs 团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日 ...

  2. .NET 反向代理 YARP 自定义配置提供程序(Configuration Providers)

    介绍 基本 Yarp 示例显示从 appsettings.json 加载的代理配置.相反,代理配置可以从您选择的源以编程方式加载.您可以通过提供几个实现 IProxyConfigProvider 和 ...

  3. Oh My Life~

    作者:HChan 链接:https://zhuanlan.zhihu.com/p/47084162 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. Part 1 那年 ...

  4. GitLab + Jenkins + Harbor 工具链快速落地指南

    目录 一.今天想干啥? 二.今天干点啥? 三.今天怎么干? 3.1.常规打法 3.2.不走寻常路 四.开干吧! 4.1.工具链部署 4.2.网络配置 4.3.验证工具链部署结果 4.3.1.GitLa ...

  5. 干货|什么是特性团队/功能团队(FeatureTeam)

    最近一直在思考如何做团队组织能力建设和如何进行决策.执行产品研发策略.因为自己一直在研发效能领域,所以来谈谈什么是特性团队(FeatureTeam), 怎么创建特性团队以及在日常工作中如何结合 Scr ...

  6. 我的Vue之旅 06 超详细、仿 itch.io 主页设计(Mobile)

    第二期 · 使用 Vue 3.1 + TypeScript + Router + Tailwind.css 仿 itch.io 平台主页. 我的主题 HapiGames 是仿 itch.io 的 in ...

  7. el-form-item label中的字体样式设置格式

    1.设置前的代码 <el-form-item label="管理员密码" prop="password" > <el-input type=& ...

  8. Java函数式编程:一、函数式接口,lambda表达式和方法引用

    Java函数式编程 什么是函数式编程 通过整合现有代码来产生新的功能,而不是从零开始编写所有内容,由此我们会得到更加可靠的代码,并获得更高的效率 我们可以这样理解:面向对象编程抽象数据,函数式编程抽象 ...

  9. 【NGINX】浅尝

    Introduction Nginx is a web server that can also be used as a reverse proxy, load balancer, mail pro ...

  10. 定制ASP.NET Core的身份认证

    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 在本章,我们将学习如何定制ASP.NET Core认证机制.微软把安全认证当做AS ...