访问控制列表
访问控制列表 (ACL) 为文件系统提供了一种额外且更灵活的权限机制。它旨在辅助 UNIX 文件权限。ACL 允许您为任何用户或组授予对任何磁盘资源的权限。
安装
启用 ACL
诸如 Btrfs, Ext4, 或 XFS 等文件系统默认启用 POSIX ACL 支持;只要内核支持已编译进去,通常不需要显式的挂载选项。可以通过运行以下命令验证
$ zgrep POSIX_ACL /proc/config.gz
虽然需要内核支持(例如 CONFIG_EXT4_FS_POSIX_ACL=y),但文件系统的挂载行为决定了它在运行时是否激活。对于 Btrfs 和 XFS,此行为是硬编码的。对于 Ext4,ACL 默认通过文件系统的超级块选项(在 mkfs 期间设置)启用。使用以下命令检查 ext2/3/4 格式分区的该选项
# tune2fs -l /dev/sdXY | grep "Default mount options:"
Default mount options: user_xattr acl
同时检查默认挂载选项是否被覆盖,在这种情况下,您将在 /proc/mounts 的相关行中看到 noacl。
您可以使用 tune2fs -o option partition 命令设置文件系统的默认挂载选项,例如
# tune2fs -o acl /dev/sdXY
使用默认挂载选项而不是在 /etc/fstab 中添加条目对于外部驱动器非常有用,这样该分区在其他 Linux 机器上挂载时也会带有 acl 选项。无需在每台机器上编辑 /etc/fstab。
- 在创建 ext2/3/4 文件系统时,
acl被指定为默认挂载选项。这在/etc/mke2fs.conf中配置。 - 默认挂载选项不会列在
/proc/mounts中。
用法
设置 ACL
可以使用 setfacl 命令修改 ACL。
- 您可以通过添加
--test标志来列出文件/目录的权限变更而不实际修改权限(即dry-run 模拟运行)。 - 要递归地将操作应用于所有文件和目录,请添加
-R/--recursive参数。
为用户设置权限(user 为用户名或 ID)
# setfacl -m "u:user:permissions" <file/dir>
为组设置权限(group 为组名或 ID)
# setfacl -m "g:group:permissions" <file/dir>
为其他人设置权限
# setfacl -m "other:permissions" <file/dir>
允许所有新创建的文件或目录继承父目录的条目(这将不会影响移动到该目录的文件)
# setfacl -dm "entry" <dir>
删除特定条目
# setfacl -x "entry" <file/dir>
删除默认条目
# setfacl -k <file/dir>
删除所有条目(所有者、组和其它的条目将保留)
# setfacl -b <file/dir>
-n (--no-mask) 选项,否则 setfacl 会自动重新计算 ACL 掩码 (mask) 条目。掩码条目定义了所有命名用户、命名组和所有组的最大有效权限(但不包括文件所有者或其他人)。重新计算时,掩码被设置为这些条目所有权限的并集(按位或),以确保每个条目保留其请求的权限。掩码随后充当限制过滤器:每个受影响条目的有效权限是其自身权限与掩码的交集(按位与)。例如,如果 user:bob 被授予 rwx 且掩码为 r-x,那么 Bob 的有效权限将被限制为 r-x。这种行为确保了访问语义的一致性,特别是在跨支持或不支持 ACL 的系统共享文件时。
下面的示例有助于澄清 setfacl 中 ACL 掩码工作方式的两个不同步骤,特别是在 --no-mask 和默认行为的背景下
- 掩码的重新计算(按位或 / “并集”)
- 应用掩码(按位与 / 限制)
user:bob: rw- group:dev: r-- group:: r-x → mask: rwx (union) Effective rights: bob: rw- dev: r-- group:: r-x
2003 年的 USENIX 文档 POSIX Access Control Lists on Linux 包含更多信息。
查看 ACL
要查看权限,请使用
# getfacl <file/dir>
示例
为用户 johnny 设置对名为 abc 文件的所有权限
# setfacl -m "u:johnny:rwx" abc
检查权限
# getfacl abc
# file: abc # owner: someone # group: someone user::rw- user:johnny:rwx group::r-- mask::rwx other::r--
更改用户 johnny 的权限
# setfacl -m "u:johnny:r-x" abc
检查权限
# getfacl abc
# file: abc # owner: someone # group: someone user::rw- user:johnny:r-x group::r-- mask::r-x other::r--
删除所有 ACL 条目
# setfacl -b abc
检查权限
# getfacl abc
# file: abc # owner: someone # group: someone user::rw- group::r-- other::r--
ls 命令的输出
您会注意到某个文件具有 ACL,因为在 ls -l 的输出中,其 Unix 权限之后会显示一个 +(加号)。
$ ls -l /dev/audio
crw-rw----+ 1 root audio 14, 4 nov. 9 12:49 /dev/audio
$ getfacl /dev/audio
getfacl: Removing leading '/' from absolute path names # file: dev/audio # owner: root # group: audio user::rw- user:solstice:rw- group::rw- mask::rw- other::---
私有文件的执行权限
以下技术描述了如何授予像Web 服务器这样的进程访问位于用户主目录中文件的权限,而无需通过向全世界开放访问权限来损害安全性。
在下文中,我们假设 Web 服务器以用户 http 身份运行,并授予其访问 geoffrey 的主目录 /home/geoffrey 的权限。
第一步是授予用户 http 执行权限
# setfacl -m "u:http:--x" /home/geoffrey
既然用户 http 现在能够访问 /home/geoffrey 中的文件,其他人不再需要访问权限
# chmod o-rx /home/geoffrey
使用 getfacl 验证更改
$ getfacl /home/geoffrey
getfacl: Removing leading '/' from absolute path names # file: home/geoffrey # owner: geoffrey # group: geoffrey user::rwx user:http:--x group::r-x mask::r-x other::---
如上述输出所示,other 不再具有任何权限,但用户 http 仍然能够访问文件,因此可以认为安全性得到了提高。
如果您需要为用户 http 在特定目录和/或文件上提供写权限,请运行
# setfacl -dm "u:http:rwx" /home/geoffrey/project1/cache