访问控制列表
访问控制列表 (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 和默认行为的上下文中。
- 重新计算掩码(按位或 / "并集")
- 应用掩码(按位与 / 限制)
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