ACL( Access Control List, 访问控制列表 )可以实现Linux下跳出 传统属主/属组/其他用户 的文件权限管控方式.
即: 可以为每个文件对特定用户/用户组设定不同权限.
先建立一个用于测试ACL的文件, 在其中录入一些内容, 并去除其他用户的所有权限.
[root@server tmp]# touch acl-file
[root@server tmp]# echo some words here > !$
echo some words here > acl-file
[root@server tmp]# cat acl-file
some words here
[root@server tmp]# ll acl-file
-rw-r--r--. 1 root root 16 Sep 19 11:13 acl-file
[root@server tmp]# chmod o-r acl-file
[root@server tmp]# !ll
ll acl-file
-rw-r-----. 1 root root 16 Sep 19 11:13 acl-file
切换到某一其它用户尝试去读取文件内容.
[root@server tmp]# su - vbird1
Last login: Thu Sep 19 11:16:23 CST 2019 on pts/0
[vbird1@server ~]$ id
uid=1000(vbird1) gid=1001(vbird1) groups=1001(vbird1),1000(vbirdgroup) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[vbird1@server ~]$ cat /tmp/acl-file
cat: /tmp/acl-file: Permission denied
切换回属主给文件设置ACL.
[root@server tmp]# getfacl acl-file
# file: acl-file
# owner: root
# group: root
user::rw-
group::r--
other::---
[root@server tmp]# setfacl u:vbird1:r acl-file
Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
Try `setfacl --help' for more information.
[root@server tmp]# setfacl -m u:vbird1:r acl-file
[root@server tmp]# getfacl acl-file
# file: acl-file
# owner: root
# group: root
user::rw-
user:vbird1:r--
group::r--
mask::r--
other::---
再切换至其它用户尝试查看文件内容, 已经可以访问.
[root@server tmp]# su - vbird1
Last login: Thu Sep 19 11:17:19 CST 2019 on pts/0
[vbird1@server ~]$ cat /tmp/acl-file
some words here
[vbird1@server ~]$ ll !$
ll /tmp/acl-file
-rw-r-----+ 1 root root 16 Sep 19 11:13 /tmp/acl-file
现在我们来仔细了解下ACL相关知识.
文件的属主和 有 CAP_FOWNER 的用户进程可以设置该文件的ACL( 常见的Linux系统中, root用户是唯一有 CAP_FOWNER 能力的用户 ).
setfacl 命令接收以下规则格式:
[d[efault]:] [u[ser]:]uid [:perms] 指定用户的权限,文件所有者的权限(如果uid没有指定)。 [d[efault]:] g[roup]:gid [:perms] 指定群组的权限,文件所有群组的权限(如果gid未指定) [d[efault]:] m[ask][:] [:perms] 有效权限掩码 [d[efault]:] o[ther] [:perms] 其他的权限
getfacl 命令获取的信息显示的是文件的 ACL条目( ACL entry ), ACL条目 包含项为:
Entry tag type:qualifier(optional):permission
其中 Entry tag type 最重要, 它的类型有:
ACL_USER_OBJ:相当于Linux里file_owner的permission ACL_USER:定义了额外的用户可以对此文件拥有的permission ACL_GROUP_OBJ:相当于Linux里group的permission ACL_GROUP:定义了额外的组可以对此文件拥有的permission ACL_MASK:定义了ACL_USER, ACL_GROUP_OBJ和ACL_GROUP的最大权限 ACL_OTHER:相当于Linux里other的permission
简单理解, 带 OBJ 的就是文件的属主/属组的权限设定, ACL_USER/ACL_GROUP 是其它用户/用户组对于文件的权限设定,
ACL_MASK 决定了其它用户/属组/其它用户组的最大权限( 比如 ACL_MASK 设为 r--, 那么其它用户/属组/其它用户组最多只能有文件的读权限, 即使使用setfacl给它更大权限, 它也无法使用 ).
当一个文件有了 ACL_USER 或者 ACL_GROUP 的 ACL条目 时, ACL_MASK 也同时会被定义.
现在我们再回到root用户, 给之前的文件指定一个 r-x 的 ACL_USER Entry
[root@server tmp]# setfacl -m u:vbird1:rx acl-file
[root@server tmp]# ll acl-file
-rw-r-x---+ 1 root root 16 Sep 19 11:13 acl-file
[root@server tmp]# getfacl acl-file
# file: acl-file
# owner: root
# group: root
user::rw-
user:vbird1:r-x
group::r--
mask::r-x
other::---
可以看到 ll 该文件时, 属组权限显示为 r-x , 其实这时这边已经不是属组权限了, 而是 ACL_MASK .
一言以蔽之
当文件权限带 + 标记时, 不要凭 ll ( alias ls -l ) 的输出信息来查看文件权限
而是使用 getfacl 获取正确信息.
[参考资料]