核心思路是生成基准快照→定期重扫→差异比对→通知或记录;用sha256sum生成指纹快照,脚本比对diff变动,cron每日执行,辅以排除规则和日志邮件告警。

定期比对 /etc 目录下的文件变动,核心思路是:**生成基准快照 → 定期重新扫描 → 差异比对 → 通知或记录**。不依赖 GUI 工具,纯命令行 + cron 即可稳定运行。
1. 用 sha256sum 生成文件指纹快照
相比 ls -lR 或 find -mtime,哈希校验能准确识别内容修改、权限变更、属主变化(需加 -c 参数)。
执行一次生成初始快照(建议存到安全位置,如 /var/log/etc-snapshot/):
sudo mkdir -p /var/log/etc-snapshot sudo find /etc -type f -print0 | sudo xargs -0 sha256sum > /var/log/etc-snapshot/etc-$(date +%F).sum sudo ln -sf /var/log/etc-snapshot/etc-$(date +%F).sum /var/log/etc-snapshot/etc-latest.sum
说明:
-
-print0和xargs -0兼容含空格或特殊字符的文件名 - 只扫描普通文件(
-type f),排除目录、设备、符号链接等干扰项 - 软链接
etc-latest.sum方便后续脚本统一读取最新基准
2. 编写比对脚本(例如 /usr/local/bin/check-etc-changes.sh)
该脚本每次运行时,用当前文件重新计算哈希,并与 etc-latest.sum 对比:
#!/bin/bash
SNAPSHOT="/var/log/etc-snapshot/etc-latest.sum"
CURRENT="/tmp/etc-current-$$"
<p>trap 'rm -f "$CURRENT"' EXIT</p><h1>生成当前哈希列表(保持与快照相同顺序和格式)</h1><p>find /etc -type f -print0 | xargs -0 sha256sum > "$CURRENT"</p><h1>比对并提取变动行(新增、删除、哈希不同)</h1><p>diff -u "$SNAPSHOT" "$CURRENT" | grep -E '^[+-][^+\]|^\ No' | grep -v '^+++|^---' > /tmp/etc-diff-$$</p><p>if [ -s /tmp/etc-diff-$$ ]; then
echo "【警告】/etc 下发现文件变动 $(date)" | mail -s "etc change alert" root
cat /tmp/etc-diff-$$ >> /var/log/etc-changes.log
logger "etc changes detected: $(wc -l /tmp/etc-diff-$$ | awk '{print $1}') files"
fi</p>说明:
- 使用
diff -u能清晰区分新增(+)、删除(-)、修改(前后均有但哈希不同) -
logger写入系统日志,便于journalctl -t kernel或rsyslog统一收集 - 邮件发给
root,确保管理员及时知晓(需配置本地 MTA,如ssmtp或msmtp)
3. 用 cron 每日自动执行
编辑 root 的 crontab:
sudo crontab -e # 添加一行: 0 3 * * * /usr/local/bin/check-etc-changes.sh >/dev/null 2>&1
说明:
- 每天凌晨 3 点执行,避开业务高峰
- 输出重定向避免 cron 邮件刷屏;真正告警走脚本内的
mail命令 - 快照建议每周轮换一次(可用
find /var/log/etc-snapshot -name 'etc-*.sum' -mtime +7 -delete加入维护任务)
4. 进阶建议:规避常见误报
某些文件天然会变,需在 find 中排除:
-
/etc/machine-id、/etc/shadow-(备份文件)、/etc/mtab(若为软链则忽略) - 动态生成的配置:如
/etc/systemd/system/*.wants/下的符号链接 - 可改用
find /etc -type f ! -path "/etc/machine-id" ! -path "/etc/shadow-*" -print0 - 若用
aide(高级入侵检测工具),它原生支持规则白名单、压缩数据库、增量检查,适合生产环境长期部署










