md5sum文件完整性监控脚本,检测文件改动告警
服务器上的核心配置文件、网站入口文件或脚本,一旦被意外修改或恶意替换,单靠肉眼很难及时发现。
md5sum 文件完整性监控脚本的核心思路是:先为关键文件生成一份 MD5 基准清单,之后定时重新计算并对比,发现不一致就触发告警。
本文面向零基础用户,从基准生成、脚本编写、定时执行到告警验证,给出可直接照做的步骤。
适用场景与准备条件
这套方案适合监控网站根目录、Nginx 配置、SSH 配置、计划任务等不常变动但很关键的文件。
它检测的是内容是否被改动,不能替代杀毒或入侵检测系统,但胜在轻量、易部署。
动手前确认环境满足以下条件:
- Linux 服务器,已安装
md5sum,绝大多数发行版默认自带,可用md5sum --version确认; - 有可用的
cron服务,用于定时执行校验; - 准备一个存放基准文件和日志的目录,例如
/opt/fim; - 告警方式可选:写入日志、发送邮件,或对接企业微信、钉钉机器人。
先创建目录结构:
mkdir -p /opt/fim
mkdir -p /opt/fim/logs
生成文件指纹基准清单
监控的前提是有一份“正确状态”的参照。
把需要保护的文件或目录列成一个清单,再批量生成 MD5 值。
新建监控列表文件 /opt/fim/files.list:
/etc/passwd
/etc/ssh/sshd_config
/etc/nginx/nginx.conf
/var/www/html/index.php
生成基准清单,逐行读取文件路径并计算 MD5:
while read -r f; do
[ -f "$f" ] && md5sum "$f"
done < /opt/fim/files.list > /opt/fim/baseline.md5
查看结果确认格式为“MD5 值 + 两个空格 + 文件路径”:
cat /opt/fim/baseline.md5
基准文件生成后应立即备份到安全位置,并设置为只有 root 可读,否则攻击者篡改文件后再更新基准,监控就失去意义:
chmod 600 /opt/fim/baseline.md5
编写校验与告警脚本
脚本要做三件事:重新计算当前 MD5、与基准对比、把差异写入日志并触发告警。
创建 /opt/fim/check.sh:
#!/bin/bash
BASELINE="/opt/fim/baseline.md5"
LOGFILE="/opt/fim/logs/fim.log"
TMP="/opt/fim/current.md5"
# 重新计算当前指纹
while read -r f; do
[ -f "$f" ] && md5sum "$f"
done < /opt/fim/files.list > "$TMP"
# 对比基准与当前结果
DIFF=$(diff "$BASELINE" "$TMP")
if [ -n "$DIFF" ]; then
echo "[$(date '+%F %T')] 检测到文件改动:" >> "$LOGFILE"
echo "$DIFF" >> "$LOGFILE"
# 邮件告警示例,按实际环境修改收件人
echo "$DIFF" | mail -s "文件完整性告警" admin@example.com
else
echo "[$(date '+%F %T')] 校验通过,无改动" >> "$LOGFILE"
fi
赋予执行权限:
chmod +x /opt/fim/check.sh
判断条件很明确:diff 输出为空代表文件未被改动,
输出不为空代表至少有一个文件内容发生变化。 邮件命令需要系统已配置好邮件服务,
没有的话可以先只保留日志,
后续再接入钉钉或企业微信机器人。
配置定时任务与告警验证
用 cron 让脚本按固定频率自动运行。
编辑当前用户计划任务:
crontab -e
加入一行,表示每小时整点执行一次:
0 * * * * /bin/bash /opt/fim/check.sh
保存后确认任务已写入:
crontab -l
验证监控是否真的生效,手动制造一次改动:
echo "# test" >> /etc/nginx/nginx.conf
/opt/fim/check.sh
tail -n 10 /opt/fim/logs/fim.log
日志中出现“检测到文件改动”并列出对应文件,说明脚本工作正常。
确认后把测试改动还原,并重新生成基准清单。
容易踩的坑
- 基准文件权限过松:
baseline.md5若被普通用户可写,监控形同虚设,务必设为600并归属 root。 - 文件路径含空格:
md5sum输出用两个空格分隔,路径带空格会导致对比错位,建议监控列表不要包含带空格的文件。 - 新增或删除文件未处理:本脚本只对比清单内文件,新增文件不会触发告警,需要定期维护
files.list。 - 邮件发不出去:多数云服务器默认未开 25 端口,
mail命令会静默失败,建议优先接入 webhook 告警。 - cron 环境变量缺失:脚本中尽量使用绝对路径,避免因 PATH 不同导致命令找不到。
常见疑问
监控频率设多少合适? 配置文件类建议每小时或每天一次;
对安全性要求高的核心文件可缩短到 5 至 10 分钟,但要评估服务器负载。
md5sum 和 sha256sum 选哪个? 两者用法一致,sha256sum 抗碰撞能力更强,新部署建议优先使用,只需把脚本中的命令替换即可。
误报太多怎么办? 日志、缓存、临时文件会频繁变动,不要纳入监控列表,只保留稳定且关键的文件。
能监控整个目录吗? 可以,用 find /path -type f -exec md5sum {} \; 生成清单,但文件量大时对比耗时会明显增加。
整套方案的落地顺序就是:列出关键文件、生成基准、编写校验脚本、挂上 cron、制造改动验证告警。
跑通之后,再根据实际环境把邮件告警换成更稳定的机器人通知即可。