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 interfacesnet:  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 7017bash: semanage: command not found# 如果出现上面的错误,可以这样这个解决:[root@localhost thinktik]# dnf install policycoreutils-python-utilsLast 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