2020年8月23日,宝塔面板出现严重安全漏洞,影响版本为7.4.2。当天晚上,漏洞信息已广泛传播。
漏洞描述
宝塔面板 7.4.2 版本如果安装了phpMyAdmin 数据库管理软件,只要直接访问 http://ip:888/pma
即可进入 phpMyAdmin,无需用户名密码就能够操作数据库。
截止至8月24日晚,已经有不少使用宝塔面板 7.4.2 版本的网站都被批量删库,甚至是政府网站也无一幸免!据悉早在8月16日,已有攻击者开始利用该漏洞,导致了大量站长的数据库遭到入侵。目前仍无法预测出漏洞发布后的第一时间,多少用户遭到了数据库入侵。
从目前的形式来看,官方已经给所有用户发送了三次短信,提醒用户及时在线升级版本以修复漏洞。但是,有大量站长已放弃更新宝塔面板的版本,而是选择寻找恢复数据库的方法。这种情况下,宝塔面板不仅失去了政府和大企的信任,甚至面临着失去大部分忠诚用户的危险。
如何防止此类事件再次发生
作为网站运营者,使用第三方面板确实可以简化部署和配置过程,但是要意识到潜在的安全风险。这些风险可能会导致数据泄露、网站被攻击甚至是数据丢失。为了减少这些风险,我总结出了以下几点建议:
- 定期备份数据:每天定时备份整个网站的数据,尤其是数据库。建议在本地服务器备份一份,并在其他地方(如对象存储、云盘或FTP)备份一份。阿里云或腾讯云等服务商提供了定时快照功能,可以方便地备份数据。
- 关注安全话题:时刻关注最新的安全话题,尤其是与自己使用的软件和服务相关的漏洞。如果发现相关漏洞,应立即自查并采取措施防止损失。
- 配置防火墙规则:设置好数据库等敏感端口(如22、888、3306、3389、6379、27017)的防火墙规则或者设置白名单。对于可以通过内网访问的服务,应尽量避免通过公网访问。
- 减少使用第三方面板:尽量减少使用第三方面板,而是选择使用Docker或命令行编译安装的方式部署环境。这种方式虽然需要更多的技术知识,但是可以更好地控制安全性。
通过采取这些措施,网站运营者可以有效地减少安全风险,保护网站数据和用户信息。记住,数据安全是网站运营的首要任务,千万不要因为一时的懒惰而造成不可弥补的损失。
如何恢复数据库
不少站长没有进行数据库备份,一旦数据库丢失,往往只能无奈地面对此困境。其实,还有一种方法可以尝试恢复数据库,但无法保证完全恢复。MySQL 的二进制日志(binlog)记录了数据库从开启到停止期间的所有增删改操作,因此只能够恢复那些曾执行过的 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 服务,即可生效
binlog 常见操作
# 导出为SQL文件 /www/server/mysql/bin/mysqlbinlog /www/server/data/mysql-bin.000004 > /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 # 查看所有日志文件 show master logs; # 当前使用的binlog文件 show binlog events \g; # 产生一个新的 binlog 日志文件 flush logs; # 删除所有二进制日志,并从新开始记录 flush logs; reset master;
不要在pve这台宿主机上执行apt install cloud-init -y
不要在pve这台宿主机上执行apt install cloud-init -y
不要在pve这台宿主机上执行apt install cloud-init -y
是在创建的虚拟机镜像上执行