安全加固脚本聚焦“捕获变化+留痕可查+快速响应”,通过inotifywait实时监控/etc/shadow、/etc/sudoers、/root/.ssh等高危目录权限变更,结合基线比对生成带时间戳的差异报告并自动告警推送。

用安全加固脚本定期扫描关键目录权限变更,核心是“捕获变化 + 留痕可查 + 快速响应”,不是每次全量重扫,而是聚焦谁改了、改了哪、何时改、是否合规这四个问题。重点不在发现所有权限错误,而在第一时间感知异常变动。
哪些目录必须纳入变更监控范围
不是所有目录都值得实时盯防,优先锁定攻击者常篡改、系统启动强依赖、且权限宽松即高危的路径:
- /etc/shadow、/etc/gshadow:权限应为600,属主root:root;一旦变为644或出现其他用户可读,极可能已被窃取密码哈希
- /etc/sudoers 及 /etc/sudoers.d/:必须440且仅root可写;chmod 600或chown nobody:nobody是典型后门信号
- /root/.ssh/:目录700、私钥600;若被设为755或属组变成wheel,说明有人试图横向提权
- /var/log/auth.log、/var/log/secure:日志文件应为640,若变为666或属主非root,大概率是清除痕迹前奏
- /tmp 和 /var/tmp:必须含sticky bit(1777);若被移除,意味着普通用户可删改他人临时文件,易被用于本地提权
用 inotifywait 实现轻量级实时变更记录
不依赖复杂Agent,用系统自带 inotifywait 即可完成秒级捕获。生产环境推荐精简监听,避免资源耗尽:
- 只监控具体文件或最小必要目录,例如:
inotifywait -m -e attrib,move_self,delete_self /etc/shadow /etc/sudoers /root/.ssh/ - 输出带时间戳和事件类型,追加到专用日志:
echo "$(date '+%F %T') [ATTRIB] /etc/shadow → $(stat -c '%a %U:%G' /etc/shadow)" >> /var/log/perm-change.log - 用chattr +a锁定日志文件,防止被覆盖或清空:
chattr +a /var/log/perm-change.log
结合基线比对生成每日变更报告
光记“变了”不够,要判断“变对没”。每天定时执行一次基线校验脚本,输出结构化差异:
- 定义标准权限数组(如
BASELINE=("/etc/shadow 600 root root" "/etc/sudoers 440 root root")) - 遍历比对:
stat -c "%a %U %G" $pathvs 基线值,仅当不一致时记录到/var/log/perm-diff-$(date +%F).log - 报告内容包含三列:路径|当前权限|基线权限|变动时间(从inotify日志中关联提取)
- 用
mail -s "【权限变更日报】$(hostname)" admin@example.com < /var/log/perm-diff-$(date +%F).log自动推送
让记录真正驱动响应动作
日志堆在磁盘上没用,关键是要能触发后续动作:
- 在 inotify 脚本中加入简单判断:若检测到
/etc/shadow权限不是600,立即执行logger -t perm-alert "CRITICAL: /etc/shadow perm changed!"并触发告警 - 将每日diff日志接入SIEM(如ELK或Graylog),设置规则:24小时内同一路径变更≥2次,自动标为“可疑行为”
- 备份原始权限状态:
getfacl -R /etc/shadow > /root/acl-backup-$(date +%F).acl,便于回滚或取证 - 把权限扫描步骤嵌入Ansible Playbook,在每次配置更新后自动校验,失败则中断发布流程

















