应使用stat -c "%a %u:%g"提取权限与属主属组,结合预设基线比对;需同步检查特殊权限位(%a)、selinux上下文(%c)及acl,避免仅依赖数字权限判断。

直接用 stat 命令自动化核对 /etc/passwd 等核心文件的权限合规度,关键在于精准提取、结构化比对、安全反馈,而不是手动逐条看输出。它不依赖外部工具,适合嵌入巡检脚本或 CI/CD 流程。
/etc/passwd、/etc/shadow 等文件的基线权限必须明确且固定
这些文件不是“大概差不多”就行,而是有强安全语义:
-
/etc/passwd:需全局可读(644),但禁止其他用户写入或执行,属主必须是 root -
/etc/shadow:仅 root 可读写(600),属主属组都应为 root;少数发行版允许 640 + 属组 shadow,但前提是普通用户不在该组内 -
/etc/group:通常 644,高敏环境可设为 640 -
/etc/sudoers:严格限定为 440(root:root),禁用 world-writable 或宽泛组写权限
用 stat 提取权限、属主、属组并一键比对stat -c "%a %U:%G" /etc/passwd 输出形如 644 root:root,格式统一、无冗余,适合作为比对基准。
可批量检查多个文件:
for f in /etc/passwd /etc/shadow /etc/group /etc/sudoers; do [[ -e "$f" ]] && echo "$(stat -c "%a %U:%G" "$f") $f" done
再结合预设基线数组(如 Bash 脚本中)做条件判断:
-
[[ $(stat -c "%a" /etc/shadow) != "600" ]] && echo "/etc/shadow 权限异常:当前$(stat -c "%a" /etc/shadow),应为600" -
[[ $(stat -c "%U:%G" /etc/passwd) != "root:root" ]] && echo "/etc/passwd 归属异常"
避免只看权限数字,要同步验证上下文
单纯 stat -c "%a" 不足以覆盖全部风险:
- 特殊权限位(SUID/SGID/Sticky)可能被忽略:加
-c "%A"查看符号权限,确认无s或t意外出现(如/etc/passwd出现-rwsr--r--就危险) - SELinux 启用时,上下文错误会导致权限实际不生效:用
stat -c "%C" /etc/shadow查看安全上下文,比对matchpathcon /etc/shadow的预期值 - 若系统启用 ACL,
stat不显示扩展权限:需配合getfacl -p /etc/shadow | head -3快速抽检,防止单纯 chmod 覆盖默认 ACL
集成到日常自动化流程更有效
把 stat 核查变成可审计、可触发的动作:
- 写入 cron 每日运行:
0 2 * * * /usr/local/bin/check-core-perms.sh >> /var/log/perm-audit.log 2>&1 - 输出带时间戳和风险等级:
[$(date +%F_%H:%M)] CRITICAL: /etc/shadow perm=644 ≠ 600 - 配合
diff或grep -v实现基线偏离自动告警,不自动修复(人工复核后再操作) - 在 Ansible 或 Salt 执行前插入校验步骤,失败则中断部署,避免带错误权限上线
不复杂但容易忽略:stat 结果稳定可靠,但必须搭配明确基线和上下文验证,否则只是“看起来合规”。











