宝塔PMA漏洞个人看法&被删库且无备份如何恢复

2020年8月23日,宝塔面板出现严重安全漏洞,影响版本为7.4.2。当天晚上,漏洞信息已广泛传播。

漏洞描述

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

截止至8月24日晚,已经有不少使用宝塔面板 7.4.2 版本的网站都被批量删库,甚至是政府网站也无一幸免!据悉早在8月16日,已有攻击者开始利用该漏洞,导致了大量站长的数据库遭到入侵。目前仍无法预测出漏洞发布后的第一时间,多少用户遭到了数据库入侵。

从目前的形式来看,官方已经给所有用户发送了三次短信,提醒用户及时在线升级版本以修复漏洞。但是,有大量站长已放弃更新宝塔面板的版本,而是选择寻找恢复数据库的方法。这种情况下,宝塔面板不仅失去了政府和大企的信任,甚至面临着失去大部分忠诚用户的危险。

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

作为网站运营者,使用第三方面板确实可以简化部署和配置过程,但是要意识到潜在的安全风险。这些风险可能会导致数据泄露、网站被攻击甚至是数据丢失。为了减少这些风险,我总结出了以下几点建议:

  1. 定期备份数据:每天定时备份整个网站的数据,尤其是数据库。建议在本地服务器备份一份,并在其他地方(如对象存储、云盘或FTP)备份一份。阿里云或腾讯云等服务商提供了定时快照功能,可以方便地备份数据。
  2. 关注安全话题:时刻关注最新的安全话题,尤其是与自己使用的软件和服务相关的漏洞。如果发现相关漏洞,应立即自查并采取措施防止损失。
  3. 配置防火墙规则:设置好数据库等敏感端口(如22、888、3306、3389、6379、27017)的防火墙规则或者设置白名单。对于可以通过内网访问的服务,应尽量避免通过公网访问。
  4. 减少使用第三方面板:尽量减少使用第三方面板,而是选择使用Docker或命令行编译安装的方式部署环境。这种方式虽然需要更多的技术知识,但是可以更好地控制安全性。

通过采取这些措施,网站运营者可以有效地减少安全风险,保护网站数据和用户信息。记住,数据安全是网站运营的首要任务,千万不要因为一时的懒惰而造成不可弥补的损失。

如何恢复数据库

不少站长没有进行数据库备份,一旦数据库丢失,往往只能无奈地面对此困境。其实,还有一种方法可以尝试恢复数据库,但无法保证完全恢复。MySQL 的二进制日志(binlog)记录了数据库从开启到停止期间的所有增删改操作,因此只能够恢复那些曾执行过的 SQL 语句的数据。例如,当你在 WordPress 上发表一篇文章时,本质上是 MySQL 数据库执行了一条 SQL 插入语句。此恢复方法适用于数据灾难时的整库和高精度恢复,但并不适合日常的数据恢复。因此,平时仍需做好数据备份!在使用此方法之前,务必先创建一个服务器快照,以防万一。

具体步骤如下:

  1. 登录 MySQL,使用 mysql -h localhost -uroot -p<password> 指令,或使用任意第三方数据库连接软件;
  2. 使用 show variables like 'log_bin'; 指令检查 binlog 日志功能是否开启。返回值为 ON 表示开启,OFF 表示未开启;宝塔默认情况下是开启的。如果返回值为 OFF,那么将无法使用此恢复方法。

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

  4. 使用 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

  2. 重启 MySQL 服务,即可生效
  3. 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;
    
评论区
头像