MongoDB安全加固,防止数据库攻击删除勒索威胁
前言:
今天发现前段时间自己搭建的一个系统的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安全加固,防止数据库攻击删除勒索威胁的更多相关文章
- mongodb csv 文件导入数据库,删除特定字段
1. 导入数据库 mongoimport -h host_ip -p port -d db_name -c collection_name --fields name1,name2,name3,nam ...
- MongoDB安全加固方案,防止数据泄露被勒索
早上起来,发现生产数据库被删了,留下一个数据库名叫“PLEASE_READ”,里面内容如下: "Info" : "Your DB is Backed up at our ...
- MongoDB 教程(五):连接、新建数据库、删除数据库
连接 启动 MongoDB 服务 只需要在 MongoDB 安装目录的 bin 目录下执行 mongodb 即可. 执行启动操作后,mongodb 在输出一些必要信息后不会输出任何信息,之后就等待连接 ...
- MongoDB学习笔记(3)--删除数据库
MongoDB 删除数据库 语法 MongoDB 删除数据库的语法格式如下: db.dropDatabase() 删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名. 实例 以下 ...
- Mongodb自动备份数据库并删除指定天数前的备份
1.创建Mongodb数据库备份目录 mkdir -p /home/backup/mongod_bak/mongod_bak_now mkdir -p /home/backup/mongod_bak/ ...
- MongoDB创建数据库和删除数据库05-14学习笔记
MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写,是一个基于分布式文件存储的开源数据库系统.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关 ...
- MongoDB 数据库创建删除
在MongoDB数据库里面是存在有数据库的概念,但是没有模式(所有的信息都是按照文档保存的),保存数据的结构就是JSON结构,只不过在进行一些数据处理的时候才会使用到MongoDB自己的一些操作符号 ...
- 三、MongoDB的创建、更新和删除
一.MongoDB的下载.安装与部署 二.MongoDB的基础知识简介 三.MongoDB的创建.更新和删除 概要 下面开始学习MongoDB最重要也是最基础的部分:C(创建)R(查询)U(更新)D( ...
- MongoDB学习(管理数据库和集合)
管理数据库 显示数据库列表 show dbs 切换到其他数据库 use <database_name> 创建数据库 MongoDB没有提供显式的创建数据库的MongoDB shell命令. ...
- MongoDb 命令查询所有数据库列表
原文:http://blog.csdn.net/huxu981598436/article/details/47216493 MongoDb 命令查询所有数据库列表 CODE: > show d ...
随机推荐
- Logstash: 启动监控及集中管理-总结
Logstash: 启动监控 配置文件:logstash.yml xpack.monitoring.enabled: true xpack.monitoring.elasticsearch.usern ...
- 【前端必会】Prettier,有了ESlint,还要Prettier
介绍 已经安装了ESLint为什么还要Prettier,主要是让ESLint专注于语法相关的验证,检查潜在问题.而代码格式化则有Prettier来接管 对比参考: https://baijiahao. ...
- PAT (Basic Level) Practice 1023 组个最小数 分数 20
给定数字 0-9 各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意 0 不能做首位).例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的最小的数就 ...
- Linux命令系列之top——里面藏着很多鲜为人知的宝藏知识
Linux命令系列之top--里面藏着很多鲜为人知的宝藏知识 简介 top命令是我们经常用来查看系统信息的一个指令,它提供了一个动态的而且是实时的借口帮助我们去查看系统执行时的进程.线程和系统参数的信 ...
- P3919 【模板】可持久化线段树 1(可持久化数组)
还是用主席树来做(因为提到不同的版本),这时候的主席树不是以权值为下标的,就是普通的线段树,维护范围1~n,i存的是a[ ]中的数. 1 #include <bits/stdc++.h> ...
- The XOR Largest Pair (trie树)
题目描述 在给定的 NN 个整数 A_1,A_2,--,A_NA1,A2,--,AN 中选出两个进行xor运算,得到的结果最大是多少?xor表示二进制的异或(^)运算符号. 输入格式 第一行输入 ...
- HDU1114 Piggy-Bank (完全背包)
完全背包模板,和01背包相比不用倒推,因为一种可以选多个. 这道题求最小,dp数组初始化为无穷即可. 1 #include<iostream> 2 #include<cstring& ...
- 鼠标悬浮上去显示小手CSS
鼠标悬浮上去显示小手CSS只需要添加一句css代码即可 cursor:pointer;
- calico和flannel的优缺点
1.Kubernetes通信问题 1.容器间通信:即同一个Pod内多个容器间通信,通常使用loopback来实现. 2.Pod间通信:K8s要求,Pod和Pod之间通信必须使用Pod-IP 直接访问另 ...
- Python处理刚刚,分钟,小时,天前等时间
简介 用爬虫获取目标网站数据后可能会遇见时间为处理刚刚,分钟,小时,天前等时间格式,如图 解决问题: 写了一个工具类来处理该问题,其中封装了两个函数 1. 将时间中的中文数字转换成阿拉伯数字 def ...