跳转至内容

访问控制列表

来自 ArchWiki
(重定向自 ACL)

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

安装

The acl package is a dependency of systemd, it should already be installed.

启用 ACL

要启用 ACL,文件系统必须使用 acl 选项挂载。您可以使用 fstab 条目使其在系统上永久生效。

文件系统可能已经以 acl 选项作为默认挂载选项之一而激活。 Btrfs 和 Ext2/3/4 文件系统会受到此影响。使用以下命令检查 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 标志,您可以列出文件/目录权限更改而不修改权限(即,进行模拟运行)。
  • 要递归地将操作应用于所有文件和目录,请附加 -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>
注意 默认情况下,setfacl 会自动重新计算 ACL 掩码条目,除非使用了 -n (--no-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>

示例

为名为 abc 的文件设置用户 johnny 的所有权限

# 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.