Linux目录权限需按角色、用途、生命周期分级控制,遵循最小权限、职责分离、可审计、可回滚原则;明确四类目录基线权限,用setfacl实现继承控制,辅以校验脚本和CI/CD集成。

Linux 目录权限分配需兼顾安全与可用性,自动化脚本不是简单 chmod 一把梭,而是按角色、用途、生命周期分级控制。核心原则是:最小权限、职责分离、可审计、可回滚。
明确目录分类与权限基线
先统一划分常见目录类型,再为每类定义默认属主、属组和权限模式:
- /var/log/:属主 root,属组 syslog,权限 750(日志轮转脚本需读写)
- /etc/myapp/:属主 root,属组 myapp-admin,权限 640(配置只读给服务组)
- /opt/myapp/data/:属主 myapp,属组 myapp,权限 750(应用进程读写,同组可查)
- /srv/www/htdocs/:属主 www-data,属组 www-data,权限 755(静态文件,禁止写入)
用 setfacl 实现细粒度继承控制
单纯 chmod 无法满足“新创建文件自动继承组写权限”这类需求,必须启用 ACL 默认规则:
- 对目标目录执行:setfacl -d -m g:myapp:rwx /opt/myapp/data
- 确保父目录已开启 ACL 支持(mount 参数含 acl,如 mount -o remount,acl /)
- 验证是否生效:getfacl /opt/myapp/data | grep "default:"
权限校验与修复脚本模板
以下是一个轻量级检查脚本框架(保存为 check-perms.sh),支持 dry-run 模式:
#!/bin/bash
DRY_RUN=${1:-false}
declare -A rules=(
["/var/log/myapp"]="root:syslog:750"
["/etc/myapp"]="root:myapp-admin:640"
["/opt/myapp/data"]="myapp:myapp:750"
)
for dir in "${!rules[@]}"; do
[[ ! -d "$dir" ]] && continue
IFS=':' read -r owner group mode <<< "${rules[$dir]}"
current_owner=$(stat -c "%U" "$dir")
current_group=$(stat -c "%G" "$dir")
current_mode=$(stat -c "%a" "$dir")
if [[ "$current_owner" != "$owner" || "$current_group" != "$group" || "$current_mode" != "$mode" ]]; then
echo "[WARN] $dir: expected $owner:$group:$mode, got $current_owner:$current_group:$current_mode"
if [[ "$DRY_RUN" == "false" ]]; then
chown "$owner:$group" "$dir" 2>/dev/null
chmod "$mode" "$dir" 2>/dev/null
echo " → fixed"
fi
fi
done
使用方式:./check-perms.sh(仅检查)或 ./check-perms.sh live(执行修复)
集成进部署流程的关键点
权限脚本不能孤立运行,需嵌入 CI/CD 或配置管理链路:
- Ansible 中用 file 模块声明式定义,避免 shell 脚本硬编码
- 在 systemd service 文件中设置 UMask=0027,确保进程创建的文件默认不开放给 others
- 所有权限变更操作记录到 auditd(如 -w /etc/myapp -p wa -k myapp-config)
- 定期用 find /opt/myapp -type d ! -perm 750 扫描越权目录,纳入监控告警


















