记录一次数据库被黑客攻击“RECOVER_YOUR_DATA”的心路历程

项目场景:

最近经常碰到的一个头疼问题:网站开发完成,过了几天之后,数据库中数据表全部消失,只剩下两个表“RECOVER_YOUR_DATA”和“sys”


问题描述:

数据库为什么会自动消失?
既然消失了,为什么还会留下“RECOVER_YOUR_DATA”和“sys”?
是配置问题,还是其他问题?
若能解决,那么如何防范之后不再出现这种情况?


原因分析:

1.MySQL部署在服务器上时用的是docker容器镜像部署,会不会是数据卷挂载失败,导致数宿主机没有同步到容器内的数据?

Docker部署MySQL语句
docker run \
-p 3306:3306 \
--restart=always \
--name mysql \
--privileged=true \
-v /home/mysql/log:/var/log/mysql \
-v /home/mysql/data:/var/lib/mysql \
-v /home/mysql/conf.d:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:8.0.33

部署完成后,输入docker inspect mysql,若能找到以下代码则表示宿主机目录已经与容器内目录数据挂载完成,如果和下面结果一样,则可以排除挂载失败这种情况。

此时使用DBeaver连接服务器上数据库可能会出现以下内容,即初始的数据库有sys(如果想看到mysql、information_schema、performance_schema等系统数据库,那么在设置里面设置“显示系统对象”即可),

也可能是

这就代表你的数据库已经被黑了。我们来看看这个表中都有什么信息:
首先里面包含一张表“RECOVER_YOUR_DATA”:内容大致为:

简明来说,你的数据即将在48小时之内公开并删除,如果想要恢复数据,那么就需要支付0.0102 BTC。当时我还没意识到这张表的存在,就继续管自己建表......当然这种情况也可能在你的数据库建之后出现,那么在一定时间内,你的数据库就会被真正删除!

 


解决方案:

既然已经找到了问题所在,那接下来只需要解决问题即可


这是我们的MySQL的配置文件,其中需要注意:“log-bin”=/home/mysql/data/mysql-bin,这是恢复数据的关键!

        log-bin是 MySQL 中一种非常重要的日志文件,它以二进制格式记录了对数据库执行更改的所有事件,比如 INSERTUPDATEDELETE 等 SQL 语句。这些日志记录对于数据库的复制、恢复和审计等操作起着关键作用,通过上网查询资料我们可以log-bin就是用来“数据恢复”,“主从复制”的。          那么,我们再翻译一下这段话什么意思,“log-bin”=/home/mysql/data/mysql-bin:log-bin文件路径在“/home/mysql/data”Docker的虚拟目录下,并以mysql-bin开头,如下图:
利用它对数据恢复有个前提,就是需要有mysqlbinlog工具,但是Docker拉取MySQL8.0.33时并不会包含此工具,让我们来看看deepseek是怎么回答的。
我认为最麻烦的一步来了,这种情况下,该如何安装mysqlbinlog工具呢?这里提供一种方法(CentOS7)使用yum在宿主机上直接安装mysql-client,这时要确保yum的Python路径(CentOS 7默认Python 2.7),如果不是(为Python3),请自行修改
/usr/bin/yum文件的首行必须为#!/usr/bin/python,出现下图结果,算成功。

然后下载mysql-community-client,可以根据这篇文章进行安装:
安装mysql客户端(yum安装和rpm包安装)_安装mysql服务端时,客户端会作为依赖自动安装-CSDN博客
安装完成之后输入mysqlbinlog --version出现下图结果,那么就算下载成功:



首先我在服务器上创建了一个aaa数据库,里面创建“asd”表,此时模拟数据库被黑掉,手动删除aaa数据库

一看就知道这个是当前操作完后的日志。
先利用:mysqlbinlog /home/mysql/data/mysql-bin.000006 > /tmp/mysql-bin.000006.txt将此bin-log以txt形式展示,找到删除aaa库的具体位置,如下图

