鸟哥的Linux私房菜读书笔记--主机的细部权限规划:ACL的使用

版权声明:本文属博主原创,转载请联系QQ528055624 https://blog.csdn.net/qq_41825534/article/details/83048309

1、什么是ACL与如何支持启动ACL

ACL 是 Access Control List 的缩写,主要的目的是在提供传统的 owner,group,others 的read,write,execute 权限之外的细部权限设定。ACL 可以针对单一使用者,单一文件或目录来进行r,w,x 的权限规范,对于需要特殊权限的使用状况非常有帮助。ACL 主要可以针对以下项目:
· 使用者 (user):可以针对使用者来设定权限;
· 群组 (group):针对群组为对象来设定其权限;
· 默认属性 (mask):还可以针对在该目录下在建立新文件/目录时,规范新数据的默认权限;
<1>如何启动ACL

原本的ACL是unix-like操作系统的额外支持项目,由于近年对Linux系统权限细部设定的热切需求,目前ACL已经加入所有常见的linux文件系统的挂载参数中,所以无需进行任何动作就可以使用ACL

[root@study ~]# dmesg | grep -i acl
[ 0.330377] systemd[1]: systemd 208 running in system mode. (+PAM +LIBWRAP +AUDIT
+SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ)
[ 0.878265] SGI XFS with ACLs, security attributes, large block/inode numbers, no
debug enabled

2、ACL的设定技巧

getfacl:取得某个文件/目录的ACL设定项目

setfacl:设定某个文件/目录的ACL规范

<1>setfacl

[root@study ~]# setfacl [-bkRd] [{-m|-x} acl 参数] 目标文件名
选项与参数:
-m :设定后续的 acl 参数给文件使用,不可与 -x 合用;
-x :删除后续的 acl 参数,不可与 -m 合用;
-b :移除『所有的』 ACL 设定参数;
-k :移除『预设的』 ACL 参数,关于所谓的『预设』参数于后续范例中介绍;
-R :递归设定 acl ,亦即包括次目录都会被设定起来;
-d :设定『预设 acl 参数』的意思!只对目录有效,在该目录新建的数据会引用此默认值
针对单一使用者ACL特殊权限的设定方式:
# 1. 针对特定使用者的方式:
# 设定规范:『 u:[使用者账号列表]:[rwx] 』,例如针对 vbird1 的权限规范 rx :
[root@study ~]# touch acl_test1
[root@study ~]# ll acl_test1
-rw-r--r--. 1 root root 0 Jul 21 17:33 acl_test1
[root@study ~]# setfacl -m u:vbird1:rx acl_test1
[root@study ~]# ll acl_test1
-rw-r-xr--+ 1 root root 0 Jul 21 17:33 acl_test1
# 权限部分多了个 + ,且与原本的权限 (644) 看起来差异很大!但要如何查阅呢?
[root@study ~]# setfacl -m u::rwx acl_test1
[root@study ~]# ll acl_test1
-rwxr-xr--+ 1 root root 0 Jul 21 17:33 acl_test1
# 设定值中的 u 后面无使用者列表,代表设定该文件拥有者,所以上面显示 root 的权限成为 rwx 了!
上述动作为最简单的 ACL 设定,利用『 u:使用者:权限 』的方式来设定的啦!设定前请加上 -m 这个选项。 如果一个文件设定了 ACL 参数后,他的权限部分就会多出一个 + 号了!但是此时你看到的权限与实际权限可能就会有点误差! 那要如何观察呢?就透过 getfacl 吧!
<2>getfacl 指令用法
[root@study ~]# getfacl filename
选项与参数:
-m :设定后续的 acl 参数给文件使用,不可与 -x 合用;
-x :删除后续的 acl 参数,不可与 -m 合用;
-b :移除『所有的』 ACL 设定参数;
-k :移除『预设的』 ACL 参数,关于所谓的『预设』参数于后续范例中介绍;
-R :递归设定 acl ,亦即包括次目录都会被设定起来;
-d :设定『预设 acl 参数』的意思!只对目录有效,在该目录新建的数据会引用此默认值                                                  getfacl 的选项几乎与 setfacl 相同!所以鸟哥这里就免去了选项的说明啊!
# 请列出刚刚我们设定的 acl_test1 的权限内容:
[root@study ~]# getfacl acl_test1
# file: acl_test1 <==说明档名而已!
# owner: root <==说明此文件的拥有者,亦即 ls -l 看到的第三使用者字段
# group: root <==此文件的所属群组,亦即 ls -l 看到的第四群组字段
user::rwx <==使用者列表栏是空的,代表文件拥有者的权限
user:vbird1:r-x <==针对 vbird1 的权限设定为 rx ,与拥有者并不同!
group::r-- <==针对文件群组的权限设定仅有 r
mask::r-x <==此文件预设的有效权限 (mask)
other::r-- <==其他人拥有的权限啰!
上面的数据非常容易查阅吧?显示的数据前面加上 # 的,代表这个文件的默认属性,包括文件名、
文件拥有者与文件所属群组。 底下出现的 user, group, mask, other 则是属于不同使用者、群组与有
效权限(mask)的设定值。 以上面的结果来看,我们刚刚设定的 vbird1 对于这个文件具有 r 与 x 的
权限啦!这样看的懂吗? 如果看的懂的话,接下来让我们在测试其他类型的 setfacl 设定吧!

扫描二维码关注公众号,回复: 3646630 查看本文章

