访问控制列表

来自 ArchWiki
(重定向自 ACL

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

安装

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

启用 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>

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

原因: 关于 --mask 选项的原始说明(取自 setfacl(1))被确定为不准确,但新的说明似乎也不正确。 有关详细信息,请参见讨论页。(在 Talk:Access Control Lists#ACL mask entry 中讨论)
注意: setfacl 的默认行为是重新计算 ACL 掩码条目,除非显式给出了 --mask 条目。掩码条目指示允许用户(所有者除外)和组的最大权限。除非显式设置,否则这将与默认组的权限匹配。为了阐明这意味着什么,假设拥有目录的组具有 r-x 权限。如果您添加具有 rwx 权限的 ACL 用户或组,则此用户或组的有效权限将为 r-x。这样做的原因是,当来自不支持 ACL 的系统的文件在支持 ACL 的系统上可用时,不会有意外。

显示 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

另请参阅