要监控特权文件的动态增量变动,必须结合时间锚点或事件机制:用 -newer 或 -cnewer 捕获自基线以来新增或权限变更的文件,或用 inotifywait -e attrib 实时监听 ctime 更新并配合 find 过滤,辅以基线比对脚本实现自动化。

直接用 find -type f \( -perm -4000 -o -perm -2000 \) 无法实现“自动化监控增量”,它只是快照式扫描,不记录状态、不比对差异、也不触发响应。要真正监控特权文件(如 setuid/setgid 程序)的**动态变动增量**,必须结合时间锚点或事件机制——核心思路是:先固化一个基线,再定期或实时捕获比该基线“新出现”或“权限变更”的文件。
用 -newer 捕获新增/更新的特权文件(推荐轻量方案)
这是最实用、无需额外依赖的方法,适合定时任务或变更后快速核查:
- 先创建时间锚点:
touch /tmp/priv_anchor.$(date +%s)(建议加时间戳避免覆盖) - 执行高危操作(如部署、升级、脚本运行)或等待观察窗口
- 再运行查找命令,只看比锚点新的特权文件:
find /usr /bin /sbin /opt -type f \( -perm -4000 -o -perm -2000 \) -newer /tmp/priv_anchor.1747972800 2>/dev/null - 结果即为“自锚点创建以来新增或修改过权限的特权文件”,天然排除旧有稳定项
用 inotifywait 实时监听特权目录的权限变更(需调优)
若需秒级响应(如安全值守场景),inotify 是唯一内核级实时方案,但不能直接监听“权限变化”事件本身,而要监听 chmod/chown 等操作触发的 ctime 更新:
- 确保内核参数已调大:
echo 524288 | sudo tee /proc/sys/fs/inotify/max_user_watches - 监听关键目录的元数据变更(
attrib事件对应 ctime 更新):inotifywait -m -r -e attrib /usr/bin /usr/sbin /bin /sbin --format '%w%f %T' --timefmt '%Y-%m-%d %H:%M:%S' - 收到事件后,立即用 find 过滤出确实是特权文件的条目:
find "$file" -type f \( -perm -4000 -o -perm -2000 \) -printf '%M %p\n' 2>/dev/null - 注意:单次 inotifywait 不阻塞,可嵌入 while 循环做校验,避免误报
构建最小可行监控脚本(含基线比对)
把“锚点 + find”封装成可复用逻辑,避免人工干预:
- 首次运行生成基线清单(含路径和权限):
find /usr /bin /sbin -type f \( -perm -4000 -o -perm -2000 \) -printf '%M %p\n' | sort > /var/log/priv_baseline.txt - 后续运行对比当前状态与基线差异:
find /usr /bin /sbin -type f \( -perm -4000 -o -perm -2000 \) -printf '%M %p\n' | sort | diff -u /var/log/priv_baseline.txt - | grep '^+' | grep -v '^+++' - 输出带
+的行即为新增或权限变更的文件,可配合 mail 或 logger 推送
关键提醒与避坑点
这些细节决定监控是否真正有效:
-
-perm -4000匹配 setuid,-perm -2000匹配 setgid;不要写成-perm /4000(那是“任意一位匹配”,会误报) - 特权文件通常集中在
/usr/bin、/usr/sbin、/bin、/sbin,不建议扫全盘(慢且干扰多) -
find ... -newer依赖文件 mtime/ctime,而 chmod 只改 ctime —— 若需捕获纯权限变更,请用-cnewer替代-newer - 生产环境慎用
inotifywait -r扫描整个/usr,子目录过多易超max_user_watches,应限定具体 bin 目录 - 所有涉及
/etc、/usr的 find 或 inotify 操作,普通用户无权限,务必用 root 或 sudo











