28·用户与权限高级

ACL 访问控制列表

aclsetfacl

第28课:ACL 访问控制列表

所属模块:用户与权限 课程难度:高级 课程标签:acl, setfacl, 权限控制 相关课程:上一课:umask 默认权限控制 | 下一课:PAM 认证模块

1. 学习目标

完成本课学习后,你将能够:

  • 理解ACL(访问控制列表)的作用和必要性。
  • 熟练使用 getfacl 命令查看文件的ACL规则。
  • 熟练使用 setfacl 命令为文件和目录添加、修改和删除ACL权限。
  • 理解并应用递归ACL(-R)和默认ACL(-d)来管理目录权限。
  • 了解ACL与传统Unix权限的交互关系(mask)。

2. 核心概念

2.1 什么是ACL?

传统的Unix权限模型(属主/属组/其他用户)对于简单场景足够,但当一个文件需要被多个不同用户或组以不同权限访问时,它就显得力不从心了。ACL(Access Control List,访问控制列表) 是POSIX标准提供的更精细、更灵活的权限控制机制。它允许你为任意数量的用户或组独立地设置权限。

通俗比喻:传统权限像是一栋房子的三把钥匙:一把给房东(属主),一把给固定的租客团队(属组),一把给任何路人(其他用户)。而ACL就像是门禁系统的管理员,可以为房东、张三(特定用户)、李四(另一特定用户)、电工(特定组)等每一个人单独设置谁能进、进哪个房间、能做什么。

2.2 ACL的两个核心命令

  1. getfacl: 用于查看文件或目录的ACL权限。
    getfacl <文件名或目录名>
    
  2. setfacl: 用于设置、修改或删除ACL权限。其基本语法是:
    setfacl -m u:<用户名>:<权限> 文件  # 为特定用户设置
    setfacl -m g:<组名>:<权限> 文件    # 为特定组设置
    setfacl -x u:<用户名> 文件         # 删除特定用户的ACL
    

2.3 ACL中的关键概念

  • ACL_USER_OBJ: 文件属主的权限(与传统属主权限同步)。
  • ACL_GROUP_OBJ: 文件属组的权限(与传统属组权限同步)。
  • ACL_USER: 针对额外特定用户设置的ACL条目。
  • ACL_GROUP: 针对额外特定组设置的ACL条目。
  • ACL_MASK重要! 它定义了ACL用户(ACL_USER)、ACL组(ACL_GROUP)以及传统属组(ACL_GROUP_OBJ)所能获得的最大有效权限。所有这些条目的实际权限都是与mask进行逻辑“与”操作后的结果。这保证了即使ACL设置了很高权限,也可以通过mask进行总控。
  • ACL_OTHER: 其他用户的权限(与传统其他用户权限同步)。

3. 代码示例

前提准备:以root用户身份操作,创建测试环境。

# 创建测试用户和组
useradd alice
useradd bob
groupadd dev
usermod -aG dev bob # 将bob加入dev组

# 创建测试目录和文件
mkdir /project
touch /project/design.txt
chown root:dev /project
chmod 770 /project

示例1:基本ACL操作

# 1. 查看当前文件权限(传统权限)
ls -l /project/design.txt
# 输出:-rw-r--r-- 1 root root 0 ... design.txt
# 只有root有读写,其他只有读。

# 2. 查看ACL(信息更详细)
getfacl /project/design.txt
# 输出会显示:
# user::rw-
# group::r--
# other::r--

# 3. 为用户`alice`设置读写权限
setfacl -m u:alice:rw /project/design.txt

# 4. 为组`dev`设置只读权限
setfacl -m g:dev:r /project/design.txt

# 5. 再次查看ACL,观察变化
getfacl /project/design.txt
# 输出会新增:
# user:alice:rw-
# group:dev:r--
# mask::rw- (注意mask的变化)

# 6. 以普通用户alice身份验证权限
su - alice -c “cat /project/design.txt” # 可以读取
su - alice -c “echo ‘alice was here’ >> /project/design.txt” # 可以写入

# 7. 以普通用户bob身份验证权限(bob在dev组中)
su - bob -c “cat /project/design.txt” # 可以读取(符合dev组权限)
su - bob -c “echo ‘bob was here’ >> /project/design.txt” # 会被拒绝!
# 因为mask::rw-,但dev组的实际权限是r--(与mask的rw-做“与”操作后仍是r--)。

