昨日爆出宝塔面板出现严重安全漏洞,漏洞详情如下:
宝塔面板 7.4.2 版本安装了phpMyAdmin 数据库管理软件,只要直接访问 http://ip:888/pma
即可进入 phpMyAdmin,无需用户名密码就能够操作数据库。
截止至今天,已经有不少使用宝塔面板 7.4.2 版本的网站都被批量删库!甚至是政府网站也无一幸免!据悉早在8月16日前就已经有人开始利用此漏洞,难以想象在 0day 时究竟有多少站长的数据库被入侵。
从目前的形式来看,宝塔不仅失去的是政府与大企的信任,甚至是即将失去大部分忠诚用户!宝塔官方虽然已经给所有用户发送了3次短信,再次提醒立即在线升级版本修复新漏洞,可惜到目前为止不少站长已经放弃了升级宝塔面板的版本,而是到处寻找恢复数据库的方法。
如何防止此类事件再次发生
很多人都喜欢用第三方面板,因为方便可以一键傻瓜式部署而不用去纠结一些环境的配置,但是只要是第三方就一定存在漏洞。这类漏洞有大有小,如果被一些不法分子利用,将会造成很严重的影响,毕竟数据无价。我总结出了一下几点:
- 每天定时备份全站数据尤其是数据库,建议本地服务器备份一份,其他地方再备份一份(对象存储或云盘或FTP等),阿里或腾讯云可以创建定时快照;
- 时不时关注下安全话题,发现与自己有关的漏洞及时自查,以免造成损失;
- 设置好数据库等敏感端口(22、888、3306、3389、6379、27017)的防火墙规则或者设置白名单,能走内网的服务就不要走公网;
- 尽量减少使用第三方面板,使用 Docker 或者命令行编译安装的方式部署环境。
如何恢复数据库
如果你能按照我上面所述的做,就算数据库被删也能轻而易举的恢复,但是不少站长都没有数据库备份,一旦数据库丢失就只能傻眼,其实还有一种方法可以恢复数据库,但是不一定能完全恢复。
MySQL 有二进制日志,里面记录了由开启到停止所有数据库的所有增删改操作,所以只能恢复出现过 SQL 语句的数据,比如你在 WordPress 上发布了一篇文章,本质就是 MySQL 数据库执行了一条 SQL 插入语句。此恢复方法适用于数据灾难的、数据库总体和高精度的恢复,不适合日常的数据恢复,所以平常还是要做好数据的备份!
此方法在使用前必须先创建一个服务器快照,以防万一。
- 先登陆 MySQL,使用
mysql -h localhost -uroot -p<password>
指令或者使用任意一款第三方数据库连接软件; 使用
show variables like 'log_bin';
检查是否开启 binlog 日志功能,ON 代表开启,OFF 代表没有开启;宝塔默认都是开启的,如果是 OFF 那没救了;
- 使用
show master logs;
或show binary logs;
命令查看已有的 binlog 日志文件;
- 恢复数据库,使用 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
- 然后回到数据库表,看看数据是否已经恢复,不保证 100% 恢复。
开启 binlog 日志记录
已经开启的就不用管了,没开启的按如下操作:
- 修改
etc/my.cnf
文件,在 [mysqld] 下加入
log-bin=mysql-bin
binlog_format=mixed
server-id = 1
- 重启 MySQL 服务即可
systemctl restart mysqld
mysqlbinlog 其他用法
- 导出
>
: 导入到文件中;>>
: 追加到文件中
# 导出为文本文件
/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
- 其他常用操作
# 查看所有日志文件
mysql>show master logs;
# 当前使用的 binlog 文件
mysql>show binlog events \g;
# 产生一个新的 binlog 日志文件
mysql>flush logs;
# 删除所有二进制日志,并从新开始记录
mysql > flush logs;
mysql > reset master;
Comments | NOTHING