第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的两个核心命令
getfacl: 用于查看文件或目录的ACL权限。getfacl <文件名或目录名>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拥有读写权限,其他用户无任何权限。 - 预期输出:
- 使用
getfacl查看时,应能看到user:alice:r--和user:bob:rw-。 - 以
alice身份只能读取。 - 以
bob身份可以读取和修改。 - 以其他任意普通用户身份(如你自己)无法访问。
- 使用
练习2:目录与默认ACL
- 任务:创建一个共享目录
/shared。设置默认ACL,使得dev组的成员自动拥有对/shared下所有新文件的读写权限。 - 预期输出:
- 在
/shared下创建任意新文件,使用getfacl查看该文件,应能看到默认生成的group:dev:rw-条目(或其有效权限)。 - 属于
dev组的用户可以修改新创建的文件。
- 在
练习3:理解Mask
- 任务:在练习1的基础上,使用
setfacl -m m::r /tmp/testfile.txt修改mask为只读。然后观察用户bob的实际权限是否还能写入文件。 - 预期输出:
- 修改mask后,使用
getfacl查看,user:bob:rw-会显示#effective:r--。 - 用户
bob将无法写入文件,因为其有效权限已被mask限制为只读。
- 修改mask后,使用
5. 常见错误
- 忘记使用递归 (
-R):在为目录设置ACL时,如果没有使用-R选项,那么该权限不会应用到目录内已有的文件和子目录。- 正确做法:对于需要影响已有内容的场景,始终加上
-R。
- 正确做法:对于需要影响已有内容的场景,始终加上
- 混淆默认ACL (
-d) 和普通ACL:使用-d设置的ACL不会立即对当前目录下的现有文件生效。它只对未来在该目录下新创建的文件和目录生效。- 正确做法:如果需要立即影响现有文件,应同时使用
-R和-m。
- 正确做法:如果需要立即影响现有文件,应同时使用
- 忽略Mask的作用:为用户或组设置的权限可能会被Mask“屏蔽”,导致实际权限达不到预期。
- 排查方法:使用
getfacl查看,注意带有#effective:注释的行,那才是最终的有效权限。必要时调整Mask。
- 排查方法:使用
- 文件系统不支持ACL:并非所有文件系统都默认开启ACL支持。常见的如ext4, xfs默认支持。如果使用
setfacl时出现 “Operation not supported” 错误,可能需要挂载时添加acl选项,或检查文件系统类型。 - 清理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...