PHP2Shell 漏洞事件过去一周了。该升级的升级了,该打补丁的打补丁了。但我在复盘的时候发现,如果只是"升级补丁",那这次漏洞事件算是白经历了。

趁热打铁,我把服务器做了一次全面的安全加固。这篇文章就是我的加固清单,按优先级排列,每一件都是这次漏洞暴露出来的、或者能预防下一次类似事件的事。

第一优先级:补丁和版本管理

1. 升级所有软件到安全版本

这次PHP2Shell影响所有PHP 8.5.12以下的版本。除了PHP,其他软件也要定期升级:Nginx、MySQL、Redis、OpenSSL,以及宝塔面板本身。建立一个清单,记录所有软件的当前版本和安全版本,定期检查。

2. 开启自动安全更新

对于系统级软件(比如OpenSSL、系统内核),开启自动安全更新。这次PHP2Shell从披露到被利用,可能只有几个小时,手动升级根本来不及。自动更新虽然可能有风险,但比起被攻击,风险小得多。

3. 订阅安全公告

关注官方安全公告渠道:PHP官方、Nginx官方、你所在操作系统的安全通告、各大云厂商的安全中心。第一时间获取漏洞信息,是快速响应的前提。

第二优先级:减少攻击面

4. 禁用危险函数

在php.ini的disable_functions里禁用危险函数:

disable_functions = exec,shell_exec,system,passthru,proc_open,popen,show_source,phpinfo

这些函数是Webshell最常用的,禁用了能挡住大部分入侵后的提权操作。注意:如果你的业务确实需要这些函数,可以针对性放开,但要加权限控制。

5. 最小权限原则

Web进程用低权限用户运行(比如www用户),不要用root。Web根目录设置为只读,只有上传目录可写。数据库账号只给必要的权限,不用root连接数据库。

6. 关闭不必要的服务和端口

检查服务器上开放的所有端口,只保留需要的(80/443,SSH,数据库如果是内网就不对外开放)。不用的服务全部关闭,不用的扩展全部卸载。攻击面越小,风险越低。

7. 限制上传功能

如果你的站点不需要文件上传功能,在Nginx层面直接禁用multipart/form-data请求。PHP2Shell就是通过multipart请求触发的,禁用了直接断掉这条攻击路径。

第三优先级:纵深防御

8. 部署Web应用防火墙(WAF)

虽然WAF挡不住所有0day(这个话题我上篇文章聊过),但能挡住大量自动化扫描和已知攻击。宝塔自带的防火墙,或者云厂商的WAF都可以,关键是开启并定期更新规则。

9. 隐藏敏感信息

关闭PHP的错误显示(display_errors=Off),错误日志写入文件而不是输出到页面。这样攻击者无法通过报错信息探测你的系统结构和版本。同时在HTTP头里隐藏X-Powered-By。

10. 限制后台访问

后台管理地址设置访问IP白名单,或者加一个只有你知道的访问密钥。另外给后台加登录失败锁定,连续输错5次锁定IP一段时间,防**破解。

第四优先级:监控和响应

11. 文件完整性监控

定期扫描Web目录,检测文件是否被篡改。一旦发现可疑文件(比如Webshell、后门),立刻告警。宝塔有"网站防篡改"功能,或者用第三方工具(比如OSSEC、Tripwire)。

12. 日志审计

开启访问日志和错误日志,定期分析。重点关注:异常的大POST请求、频繁的403/404、可疑的User-Agent、异常的高频访问。这些往往是攻击的前兆。

13. 数据库备份和恢复演练

定期备份数据库和网站文件,并定期演练恢复流程。备份不是存着就完了,得确保真的能恢复。我一般是每天自动备份,每周手动验证一次备份文件的完整性。

14. 安全事件应急预案

写一份应急预案,记录:发现被入侵了第一步干什么、怎么隔离、怎么排查、怎么恢复、怎么报警。出了事照着做,不会慌乱。我这次PHP2Shell之所以一小时搞定,就是因为提前有预案。

本次加固的实际操作记录

说一下我这次实际做的操作,给大家参考:

  1. 升级PHP到8.5.12(核心操作)
  2. 升级宝塔面板到最新版
  3. 在php.ini中禁用了exec、shell_exec、system等危险函数
  4. 关闭了PHP的错误显示,错误写入日志
  5. 给后台加了IP白名单(只允许家里和公司的IP访问)
  6. 开启宝塔防火墙,更新了PHP2Shell的拦截规则
  7. 设置了文件防篡改监控,每天扫描一次
  8. 检查了所有开放端口,关闭了一个没用的管理端口
  9. 更新了数据库备份策略:每天全量备份,保留7天
  10. 写了应急预案,打印出来贴在显示器旁边

写在最后

安全加固不是一次性的工作,而是一个持续的过程。这周加固完,下周可能有新漏洞,又得再加固。

但我现在的原则是:每一次漏洞事件,都当作一次升级自己安全体系的机会。不只是打补丁,而是复盘整个安全体系,看看哪里有短板,哪里需要加强。

这次的PHP2Shell,让我把之前一直拖着没做的加固项都做了。虽然过程有点被动,但结果还算不错。

希望大家也能借这个机会,检查一下自己的服务器。别等到被攻击了,才后悔当初没加固。

安全无小事,共勉。