网站文件完整性校验,md5sum监控文件改动
网站被挂马、配置被误改、代码被篡改,这类问题往往在访问异常后才被发现。
用 md5sum 给网站文件建立一份“指纹基线”,再定期比对,就能快速发现哪些文件被改动。
本文面向零基础用户,从生成基线到定时监控、定位异常文件,一步步给出可直接执行的命令。
先理解 md5sum 能做什么
md5sum 会为每个文件计算一个固定长度的 MD5 值,文件内容只要发生一个字节的变化,这个值就会不同。
它不判断文件好坏,只回答一个问题:这个文件和之前相比,内容有没有变。
适合监控的场景包括:
- 网站程序目录,例如
/www/wwwroot/你的站点 - 关键配置文件,例如 Nginx、PHP 的配置文件
- 上传目录中不应被写入脚本的敏感位置
需要注意,MD5 属于校验值,用于发现改动足够实用,但不要把它当成加密或防篡改签名。
生成第一份文件指纹基线
先进入网站根目录,生成一份包含所有文件 MD5 的清单:
cd /www/wwwroot/example
find . -type f -print0 | xargs -0 md5sum > /root/site_baseline.md5
执行后查看结果:
head /root/site_baseline.md5
wc -l /root/site_baseline.md5
如果能看到类似 d41d8cd98f00b204e9800998ecf8427e ./index.php 的行,说明基线生成成功。
建议把这份文件保存到网站目录之外,避免被一起改掉。
定期比对并找出改动文件
每次检查时重新计算当前指纹,再和基线比对:
cd /www/wwwroot/example
find . -type f -print0 | xargs -0 md5sum > /tmp/site_current.md5
diff /root/site_baseline.md5 /tmp/site_current.md5
没有输出表示文件没有变化;
有输出时,< 开头是基线中的旧值,> 开头是当前值。
想看更直观的差异,可以用:
diff -u /root/site_baseline.md5 /tmp/site_current.md5 | less
如果只想列出新增或删除的文件,可以对比文件名:
comm -3 <(awk '{print $2}' /root/site_baseline.md5 | sort) <(awk '{print $2}' /tmp/site_current.md5 | sort)
放进定时任务,自动发现异常
手动比对适合排查,长期监控建议交给 cron。
新建脚本 /root/check_site.sh:
#!/bin/bash
cd /www/wwwroot/example || exit 1
find . -type f -print0 | xargs -0 md5sum > /tmp/site_current.md5
diff /root/site_baseline.md5 /tmp/site_current.md5 > /tmp/site_diff.log
if [ -s /tmp/site_diff.log ]; then
echo "网站文件发生改动,时间:$(date)" >> /var/log/site_integrity.log
cat /tmp/site_diff.log >> /var/log/site_integrity.log
fi
赋予执行权限并加入定时任务:
chmod +x /root/check_site.sh
crontab -e
加入一行,例如每天凌晨 3 点检查:
0 3 * * * /root/check_site.sh
之后查看日志:
tail -f /var/log/site_integrity.log
有新增内容时,说明有文件被改动,需要人工确认是正常更新还是异常篡改。
容易踩的坑和判断建议
- 基线文件不要放在被监控目录内,否则每次比对都会把自己算进去。
- 网站正常发版、更新插件后,要重新生成基线,否则会产生大量误报。
- 上传目录、缓存目录、日志目录如果频繁变化,建议先排除,例如在
find后加-path './cache' -prune -o之类的过滤。 - 发现改动后先确认改动时间、文件路径和内容,再决定是否还原,不要直接覆盖。
- 如果服务器上有多个站点,建议每个站点单独建基线和日志,便于定位。
验证监控是否生效
可以主动制造一次小改动来测试:
echo "test" >> /www/wwwroot/example/test.txt
/root/check_site.sh
tail /var/log/site_integrity.log
如果日志里出现 test.txt 相关差异,说明监控链路正常。
测试完成后删除该文件,并重新生成基线。
判断标准:日志无输出代表文件未变;
日志出现差异行,代表有文件内容或文件列表发生变化,需要人工核对。
常见疑问:
md5sum 能发现所有入侵吗? 不能。
它能发现内容改动,但无法判断改动是否恶意,需要结合访问日志、进程和文件内容一起分析。
网站文件很多会不会很慢? 文件数量大时计算会占用一定 CPU,建议放在低峰期执行,并排除缓存和日志目录。
能不能用其他算法? 可以,sha256sum 强度更高,但计算更慢;
日常监控用 md5sum 已经能发现改动。
发现文件被改怎么办? 先备份当前文件,再对比版本库或备份还原,最后排查入口和权限问题。
网站文件完整性校验不是一次性工作,建立基线、定期比对、确认改动,这三步形成习惯后,很多异常能在造成明显影响前被发现。