3.7.3 ACL原理与使用

3.7.3 ACL原理与使用#

ACL(Access Control List)用于在传统“属主/属组/其他”模型之外,为单个用户或组设置细粒度权限。适合共享目录、外包账号、审计最小权限等场景。

ACL原理草图(权限计算链路)

文章图片

核心概念与规则
- 访问ACL(Access ACL):作用于现有对象。
- 默认ACL(Default ACL):仅作用于目录,作为新建文件/子目录模板。
- mask:限制除属主外所有ACL条目的最大权限。
- effective权限 = 条目权限 ∩ mask。


1) 环境准备与安装#

常用工具getfaclsetfacl(来自 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) 实战练习#

  1. 创建 /data/share,让用户 bob 可读写,组 ops 可读,其他用户无权限。验证 bob 可创建文件,其他用户不可。
  2. /data/share 设置默认ACL,使新建文件自动给 ops 组读权限。
  3. /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,防止权限错乱。