Linux系统下ACL学习

 

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 获取正确信息.

 

[参考资料]

setfacl命令

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值