访问控制列表
访问控制列表 (ACL) 提供了一种额外的、更灵活的 文件系统 权限机制。它旨在辅助 UNIX 文件权限。ACL 允许您为任何用户或组授予对任何磁盘资源的权限。
安装
启用 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
标志来列出文件/目录权限更改,而无需修改权限(即,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>
--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::---
如上述输出所示,其他人不再具有任何权限,但用户 http
仍然能够访问文件,因此可以认为安全性提高了。
如果您需要为用户 http
提供对特定目录和/或文件的写入权限,请运行
# setfacl -dm "u:http:rwx" /home/geoffrey/project1/cache