跳转至内容

访问控制列表

来自 ArchWiki

访问控制列表 (ACL) 为文件系统提供了一种额外且更灵活的权限机制。它旨在辅助 UNIX 文件权限。ACL 允许您为任何用户或组授予对任何磁盘资源的权限。

安装

acl 软件包是 systemd 的依赖项,应该已经安装。

启用 ACL

本文或本章节的准确性存在争议。

原因: 原文措辞暗示如果内核缺乏对 ACL 的支持,通过指定挂载选项可以启用它,这并不合理。(讨论请见 Talk:Access Control Lists)

诸如 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 和默认行为的背景下

  1. 掩码的重新计算(按位或 / “并集”)
  2. 应用掩码(按位与 / 限制)
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

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.