关键在于可靠保存原始状态而非比对:需用绝对路径将哈希存至只读安全路径(如/var/log/config-md5/),加时间戳与主机标识,立即chattr +i锁定;校验时用md5sum -c并显式判断退出码,配合cron定时执行独立脚本。

用 md5sum 生成并保存基准哈希值
关键不是“比对”,而是先可靠地存下原始状态。直接对 /etc/passwd 这类文件运行 md5sum /etc/passwd 得到的只是当前快照,必须持久化存储——且不能存在被篡改风险的路径(比如不能放 /tmp 或同分区下易写位置)。推荐做法是:用只读权限存到 /var/log/config-md5/(需提前 mkdir -p /var/log/config-md5 并 chown root:root + chmod 600)。
实操建议:
- 用绝对路径调用
md5sum,避免 PATH 被污染导致执行假命令:/usr/bin/md5sum /etc/passwd /etc/ssh/sshd_config > /var/log/config-md5/baseline.md5 - 加时间戳和主机标识,方便溯源:
echo "# $(date -Iseconds) $(hostname)" > /var/log/config-md5/baseline.md5 && /usr/bin/md5sum /etc/passwd /etc/ssh/sshd_config >> /var/log/config-md5/baseline.md5 - 首次生成后立即
chattr +i /var/log/config-md5/baseline.md5(需 root),防止被覆盖或删除——后续更新需先chattr -i
用 md5sum -c 批量校验并捕获差异
md5sum -c 是唯一能批量比对且返回标准退出码的方案。它读取 .md5 文件中的路径+哈希,逐个计算并比对,输出 OK 或 FAILED。退出码为 0 表示全部通过,1 表示部分失败,2 表示读取错误(如路径不存在、权限不足)。
常见错误现象:脚本里写 if md5sum -c baseline.md5; then ...,但一旦某文件被删或权限变,md5sum -c 返回 2,shell 默认不触发 else 分支,导致误判为“无异常”。
实操建议:
- 显式判断退出码:
if /usr/bin/md5sum -c /var/log/config-md5/baseline.md5 2>/dev/null | grep -q ': FAILED$'; then echo "ALERT: config modified"; fi - 把校验结果重定向到临时文件再解析,避免
grep漏掉 stderr 中的错误提示:/usr/bin/md5sum -c /var/log/config-md5/baseline.md5 2>&1 > /tmp/md5check.out,再检查/tmp/md5check.out是否含FAILED或No such file - 校验前加
test -r /var/log/config-md5/baseline.md5 || { echo "baseline missing"; exit 1; },防基线文件本身不可读
用 cron 定时执行但避开权限与环境陷阱
crontab 默认以用户环境运行,PATH 很短(常不含 /usr/sbin),且不加载 shell 配置。直接写 md5sum 可能报 command not found;用 sudo 在 cron 里又会卡在密码输入。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
使用场景:必须用 root 权限读取 /etc/shadow 等敏感文件,且校验脚本本身不能被普通用户修改。
实操建议:
- 把完整校验逻辑写成独立脚本(如
/usr/local/bin/check-config-integrity.sh),开头加#!/bin/bash,所有命令用绝对路径 - 给脚本加权:
chmod 700 /usr/local/bin/check-config-integrity.sh,属主设为 root - 编辑 root 的 crontab:
sudo crontab -e,写入:0 3 * * * /usr/local/bin/check-config-integrity.sh >> /var/log/config-integrity.log 2>&1(每天 3 点执行) - 不要在脚本里用
source ~/.bashrc或依赖$HOME,cron 下$HOME是/root,但可能没初始化
注意 md5sum 的局限性与替代选择
MD5 已不抗碰撞,但用于检测非恶意篡改(如配置误操作、脚本误覆盖)仍足够——攻击者若能改配置,通常也能删日志或替换校验脚本,此时换 SHA256 也无实质提升。
性能影响几乎为零,但兼容性要注意:某些嵌入式 Linux(如 OpenWrt)默认没装 md5sum,得用 busybox md5sum 或改用 sha256sum(更通用)。
容易被忽略的点:
- 文件末尾换行符变化(如手动编辑后多按一次回车)会导致哈希改变,属于真实变更,不是误报
-
/etc/passwd被usermod修改时,时间戳和内容都变,但md5sum会如实反映——这正是你要的 - 如果配置文件是符号链接,
md5sum默认计算链接目标内容;要校验链接路径本身是否被替换,得额外加ls -l快照










