自己搭站以来第一次的骚操作。。。此次操作总结如下:


就在今天,我像往常一样访问自己的博客,点进去一看,还报错500,开始还以为是服务器日志把磁盘占用满了,所以就SSH上服务器查看,一检查实时输出日志,报错com.mysql.cj.exceptions.CJException: Unknown database 'blog',找不到名为“blog”的数据库了,于是远程登录mysql,只发现黑客留下的一句话:

To recover your lost Database send 0.03 Bitcoin (BTC) to our Bitcoin addres
s 15xrEjjepFML5V1QeCBX4M2L9o7u4RTCYG and contact us by Email with your Server 
IP or Domain name and a Proof of Payment. Your Database is downloaded and backed up 
on our servers. Backups that we have right now: my_blog_db, zWZwiv3K. 
Any email without your server IP Address or Domain Name and a Proof of Payment 
together will be ignored. If we dont receive your payment in the next 10 Days, 
we will delete your backup.

大概意思就是,数据库已经被我删除并且copy了,如果想要要回数据,就必须向我的比特币账户支付0.03个比特币。 我TM哪来的比特币啊。

得找办法解决此问题啊,一想代码管理器中还有最原始版本的SQL备份。 但是不行啊,原来的数据都没了。得想想办法进行恢复啊。 第一步:检测是否开启mysql的binlog

SHOW VARIABLES LIKE bin_log;

查询结果:

---------------------------------+---------------------------------------+
| Variable_name                   | Value                                 |
+---------------------------------+---------------------------------------+
| log_bin                                 | ON                                    |
| log_bin_basename                | /usr/local/var/mysql/master-bin       |
| log_bin_index                       | /usr/local/var/mysql/master-bin.index |
| log_bin_trust_function_creators | OFF                                   |
| log_bin_use_v1_row_events       | OFF                                   |
| sql_log_bin                           | ON                                    |
+---------------------------------+---------------------------------------+
6 rows in set (0.00 sec)

这一步至关总要,如果没有开启binlog的基本就不用看后面的步骤了。log_bin是ON说明mysql是开启了binlog的,总算是谢天谢地。从配置来看,log_bin_basename 的值是 /usr/local/var/mysql/master-bin 就是 Binlog 的基础文件名了。

cd /var/lib/mysql

目录里面有个叫 binlog.000001 的文件,这个就是我服务器数据库的二级制日志了,这个二进制日志是一个记录我们数据库所有操作的日志,所以原则上来说是可以直接恢复表的。

第二步:利用binlog手动恢复数据

    如果整个数据库被删除,那么binlog就必须从数据库创建到被删除保持完整,
比如说,我是上个月一号开始创建名为mine的数据库和名为blog的表,
那么binlog就需要从上周创建开始一直到现在都必须存在,
假设你是这个月一号才开启的binlog就比较麻烦了,好在我的数据库是一直开启的。

利用mysqlbinlog命令恢复数据库

进入到master-bin.000001的目录然后执行:

mysqlbinlog --start-datetime='2019-01-01 00:00:00' --stop-datetime='2019-06-24 10:30:00' binlog.000001 | mysql -uroot -p

注意这里的开始时间和结束时间,我的数据库大概是2019-06-24 11:00左右被黑客删除的。所以stoptime应该是在此时间前进行恢复。

大概几毫秒。数据库就被恢复了。

第三步:原因分析

被黑客攻击的原因自己总结如下:

数据库root弱口令密码,root:123@tcp(123.123.123.123:3306)/mine?charset=utf8 123这样的密码超级容易被人进行字典暴力破解


数据库端口开放3306,一般来说,公司内容不允许远程开放3306的,由于个人博客就没有注意,导致3306暴露,目前已经添加了端口IP访问白名单


所以,建议大家 数据库换成内网访问。外网访问禁止 开启binlog,和crontab每日备份 添加了端口IP访问白名单、 修改3306默认端口安全策略 修改弱口令