<3>特定的单一群组的权限设定:『 g:群组名:权限 』
# 2. 针对特定群组的方式:
# 设定规范:『 g:[群组列表]:[rwx] 』,例如针对 mygroup1 的权限规范 rx :
[root@study ~]# setfacl -m g:mygroup1:rx acl_test1
[root@study ~]# getfacl acl_test1                                                                                                                                                #file: acl_test1
# owner: root
# group: root
user::rwx
user:vbird1:r-x
group::r--
group:mygroup1:r-x <==这里就是新增的部分!多了这个群组的权限设定!
mask::r-x
other::r--

<4>针对有效权限设定:m:权限

mask,有效权限。使用者或群组所设定的权限必须要存在于mask的权限设定范围内才会生效,此即有效权限effective permission  

#3. 针对有效权限 mask 的设定方式:
# 设定规范:『 m:[rwx] 』,例如针对刚刚的文件规范为仅有 r :
[root@study ~]# setfacl -m m:r acl_test1
[root@study ~]# getfacl acl_test1
# file: acl_test1
# owner: root
# group: root
user::rwx
user:vbird1:r-x #effective:r-- <==vbird1+mask 均存在者,仅有 r 而已,x 不会生效
group::r--
group:mygroup1:r-x #effective:r--
mask::r--
other::r--

例题:
将前一小节任务二中 /srv/projecta 这个目录,让 myuser1 可以进入查阅,但 myuser1 不具有修改的权力。
答:由于 myuser1 是独立的使用者与群组,因此无法使用传统的 Linux 权限设定。此时使用 ACL 的设定如下:
# 1. 先测试看看,使用 myuser1 能否进入该目录?
[myuser1@study ~]$ cd /srv/projecta
bash: cd: /srv/projecta: Permission denied <==确实不可进入!
# 2. 开始用 root 的身份来设定一下该目录的权限吧!
[root@study ~]# setfacl -m u:myuser1:rx /srv/projecta
[root@study ~]# getfacl /srv/projecta
# file: srv/projecta
# owner: root
# group: projecta
# flags: -s user::rwx
user:myuser1:r-x <==还是要看看有没有设定成功喔!
group::rwx
mask::rwx
other::---
# 3. 还是得要使用 myuser1 去测试看看结果!
[myuser1@study ~]$ cd /srv/projecta
[myuser1@study projecta]$ ll -a
drwxrws---+ 2 root projecta 4096 Feb 27 11:29 . <==确实可以查询档名
drwxr-xr-x 4 root root 4096 Feb 27 11:29 ..
[myuser1@study projecta]$ touch testing
touch: cannot touch `testing': Permission denied <==确实不可以写入!
请注意,上述的 1, 3 步骤使用 myuser1 的身份,2 步骤才是使用 root 去设定的!

<5>使用默认权限设定目录未来文件的ACL权限继承  [ d : [ u|g]:[user|group]:权限 ]

#4.针对预设权限的设定方式

设定规范:『 d:[ug]:使用者列表:[rwx] 』
# 让 myuser1 在 /srv/projecta 底下一直具有 rx 的预设权限!
[root@study ~]# setfacl -m d:u:myuser1:rx /srv/projecta
[root@study ~]# getfacl /srv/projecta
# file: srv/projecta
# owner: root
# group: projecta
# flags: -s user::rwx
user:myuser1:r-x
group::rwx
mask::rwx
other::---
default:user::rwx
default:user:myuser1:r-x
default:group::rwx
default:mask::rwx
default:other::---
[root@study ~]# cd /srv/projecta
[root@study projecta]# touch zzz1
[root@study projecta]# mkdir zzz2
[root@study projecta]# ll -d zzz*
-rw-rw----+ 1 root projecta 0 Jul 21 17:50 zzz1
drwxrws---+ 2 root projecta 6 Jul 21 17:51 zzz2
# 看吧!确实有继承喔!然后我们使用 getfacl 再次确认看看!
[root@study projecta]# getfacl zzz2
# file: zzz2
# owner: root
# group: projecta
# flags: -s user::rwx
user:myuser1:r-x
group::rwx
mask::rwx
other::---
default:user::rwx
default:user:myuser1:r-x
default:group::rwx
default:mask::rwx
default:other::---

问:针对刚刚的 /srv/projecta 目录的权限设定中,我需要 1)取消 myuser1 的设定(连同默认值),以及 2)我不能让 pro3 
这个用户使用该目录,亦即 pro3 在该目录下无任何权限, 该如何设定?
答:取消全部的 ACL 设定可以使用 -b 来处理,但单一设定值的取消,就得要透过 -x 才行了!所以你应该这样作:
# 1.1 找到针对 myuser1 的设定值
[root@study ~]# getfacl /srv/projecta | grep myuser1
user:myuser1:r-x
default:user:myuser1:r-x
# 1.2 针对每个设定值来处理,注意,取消某个账号的 ACL 时,不需要加上权限项目!
[root@study ~]# setfacl -x u:myuser1 /srv/projecta
[root@study ~]# setfacl -x d:u:myuser1 /srv/projecta
# 2.1 开始让 pro3 这个用户无法使用该目录啰!
[root@study ~]# setfacl -m u:pro3:- /srv/projecta
当设定一个用户/群组没有任何权限的 ACL 语法中,在权限的字段不可留白,而是应该加上一个减号(-) 才是正确的作法!

猜你喜欢

转载自blog.csdn.net/qq_41825534/article/details/83048309