服务器文件完整性监控,检测系统关键文件被篡改脚本
服务器文件完整性监控,解决的是系统关键文件被篡改后“没人知道”的问题。
比如 /etc/passwd、/etc/ssh/sshd_config、网站配置文件被恶意改动,如果只靠人工抽查,很难及时发现。
本文给出一套零基础也能照做的脚本方案:先建立校验基线,再通过定时任务定期比对,文件变化时自动记录并告警。
读完你就能在自己的服务器上部署一个轻量的文件篡改检测工具。
为什么不能只依赖杀毒软件和云平台告警
杀毒软件和云平台的安全告警,主要针对外部攻击和已知漏洞。
而系统关键文件被篡改,可能是入侵留下的后门、管理员误操作,也可能是木马程序偷偷替换了系统命令。
这类问题具有隐蔽性,容易绕过常规安全检测。
本地做文件完整性校验的优势在于:你能亲眼看到哪些文件变了、什么时候变的、内容差值是什么。
配合定时任务,就能把监控覆盖到每天、每小时甚至更短周期。
开始前需要准备什么
- 一台 Linux 服务器,建议使用 CentOS 7+、Ubuntu 18.04+ 或 Debian 10+。
- 具备
root或sudo权限。 - 一个用于接收告警的邮箱或企业微信/钉钉 Webhook,如果只是测试,也可以先查看本地日志。
- 确认服务器上安装了
md5sum和crontab,这两者在主流 Linux 发行版中默认自带。
不需要安装额外的入侵检测系统,也不需要买商业安全服务,纯脚本即可完成核心监控。
第一步:建立关键文件校验基线
先把需要监控的文件列表写到一个配置文件中,建议放在 /etc/file_monitor/ 目录下:
mkdir -p /etc/file_monitor
cat > /etc/file_monitor/file_list.txt <<'EOF'
/etc/passwd
/etc/shadow
/etc/group
/etc/sudoers
/etc/ssh/sshd_config
/usr/bin/ssh
/usr/bin/passwd
/usr/sbin/sshd
/etc/my.cnf
EOF
你可以根据实际需要增删路径。
重点监控对象包括:账号相关文件、SSH 配置、系统用户可执行的敏感命令、Web 服务配置等。
然后执行下面的命令生成校验基线:
cd /etc/file_monitor
while read f; do
if [ -e "$f" ]; then
md5sum "$f" >> file_md5.baseline
fi
done < file_list.txt
执行后,/etc/file_monitor/file_md5.baseline 中会记录每个文件的 MD5 值。
这个文件本身就是最重要的校验依据,请通过 chmod 600 file_md5.baseline 限制权限,并最好备份到离线位置。
第二步:编写文件篡改检测脚本
创建检测脚本 /etc/file_monitor/check_integrity.sh:
cat > /etc/file_monitor/check_integrity.sh <<'EOF'
#!/bin/bash
# 文件完整性监控脚本
BASE_DIR="/etc/file_monitor"
BASELINE="$BASE_DIR/file_md5.baseline"
LOG="$BASE_DIR/check_result.log"
ALERT="$BASE_DIR/alert.log"
date "+%Y-%m-%d %H:%M:%S" >> "$LOG"
while read line; do
file=$(echo "$line" | awk '{print $2}')
base_md5=$(echo "$line" | awk '{print $1}')
if [ ! -e "$file" ]; then
echo "[MISSING] $file" >> "$LOG"
echo "文件缺失: $file" >> "$ALERT"
continue
fi
cur_md5=$(md5sum "$file" | awk '{print $1}')
if [ "$base_md5" != "$cur_md5" ]; then
echo "[CHANGED] $file" >> "$LOG"
echo "文件被篡改: $file (基线:$base_md5 当前:$cur_md5)" >> "$ALERT"
fi
done < "$BASELINE"
EOF
chmod +x /etc/file_monitor/check_integrity.sh
脚本逻辑很简单:逐行读取基线文件,对比当前文件的 MD5,如果不一致就写入告警日志。
你也可以自行添加邮件发送命令,比如使用 mail 或 curl 调用企业微信机器人。
第三步:设置定时任务自动执行
编辑系统 crontab:
crontab -e
添加以下内容(每天凌晨 2 点执行一次):
0 2 * * * /etc/file_monitor/check_integrity.sh
如果你希望每 6 小时检查一次,可以写成:
0 */6 * * * /etc/file_monitor/check_integrity.sh
保存后,使用 crontab -l 确认任务已生效。
第四步:验证监控是否真正生效
先手动运行一次脚本,确保没有语法错误:
/etc/file_monitor/check_integrity.sh
然后故意修改一个被监控文件来测试,比如给 /etc/passwd 追加一行测试注释:
echo "# test" >> /etc/passwd
再次运行脚本,并检查告警日志:
cat /etc/file_monitor/alert.log
如果看到类似 文件被篡改: /etc/passwd 的记录,说明检测脚本已经生效。
测试后记得把 /etc/passwd 恢复原样。
避坑指南:四个最常见的问题
- 基线文件被污染:脚本的基线文件一旦丢失或被修改,检测就失去意义。建议把
file_md5.baseline复制到另一个目录或备份到本地电脑,也可以给它设置特殊权限。 - 软链接问题:
md5sum检测的是链接指向的目标文件,如果目标路径变化会出现误报。监控路径时建议避开软链接。 - 误报干扰:系统更新、程序升级都会改变二进制文件。建议在大型更新后手动刷新基线:重新运行第一步的生成命令,但需要先确认更新来源可信。
- 定时任务不执行:检查 crontab 中是否设置了正确的环境变量,脚本是否有执行权限。可以直接运行
crontab -l查看任务是否存在。
日常如何快速查看结果
除了定时任务,你也可以用一条命令直接查看运行结果:
cat /etc/file_monitor/check_result.log
或者查看最新告警:
tail -n 50 /etc/file_monitor/alert.log
如果告警日志持续增长,说明服务器可能存在异常,需要结合 last、auth.log 或云平台安全快照进一步排查。
对于需要更细粒度监控的生产环境,可以考虑整合 auditd 或 AIDE 这类更专业的工具,但日常防护和快速感知,手写脚本已经足够。
关键在于:建立基线、定期比对、及时告警、定期验证。
建议先按本文步骤跑通基础监控,再根据自己的业务补充更多监控目录和告警方式。
如果你在配置过程中遇到基线文件丢失、误报太多或 crontab 不生效,优先检查脚本执行权限和基线文件备份,这两步最容易出问题。
监控脚本部署完成后,务必保留一份离线基线,并在每周安全检查时手动触发一次,确认监控链路没有失效。