服务器上的数据库被删了,不慌~~
一、发现问题:
近期访问我的网站的时候登录报错,到主机上查看了一下日志才发现系统找不到指定数据库,
慌张的我赶紧连接了一下数据库看看,发现真的是数据库被黑了
text
All your data was backed up from your server. You need to email us at rasmus+2669e@onionmail.org to recover your data. If you dont contact us we will reach the General Data Protection Regulation, GDPR, and notify them that you store user data in an open form that is not safe. Under the rules of the law, you face a heavy fine or arrest and your database dump will be deleted from our server forever!
翻译了一下:
您的所有数据都从您的服务器备份。您需要发送电子邮件给我们 rasmus+2669e@onionmail.org 以恢复您的数据。如果您不联系我们,我们将联系通用数据保护条例 GDPR,并通知他们您以不安全的开放形式存储用户数据。根据法律规定,您将面临巨额罚款或逮捕,您的数据库转储将从我们的服务器中永久删除!
wc,好害怕!!!
二、分析一波:
原因可能就是黑客扫描到公网的主机,发现开放了3306端口,并通过破解密码进入,进行一系列操作,然后跑路
我们可以通过查看Mysql中的binlog日志看看它到底干了些什么:
# 登录到mysql,执行以下命令,后面代表的是要查看的日志的文件名
show binlog events in "binlog.000005";
* 删除了数据库
* 创建了一个新的数据库 README_TO_RECOVER_A
* 在这个数据库里建了张表 RECOVER_YOUR_DATA
* 插入了一条数据,“提醒我们”
* 删除root用户对于所有数据库的权限
也可在终端中查看:
mysqlbinlog "binlog.000005" # 能够查看更详细的信息,比如时间等
在此还是提醒大家的数据库不要设置成太简单的密码,root(比如我hh),123等等,很容易被暴力破解
三、数据库恢复:
既然已经发生了,就要想办法恢复数据库
通过查看binlog日志发现,删库的日期是在26号,所以直接恢复该日期之前的sql操作即可
由于我的删库操作记录在 binlog.000005 中,所以我们需要恢复binlog.000001~4以及 binlog.000005中的26号之前的sql操作
写一个python脚本生成恢复的sql文件:
#coding: utf-8
import os
os.chdir("/var/lib/mysql")
files = os.listdir(".")
for file in files:
if file.startswith("binlog.0"):
num = int(file[len(file)-1])
if num > 5:
continue
elif num == 5:
os.system("mysqlbinlog --no-defaults -v --base64-output=decode-rows {} --stop-datetime='2023-02-26 00:00:00' >> /home/recover.sql".format(file))
else:
os.system("mysqlbinlog --no-defaults -v --base64-output=decode-rows {} >> /home/recover.sql".format(file))
执行完该脚本之后会在 /home目录下生成 recover.sql 文件
登录到mysql中,根据该sql文件恢复数据
source /home/recover.sql
运行过程中会出现以下错误:
原因就是入侵者将root用户的权限全部收回了
去赋予root用户权限也没用:
解决方案:
查看root用户是否有所有的权限:
SELECT * FROM mysql.user WHERE USER="root"
可以发现有一些是 No, 所以我们要全部改成 Y,不用全改也可以,但是 Grant 权限必须是 Yes:
执行下面的命令来恢复root用户权限:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
再次执行恢复数据库:
source /home/recover.sql
成功恢复~~
四、问题规避:
-
避免mysql的root用户密码太简单:
-- 用root用户登录到mysql后执行 set password="xxx"; -- xxx表示root用户密码
-
可以考虑更换一下mysql的服务端口,(但是好像也没什么用hh,因为可以通过扫描得出监听该端口的应用程序,即使不是3306端口,监听的应用程序是mysql也可以判断是数据库服务)
-
尽量不要让root用户host是 % ,改成特定ip地址, (但网站还是要让所有人访问的,也是没办法)
-
尽量不要使用root用户连接数据库, 有的应用程序会将root用户的密码在配置文件中体现,不利于安全性:
-- 创建一个新用户
create user "client"@'%' identified by "xxx";
-- 给这个用户赋予项目数据库的所有权限
grant all privileges on homesystem.* to client;
在项目中让client这个用户去连接数据库,这样就能避免root用户密码暴露的问题