服务器文件完整性监控,检测系统关键文件被篡改脚本

服务器文件完整性监控,解决的是系统关键文件被篡改后“没人知道”的问题。
比如 /etc/passwd/etc/ssh/sshd_config、网站配置文件被恶意改动,如果只靠人工抽查,很难及时发现。
本文给出一套零基础也能照做的脚本方案:先建立校验基线,再通过定时任务定期比对,文件变化时自动记录并告警。
读完你就能在自己的服务器上部署一个轻量的文件篡改检测工具。

为什么不能只依赖杀毒软件和云平台告警

杀毒软件和云平台的安全告警,主要针对外部攻击和已知漏洞。
而系统关键文件被篡改,可能是入侵留下的后门、管理员误操作,也可能是木马程序偷偷替换了系统命令。
这类问题具有隐蔽性,容易绕过常规安全检测。

本地做文件完整性校验的优势在于:你能亲眼看到哪些文件变了、什么时候变的、内容差值是什么
配合定时任务,就能把监控覆盖到每天、每小时甚至更短周期。

开始前需要准备什么

  • 一台 Linux 服务器,建议使用 CentOS 7+、Ubuntu 18.04+ 或 Debian 10+。
  • 具备 rootsudo 权限。
  • 一个用于接收告警的邮箱或企业微信/钉钉 Webhook,如果只是测试,也可以先查看本地日志。
  • 确认服务器上安装了 md5sumcrontab,这两者在主流 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,如果不一致就写入告警日志。
你也可以自行添加邮件发送命令,比如使用 mailcurl 调用企业微信机器人。

第三步:设置定时任务自动执行

编辑系统 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 恢复原样。

避坑指南:四个最常见的问题

  1. 基线文件被污染:脚本的基线文件一旦丢失或被修改,检测就失去意义。建议把 file_md5.baseline 复制到另一个目录或备份到本地电脑,也可以给它设置特殊权限。
  2. 软链接问题md5sum 检测的是链接指向的目标文件,如果目标路径变化会出现误报。监控路径时建议避开软链接。
  3. 误报干扰:系统更新、程序升级都会改变二进制文件。建议在大型更新后手动刷新基线:重新运行第一步的生成命令,但需要先确认更新来源可信。
  4. 定时任务不执行:检查 crontab 中是否设置了正确的环境变量,脚本是否有执行权限。可以直接运行 crontab -l 查看任务是否存在。

日常如何快速查看结果

除了定时任务,你也可以用一条命令直接查看运行结果:

cat /etc/file_monitor/check_result.log

或者查看最新告警:

tail -n 50 /etc/file_monitor/alert.log

如果告警日志持续增长,说明服务器可能存在异常,需要结合 lastauth.log 或云平台安全快照进一步排查。

对于需要更细粒度监控的生产环境,可以考虑整合 auditdAIDE 这类更专业的工具,但日常防护和快速感知,手写脚本已经足够。
关键在于:建立基线、定期比对、及时告警、定期验证
建议先按本文步骤跑通基础监控,再根据自己的业务补充更多监控目录和告警方式。

如果你在配置过程中遇到基线文件丢失、误报太多或 crontab 不生效,优先检查脚本执行权限和基线文件备份,这两步最容易出问题。
监控脚本部署完成后,务必保留一份离线基线,并在每周安全检查时手动触发一次,确认监控链路没有失效。

分享到:
上一篇
公网扫描器批量探测Open‑WebUI未鉴权实例威胁现状
下一篇
反向代理缓存投毒漏洞,Nginx
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意