上面的红框是代表asd添加了一条数据,而下面的红框代表aaa数据库被删除,此时,我们只要"at2531"行之前的SQL获取即可,这样就能试着恢复数据库。

输入代码后,生成SQL脚本,运行该SQL脚本,即可恢复数据库以及数据。运行结果如下:

此时不仅数据库成功恢复,数据表内容也成功恢复!


温馨提示,如果想要避免被黑客攻击,有以下方法可供参考:

1.首先可以新增用户,密码采用强密码,禁止其他IP登录root,只允许本地,减少用户对数据表的访问与操作的权限。并一段时间修改一次密码。
2.开启防火墙,开放MySQL所在端口或者直接修改MySQL默认3306端口,修改为3307等,阿里云中的“安全组”可以实现端口开放。
3.定时监控数据库的操作(zabbix,本人还未使用过)
4.使用root用户,根据需求选择指定端口能连接数据库

最后,如果本篇文章有不足之处,请评论区留言,我们一起探讨问题,谢谢!

### 使用 Docker 中 MySQL XtraBackup 进行备份 为了在 Docker 环境中使用 Percona XtraBackup 对 MySQL 数据库进行备份,可以按照如下方法操作: #### 准备工作 确保 `mysql` 和 `percona-xtrabackup` 都已经安装并配置好。由于这两个服务通常会分别位于不同的容器内,在同一台主机上的部署方式有助于简化网络连接设置。 #### 创建备份卷 创建一个新的 Docker 卷用于存储备份文件,这一步骤并非强制性的但是推荐做法以便于管理和迁移备份数据[^2]。 ```bash docker volume create mysql_backup_volume ``` #### 执行全量备份 启动一个临时的 percona/xtrabackup 容器来执行完整的备份过程,并指定目标路径为之前创建好的卷位置。 ```bash docker run --rm \ --name=mysql-backup-job \ -v mysql_backup_volume:/backup \ -e MYSQL_ROOT_PASSWORD=your_password \ --network some-network \ percona/percona-xtrabackup:latest \ bash -c "xtrabackup --backup --target-dir=/backup --user=root --password=$MYSQL_ROOT_PASSWORD" ``` 此命令将会把整个数据库实例的数据复制到 `/backup` 文件夹下,该文件夹映射到了宿主机的一个持久化卷上[^1]。 #### 增量备份(可选) 如果希望减少每次完全备份所需的时间和空间开销,则可以选择增量备份策略。这种方式只保存自上次成功完成之后发生变化的部分。 ```bash docker run --rm \ --name=mysql-incremental-e MYSQL_ROOT_PASSWORD=your_password \ --network some-network \ percona/percona-xtrabackup:latest \ bash -c "xtrabackup --incremental-basedir=/backup/full/path --backup --target-dir=/backup/incremental --user=root --password=$MYSQL_ROOT_PASSWORD" ``` 这里假设已经有了名为 `full` 的完整备份作为基础版本;新的更改会被追加至 `incremental` 目录之中。 --- ### 恢复操作指南 当需要从已有的备份还原数据时,请遵循以下步骤: 停止当前正在运行的服务以防止冲突发生: ```bash docker stop your_mysql_container_name ``` 准备一个干净的工作区用来解压备份档案: ```bash mkdir -p /path/to/restore_point && cd $_ tar zxvf /data/backup/mysql7006-20181101.tar.gz . ``` 接下来通过另一个一次性容器来进行实际的数据恢复流程: ```bash docker run --rm \ --name=mysql-recover-job \ -v $(pwd):/source \ -v your_mysql_data_volume:/var/lib/mysql \ --entrypoint="" \ percona/percona-xtrabackup:latest \ bash -c "innobackupex --apply-log /source && innobackupex --copy-back /source" ``` 最后重启 MySQL 实例使其生效: ```bash docker start your_mysql_container_name ``` 注意替换上述脚本中的变量名以及环境参数以匹配具体的项目需求[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值