最高效acl审计方法是先用find筛选权限含“+”标记的文件,再批量调用getfacl精准分析,避免全盘遍历;需加-xdev限制本文件系统,区分实际acl规则与空+标记,并关注default acl和mask有效性。

直接用 find 配合 getfacl 审计全盘 ACL 文件,关键不是“找所有文件再挨个查”,而是先缩小范围、再精准识别——因为绝大多数文件没有 ACL,盲目遍历极耗资源且结果难读。
只扫描带 ACL 标记的文件(最快最准)
Linux 文件系统在权限字段末尾加 + 表示存在 ACL(或扩展属性)。这是内核级标记,比逐个调用 getfacl 快几个数量级。
- 用 find 查所有权限含 + 的项:
find / -xdev -type f -perm /0001 -ls 2>/dev/null | grep '+' - 更严谨写法(排除设备/proc/sys等不可访问路径):
find / -xdev -type f -printf '%M %p\n' 2>/dev/null | awk '$1 ~ /\+/ {print $2}' - 拿到路径后批量查看 ACL:
find / -xdev -type f -printf '%M %p\n' 2>/dev/null | awk '$1 ~ /\+/ {print $2}' | xargs -r getfacl 2>/dev/null
按目录递归检查并过滤有效 ACL 条目
有些文件虽有 +,但 ACL 实际为空(比如只有默认 mask,无额外 user/g 等规则)。这时需用 getfacl 输出判断是否真有自定义规则。
- 对目标目录(如 /home 或 /var/www)执行:
find /home -xdev -type d -name ".*" -prune -o -type f -perm /0001 -print0 2>/dev/null | xargs -0 getfacl 2>/dev/null | awk '/^# file:/ {f=$3; next} /^user:[^:]*:[rwx-]+$/ || /^group:[^:]*:[rwx-]+$/ {if (f) print f; f=""}' | sort -u - 说明:该命令只输出真正含非属主/属组的 user:xxx 或 group:xxx 规则的文件路径,跳过纯基础权限+的干扰项。
导出完整 ACL 清单用于人工复核或合规存档
审计不止是“有没有”,还要留痕。建议将结果结构化保存。
- 生成带时间戳的完整报告:
echo "== ACL Audit Report $(date) ==" > /tmp/acl-report-$(date +%F).log<br>find / -xdev -type f -perm /0001 -print0 2>/dev/null | xargs -0 -I{} sh -c 'echo "--- {} ---"; getfacl "{}" 2>/dev/null; echo' >> /tmp/acl-report-$(date +%F).log - 后续可 grep 关键词快速定位风险项:
grep -A5 "user:root:rwx\|other::rwx" /tmp/acl-report-*.log(查高危宽松权限)grep -A3 "d:u:" /tmp/acl-report-*.log(查默认 ACL,常被忽略)
避开常见陷阱
实际运维中这几个点最容易导致漏报或误报:
- 不加 -xdev:find 默认跨挂载点,可能卡在 /proc /sys /dev 或 NFS 挂载点,加 -xdev 限定本文件系统
-
忽略默认 ACL:目录的 default:xxx 不会体现在文件权限+上,但影响新建文件。要单独查目录:
find / -xdev -type d -perm /0001 -exec getfacl {} \; 2>/dev/null | grep -A10 "^default:" - mask 覆盖权限:getfacl 输出中 mask::xxx 是 ACL 有效权限上限。即使设了 u:alice:rwx,若 mask::r--,alice 实际只有读权限——审计时必须连 mask 一起看











