
核心要点(TL;DR)
- 防篡改的核心是权限最小化加完整性基线,缺一不可。
- 上线前必须建立文件哈希基线,否则篡改无法被及时发现。
- Web目录应对运行账户只读,写入权限只留给上传目录。
- 仅靠WAF不够,需与文件监控和告警形成闭环。
首页突然变成博彩页面、源码里多出一段加密 JS、index.php 的修改时间显示在凌晨三点——这类事故的共同点是:攻击者早已落地文件,而你在数周后才发现。网页防篡改不是装一个插件就完事,而是一套「权限收口 + 基线比对 + 实时告警」的配置组合。下面这份清单按上线顺序排列,共 15 个检查点,每条都给出可执行命令,照着打勾即可。
一、先搞清:网页防篡改到底在防什么
篡改通常分三类:静态页面与模板被替换(挂马、暗链)、脚本文件被注入后门(webshell)、配置与计划任务被改写(持久化)。三类都表现为「文件内容发生变化」,因此检测手段统一为完整性校验,阻断手段统一为权限与执行限制。理解这一点,后面的清单才不会变成盲目堆工具。
二、上线前 15 个检查点(逐项打勾)
权限与账户(1-5)
- Web 进程独立低权限账户运行:确认
ps -o user= -p $(pgrep -f nginx | head -1)输出不是 root。 - 代码目录对运行账户只读:目录 755、文件 644,属主为部署账户;
find /var/www -type d -perm -o+w应无输出。 - 上传/缓存目录禁止执行脚本:Nginx 中
location ~* /uploads/.*\.(php|jsp|sh)$ { return 403; }。 - 禁用目录列表与敏感文件访问:关闭
autoindex,拦截.git、.env、*.bak。 - 关闭不必要的写权限来源:FTP 账户、共享目录、CI 部署密钥逐一核对,离职人员密钥立即吊销。
基线、监控与告警(6-10)
- 建立文件哈希基线:
cd /var/www/html find . -type f -not -path './uploads/*' -print0 | xargs -0 sha256sum > /root/web_baseline.sha256 chmod 400 /root/web_baseline.sha256
基线必须在确认站点干净时生成。 - 定时比对基线:cron 每日执行
sha256sum -c /root/web_baseline.sha256 --quiet,有差异即告警。 - 实时监控关键目录:
inotifywait -m -r -e modify,create,delete,move /var/www/html --format '%w%f %e',输出接入告警通道。 - 告警能到人:邮件、企业微信或 webhook 至少通一条,且做过一次真实触发测试。
- 日志集中留存:访问日志、错误日志、审计日志保留不少于 30 天,防篡改排查高度依赖时间线。
边界与响应(11-15)
- WAF 开启虚拟补丁与篡改规则:对上传、命令执行、文件包含类请求做拦截,规则更新保持自动。
- 关闭危险配置:PHP 侧
disable_functions禁用exec,system,passthru,shell_exec,关闭allow_url_include。 - 备份可恢复且离线:至少一份异地或对象存储只读备份,做过恢复演练。
- 应急流程上墙:谁下线、谁取证、谁恢复、谁对外沟通,四件事有明确责任人。
- 上线后 24 小时内复核一次:重跑基线比对与权限扫描,确认无新增可写点。
三、关键配置对比:只读与可写的边界
| 目录类型 | 权限建议 | 可执行脚本 | 纳入基线 |
|---|---|---|---|
| 代码/模板目录 | 755 / 644,只读 | 否 | 是 |
| 上传目录 | 755,属主为 Web 用户 | 否(403) | 否 |
| 缓存/日志目录 | 750,限制访问 | 否 | 否 |
| 配置文件 | 600,属主 root | 否 | 是 |
这张表的价值在于:把「可写」压缩到最小集合,篡改面自然收窄。凡是既不在基线内、又可写的目录,都是风险敞口。
四、发现篡改后的处置顺序
第一步隔离:切维护页或摘除流量,保留现场。第二步取证:记录变更文件清单、访问日志可疑请求、进程与网络连接快照。第三步定位:比对基线找出全部改动,检查 crontab -l、/etc/cron.*、启动项与新增账户。第四步清除与恢复:从可信备份还原,删除后门并轮换全部口令与密钥。第五步复盘:补齐清单中失守的检查点。
顺序错了代价很大:先恢复后取证,等于亲手销毁攻击者留下的入口线索,二次入侵往往就在几天后。
五、把清单变成日常机制
清单只在上线时打勾一次是不够的。建议把第 6、7、8 项做成每日自动任务,第 2、3 项做成每周扫描,第 13 项每季度做一次恢复演练。防护能力上,可在边界侧配合 AegisX 的 WAF 与主机文件监控能力,把「拦截」与「发现」串成一条链路:请求被拦、文件被改,都能落到同一条告警里。
行动建议
今天就做三件事:生成第一份哈希基线、跑一遍权限扫描、把 inotify 告警接通到人。三件事做完,你的站点就从「被改了不知道」进入「分钟级可发现」。剩下的检查点,按周补齐即可。
常见问题(FAQ)
网页防篡改只装个WAF够不够?
不够。WAF主要拦截外部攻击流量,无法发现通过弱口令SSH、供应链投毒或内部误操作造成的文件落地。真正有效的网页防篡改需要三层:权限最小化限制写入、哈希基线加实时监控发现变更、WAF与告警阻断并通知。只依赖单一手段,一旦攻击绕过WAF或从主机侧进入,页面被替换也可能长时间无人察觉。
怎么快速建立网站文件哈希基线?
进入站点根目录执行 find . -type f -not -path './uploads/*' -print0 | xargs -0 sha256sum > /root/web_baseline.sha256,排除上传与缓存目录。建议把基线文件存放在站点目录之外并设置只读,随后用 cron 每日比对:sha256sum -c /root/web_baseline.sha256 --quiet。首次基线务必在确认站点干净时生成,否则会把后门一并纳入白名单。
网站目录权限应该怎么设置才安全?
原则是运行账户对代码目录只读,仅上传、缓存、日志目录可写。典型做法:目录 755、文件 644,属主为部署账户,Web 进程以独立低权限用户运行;上传目录禁止执行脚本,Nginx 中用 location 匹配并返回 403。切勿图省事给 777,也不要让 Web 进程以 root 运行,否则一次漏洞即可改写全站文件。
发现首页被篡改,第一步做什么?
先隔离取证,不要立刻覆盖恢复。立即下线或切换维护页,保留被篡改文件、访问日志、进程与网络连接快照,记录时间点;再比对哈希基线定位全部变更文件,排查 webshell 与计划任务、启动项。取证完成后再从可信备份恢复并轮换所有口令与密钥。直接覆盖会破坏溯源线索,攻击者往往留有二次入口。
小站没有安全团队,怎么做低成本防篡改?
用系统自带工具即可搭最小闭环:sha256sum 建基线加 cron 定时比对,inotifywait 监控站点目录变更,变更即发邮件或 webhook 告警;关闭目录列表、禁用危险函数、限制上传目录执行权限;再配合云 WAF 或主机防护的基础规则。成本几乎为零,但能把发现时间从数周缩短到分钟级。