3.7.3 ACL原理与使用
3.7.3 ACL原理与使用#
ACL(Access Control List)用于在传统“属主/属组/其他”模型之外,为单个用户或组设置细粒度权限。适合共享目录、外包账号、审计最小权限等场景。
ACL原理草图(权限计算链路)
核心概念与规则
- 访问ACL(Access ACL):作用于现有对象。
- 默认ACL(Default ACL):仅作用于目录,作为新建文件/子目录模板。
- mask:限制除属主外所有ACL条目的最大权限。
- effective权限 = 条目权限 ∩ mask。
1) 环境准备与安装#
常用工具:getfacl、setfacl(来自 acl 包)
# Debian/Ubuntu
sudo apt-get update
sudo apt-get install -y acl
# RHEL/CentOS/Rocky
sudo yum install -y acl
# 验证命令是否可用
getfacl --version
检查文件系统与挂载
# 查看挂载参数是否包含 acl
mount | grep -E ' /data |acl'
# 临时启用(无需重启)
sudo mount -o remount,acl /data
# 永久启用(/etc/fstab 示例)
# /dev/vdb1 /data ext4 defaults,acl 0 0
2) 基础示例:为用户/组设置ACL#
场景:目录 /data/project 让 alice 可读写,组 dev 可读执行。
# 1. 创建目录与用户/组(示例)
sudo mkdir -p /data/project
sudo groupadd dev
sudo useradd -m alice
sudo usermod -aG dev alice
# 2. 设置访问ACL
sudo setfacl -m u:alice:rw- /data/project
sudo setfacl -m g:dev:r-x /data/project
# 3. 查看ACL与解释
getfacl /data/project
getfacl 输出要点解释
user::rwx # 属主权限
user:alice:rw- # alice 的ACL条目
group::r-x # 属组权限
group:dev:r-x # dev 组ACL条目
mask::r-x # 掩码,限制除属主外最大权限
other::--- # 其他用户权限
3) mask 影响与调整示例#
现象:给 alice 赋予 rwx,但实际变成 r-x。
sudo setfacl -m u:alice:rwx /data/project
getfacl /data/project | grep -E 'alice|mask'
# 输出可能为:
# user:alice:rwx
# mask::r-x
# 修改 mask 以放开写权限
sudo setfacl -m m:rwx /data/project
getfacl /data/project | grep -E 'alice|mask'
命令解释
- -m u:alice:rwx:新增/修改 ACL 条目。
- -m m:rwx:修改 mask(掩码)。
4) 默认ACL与继承示例#
场景:团队目录新建文件自动继承权限。
# 为目录设置默认ACL
sudo setfacl -m d:u:alice:rwX -m d:g:dev:r-x /data/project
# 新建文件/目录验证继承
sudo -u alice touch /data/project/a.txt
sudo -u alice mkdir /data/project/subdir
getfacl /data/project/a.txt
getfacl /data/project/subdir
说明:X 表示仅对目录或已有执行权限的文件赋予执行位。
5) 递归设置与清理#
# 递归赋予 dev 组对项目读执行权限
sudo setfacl -R -m g:dev:r-x /data/project
# 删除某个ACL条目
sudo setfacl -x u:alice /data/project
# 清空ACL(保留基础权限位)
sudo setfacl -b /data/project
6) 与传统权限的关系与识别#
ls -l /data | grep project
# 结果示例:
# drwxr-x---+ 2 root dev 4096 ... project
# ^ + 表示存在ACL
7) 故障排查#
问题1:ACL设置后权限不生效
- 检查 mask 是否限制:
getfacl /data/project | grep mask
- 修复:
sudo setfacl -m m:rwx /data/project
问题2:默认ACL不继承
- 确认目标为目录且已设置默认ACL:
getfacl /data/project | grep default
- 确认文件系统支持 ACL 且挂载带 acl:
mount | grep /data
问题3:权限显示正常但访问仍失败
- 检查父目录权限和执行位(x):
namei -l /data/project
8) 实战练习#
- 创建
/data/share,让用户 bob 可读写,组 ops 可读,其他用户无权限。验证 bob 可创建文件,其他用户不可。 - 为
/data/share设置默认ACL,使新建文件自动给 ops 组读权限。 - 将
/data/share全部清空 ACL 并恢复为传统权限750,验证权限变化。
参考命令框架
sudo mkdir -p /data/share
sudo useradd -m bob
sudo groupadd ops
sudo usermod -aG ops bob
sudo chmod 750 /data/share
sudo setfacl -m u:bob:rw- -m g:ops:r-- /data/share
sudo setfacl -m d:g:ops:r-- /data/share
getfacl /data/share
9) 小结与最佳实践#
- 共享目录优先使用默认ACL统一权限策略。
- 变更前先备份ACL:
getfacl -R /data/project > /tmp/acl.bak - 避免对系统目录递归设置 ACL,防止权限错乱。