昨日爆出宝塔面板出现严重安全漏洞,漏洞详情如下:

宝塔面板 7.4.2 版本安装了phpMyAdmin 数据库管理软件,只要直接访问 http://ip:888/pma 即可进入 phpMyAdmin,无需用户名密码就能够操作数据库。

截止至今天,已经有不少使用宝塔面板 7.4.2 版本的网站都被批量删库!甚至是政府网站也无一幸免!据悉早在8月16日前就已经有人开始利用此漏洞,难以想象在 0day 时究竟有多少站长的数据库被入侵。

从目前的形式来看,宝塔不仅失去的是政府与大企的信任,甚至是即将失去大部分忠诚用户!宝塔官方虽然已经给所有用户发送了3次短信,再次提醒立即在线升级版本修复新漏洞,可惜到目前为止不少站长已经放弃了升级宝塔面板的版本,而是到处寻找恢复数据库的方法。

如何防止此类事件再次发生

很多人都喜欢用第三方面板,因为方便可以一键傻瓜式部署而不用去纠结一些环境的配置,但是只要是第三方就一定存在漏洞。这类漏洞有大有小,如果被一些不法分子利用,将会造成很严重的影响,毕竟数据无价。我总结出了一下几点:

  1. 每天定时备份全站数据尤其是数据库,建议本地服务器备份一份,其他地方再备份一份(对象存储或云盘或FTP等),阿里或腾讯云可以创建定时快照;
  2. 时不时关注下安全话题,发现与自己有关的漏洞及时自查,以免造成损失;
  3. 设置好数据库等敏感端口(22、888、3306、3389、6379、27017)的防火墙规则或者设置白名单,能走内网的服务就不要走公网;
  4. 尽量减少使用第三方面板,使用 Docker 或者命令行编译安装的方式部署环境。

如何恢复数据库

如果你能按照我上面所述的做,就算数据库被删也能轻而易举的恢复,但是不少站长都没有数据库备份,一旦数据库丢失就只能傻眼,其实还有一种方法可以恢复数据库,但是不一定能完全恢复。

MySQL 有二进制日志,里面记录了由开启到停止所有数据库的所有增删改操作,所以只能恢复出现过 SQL 语句的数据,比如你在 WordPress 上发布了一篇文章,本质就是 MySQL 数据库执行了一条 SQL 插入语句。此恢复方法适用于数据灾难的、数据库总体和高精度的恢复,不适合日常的数据恢复,所以平常还是要做好数据的备份!

此方法在使用前必须先创建一个服务器快照,以防万一。

  1. 先登陆 MySQL,使用 mysql -h localhost -uroot -p<password> 指令或者使用任意一款第三方数据库连接软件;

  2. 使用 show variables like 'log_bin'; 检查是否开启 binlog 日志功能,ON 代表开启,OFF 代表没有开启;宝塔默认都是开启的,如果是 OFF 那没救了;

  1. 使用 show master logs;show binary logs; 命令查看已有的 binlog 日志文件;

  1. 恢复数据库,使用 mysqlbinlog 命令恢复数据库;
--start-date  # 开始日期,时间格式为2020-08-23 00:00:00,恢复到这个时间之后的数据
--stop-date   # 结束时间,时间格式为2020-08-23 00:00:00,恢复到这个时间段之前的数据
--start-position  # 指定开始位置,恢复到此位置之后的数据
--stop-position   # 指定结束位置,恢复此位置之前的数据

例:
# 先导出你要还原的 binlog 日志文件,得到时间或者位置
/www/server/mysql/bin/mysqlbinlog /www/server/data/mysql-bin.000004 > /root/test.txt

# 恢复整个日志文件
/www/server/mysql/bin/mysqlbinlog /www/server/data/mysql-binlog.000004 | mysql -uroot -p

# 按时间还原
/www/server/mysql/bin/mysqlbinlog --start-datetime="2020-08-23 00:00:00" --stop-datetime="2020-08-23 23:59:59" /www/server/data/mysql-binlog.000004 | mysql -uroot -p

# 按位置还原
/www/server/mysql/bin/mysqlbinlog --start-position=150 ---stop-position=340 /www/server/data/mysql-binlog.000004 | mysql -uroot -p
  1. 然后回到数据库表,看看数据是否已经恢复,不保证 100% 恢复。

开启 binlog 日志记录

已经开启的就不用管了,没开启的按如下操作:

  1. 修改 etc/my.cnf 文件,在 [mysqld] 下加入

log-bin=mysql-bin
binlog_format=mixed
server-id = 1

  1. 重启 MySQL 服务即可
    systemctl restart mysqld

mysqlbinlog 其他用法

  1. 导出
    >: 导入到文件中; >>: 追加到文件中
# 导出为文本文件
/www/server/mysql/bin/mysqlbinlog /www/server/data/mysql-bin.000004 > /root/test.txt

# 导出为 sql 文件
/www/server/mysql/bin/mysqlbinlog /www/server/data/mysql-bin.000004 > /root/test.sql

# 多个文件
/www/server/mysql/bin/mysqlbinlog /www/server/data/mysql-bin.000005 >> /root/test.sql

# 按指定位置导出
/www/server/mysql/bin/mysqlbinlog --start-datetime="2020-08-23 00:00:00" --stop-datetime="2020-08-23 23:59:59" /www/server/data/mysql-binlog.000004 > /root/test.txt

# 按指定时间导出
/www/server/mysql/bin/mysqlbinlog --start-position=150 ---stop-position=340 /www/server/data/mysql-binlog.000004 > /root/test.txt
  1. 其他常用操作
# 查看所有日志文件
mysql>show master logs;

# 当前使用的 binlog 文件
mysql>show binlog events \g;

# 产生一个新的 binlog 日志文件
mysql>flush logs;

# 删除所有二进制日志,并从新开始记录
mysql > flush logs;
mysql > reset master;


Never give up your dreams.