感谢支持
我们一直在努力

CentOS7使用ACL精确控制文件和目录的访问权限

Linux基本的权限控制仅可以对所属用户、所属组、其他用户进行的权限控制,而不能精确地控制每个用户的权限。ACL规则就是用来解决这个问题的。使用ACL规则,我们可以针对单一账户设置文件及目录的访问权限。


实验用户和组环境

组root:包含用户root
组zenandidi:包含用户zenandidi
组nannan:包含用户nannan、zenandidi


实验文件内容

[root: ~]# cat acl_test/test.sh 
#/bin/bash
echo "Success!"

检查文件系统的ACL功能是否已经开启

CentOS7默认已经开启ACL功能

[root: ~]# tune2fs -l /dev/sda2 | grep acl
Default mount options:    user_xattr acl

如果有看到acl,说明已经开启。


查看是否设定了ACL规则

直接用ls -l查看,如果权限一栏后面有个加号,说明文件被设定了ACL规则。

[root: acl_test]# ll 
总用量 12K
-rw-rwxr--+  1 root root   27 5月   7 08:03 test.sh

使用getfacl查询ACL规则
命令基本用法
getfacl <文件>
举例说明

列出test.sh的ACL规则(下面分段说明)

[root: acl_test]# getfacl test.sh 

以下为文件的基本信息

# file: test.sh     #文件名
# owner: root       #所有者
# group: root       #所属组

以下为文件的用户权限设置

user::rw-                   #Linux默认的所属用户权限
user:zenandidi:rwx          #附加ACL用户权限,这里表示用户zenandidi有读、写、执行的权限

以下为文件的组权限设置

group::r--                  #Linux默认的所属组权限

其他信息

mask::r-x                   #权限掩码(最后详细说明)
other::r--                  #Linux默认的其他用户权限


使用setfacl设置ACL规则
命令基本用法
setfacl <选项> [规则] <文件>

选项:

-m 新增一条ACL规则
-x 删除一条ACL规则
-b 清空所有ACL规则

举例说明


例1 清空test.sh中所有ACL规则

[root: acl_test]# setfacl -b test.sh 

检查设置

[root: acl_test]# getfacl test.sh 
# file: test.sh
# owner: root
# group: root
user::rw-
group::r--
other::r--

[root: acl_test]# ll
总用量 12K
-rw-r--r--   1 root root   27 5月   7 08:03 test.sh
#权限栏的加号已经消失,说明没有设定ACL规则

例2 为test.sh添加一条ACL规则,使得用户zenandidi具有读、执行权限

设置之前先看看能不能用用户zenandidi的身份执行

[root: acl_test]# sudo -u zenandidi ./test.sh 
sudo:./test.sh:找不到命令

由于没有赋予用户zenandidi执行权限,默认使用其他用户的权限,所以不能执行。

设置权限

[root: acl_test]# setfacl -m u:zenandidi:rx test.sh 

检查设置

[root: acl_test]# getfacl test.sh 
# file: test.sh
# owner: root
# group: root
user::rw-
user:zenandidi:r-x
group::r--
mask::r-x
other::r--

[root: acl_test]# ll
总用量 12K
-rw-r-xr--+  1 root root   27 5月   7 08:03 test.sh

再看看能不能用zenandidi的身份执行

[root: acl_test]# sudo -u zenandidi ./test.sh 
Success!

执行成功。

好奇地看了下root的

[root: acl_test]# ./test.sh 
Success!

咦?我好像没设置root可以执行,为什么也执行成功了捏?其实这是mask在作怪,最后再看吧。


例3 为test.sh添加一条ACL规则,使得组nannan具有读、写权限

设置之前先看看能不能用用户zenandidi、nannan的身份改文件名

[root: acl_test]# sudo -u zenandidi mv test.sh test1.sh 
mv: 无法将"test.sh" 移动至"test1.sh": 权限不够
[root: acl_test]# sudo -u nannan mv test.sh test1.sh 
mv: 无法将"test.sh" 移动至"test1.sh": 权限不够

无法改文件名,因为没有赋予写权限。

设置权限

[root: acl_test]# setfacl -m g:nannan:rw test.sh 

检查设置

[root: acl_test]# getfacl test.sh 
# file: test.sh
# owner: root
# group: root
user::rw-
user:zenandidi:r-x
group::r--
group:nannan:rw-        #effective:r--
mask::r-x
other::r--

再看看能不能改文件名

[root: acl_test]# sudo -u zenandidi mv test.sh test1.sh 
mv: 无法将"test.sh" 移动至"test1.sh": 权限不够
[root: acl_test]# sudo -u nannan mv test.sh test1.sh 
mv: 无法将"test.sh" 移动至"test1.sh": 权限不够

还是不行啊,怎么回事?还是那个mask的事。下面详细说明。


关于mask的那点事
1. mask值规定了允许的最大权限

例如:
mask为rwx,说明ACL规则可以设置全部权限。
mask为rw-,说明ACL规则仅可设置读、写权限,无论是否设置执行权限,文件都不能被执行。

如果getfacl输出中有#effective:xxx这个注释,说明ACL规则受mask限制,仅有xxx权限。应特别注意!


例3的问题可以通过设置mask来解决。

[root: acl_test]# setfacl -m mask:rwx test.sh 

2. mask值会直接作为Linux基本权限中的组权限

例1的问题就出在这里。

设置ACL之前

[root: acl_test]# ll
总用量 12K
-rw-r--r--  1 root root   27 5月   7 08:03

设置ACL之后,组权限变成了mask值

[root: acl_test]# ll
总用量 12K
-rw-r-xr--+  1 root root   27 5月   7 08:03 test.sh

因为root处在root组之中,所以自然就有了执行的权限。


以上纯属个人经验,如有错误请及时提出,谢谢!

本文永久更新链接地址:http://www.linuxidc.com/Linux/2018-01/150111.htm

赞(0) 打赏
转载请注明出处:服务器评测 » CentOS7使用ACL精确控制文件和目录的访问权限
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