示例2:递归与默认ACL

# 1. 创建用于演示的子目录结构
mkdir /project/code
touch /project/code/main.py

# 2. 为`alice`递归设置整个/project目录的读写权限 (-R 表示递归)
setfacl -R -m u:alice:rwx /project

# 3. 验证子文件权限
getfacl /project/code/main.py
# 输出中会包含 user:alice:rwx

# 4. 设置默认ACL (-d 表示default)
# 默认ACL会自动应用到在该目录下新创建的文件和子目录。
setfacl -d -m g:dev:rx /project

# 5. 在/project下创建一个新文件,观察其ACL
touch /project/report.txt
getfacl /project/report.txt
# 输出中会包含:
# user::rw-
# group::r-x  #effective:r-- (因为被mask限制)
# group:dev:rx #default:group:dev:rx
# mask::r-x
# other::r--
# 注意:新文件的属主权限由umask决定,但ACL中的默认条目已自动添加。

4. 实践练习

练习1:基础配置

  • 任务:为文件 /tmp/testfile.txt(先创建它)配置ACL,使得用户alice拥有只读权限,用户bob拥有读写权限,其他用户无任何权限。
  • 预期输出
    1. 使用getfacl查看时,应能看到 user:alice:r--user:bob:rw-
    2. alice身份只能读取。
    3. bob身份可以读取和修改。
    4. 以其他任意普通用户身份(如你自己)无法访问。

练习2:目录与默认ACL

  • 任务:创建一个共享目录 /shared。设置默认ACL,使得dev组的成员自动拥有对/shared下所有新文件的读写权限。
  • 预期输出
    1. /shared下创建任意新文件,使用getfacl查看该文件,应能看到默认生成的group:dev:rw-条目(或其有效权限)。
    2. 属于dev组的用户可以修改新创建的文件。

练习3:理解Mask

  • 任务:在练习1的基础上,使用setfacl -m m::r /tmp/testfile.txt 修改mask为只读。然后观察用户bob的实际权限是否还能写入文件。
  • 预期输出
    1. 修改mask后,使用getfacl查看,user:bob:rw- 会显示 #effective:r--
    2. 用户bob无法写入文件,因为其有效权限已被mask限制为只读。

5. 常见错误

  1. 忘记使用递归 (-R):在为目录设置ACL时,如果没有使用 -R 选项,那么该权限不会应用到目录内已有的文件和子目录。
    • 正确做法:对于需要影响已有内容的场景,始终加上 -R
  2. 混淆默认ACL (-d) 和普通ACL:使用 -d 设置的ACL不会立即对当前目录下的现有文件生效。它只对未来在该目录下新创建的文件和目录生效。
    • 正确做法:如果需要立即影响现有文件,应同时使用 -R-m
  3. 忽略Mask的作用:为用户或组设置的权限可能会被Mask“屏蔽”,导致实际权限达不到预期。
    • 排查方法:使用getfacl查看,注意带有#effective:注释的行,那才是最终的有效权限。必要时调整Mask。
  4. 文件系统不支持ACL:并非所有文件系统都默认开启ACL支持。常见的如ext4, xfs默认支持。如果使用setfacl时出现 “Operation not supported” 错误,可能需要挂载时添加 acl 选项,或检查文件系统类型。
  5. 清理ACL混乱:使用 -b (删除所有扩展ACL) 或 -x (删除指定ACL) 来清理。只用 chmod 无法清除ACL条目。

6. 小结

本节课我们深入学习了ACL访问控制列表,它弥补了传统Unix权限在复杂多用户环境下的不足。

  • 核心工具setfacl 用于设置,getfacl 用于查看。
  • 关键参数-m (修改),-x (删除),-b (清除所有),-R (递归),-d (默认)。
  • 重要机制Mask 是ACL权限的“总闸”,它限制了ACL用户、ACL组和传统属组的最大有效权限。
  • 最佳实践:为公共协作目录设置合理的默认ACL,可以极大地简化权限管理,确保新文件自动继承正确的权限。

ACL是Linux高级权限管理的强大工具,合理使用能让你的系统在安全性和灵活性上达到新的高度。下一课,我们将学习PAM认证模块,探讨如何控制用户登录和访问的更深层次策略。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「PAM 认证模块」 以巩固所学知识。