这一篇总结一下ACL权限的内容,对应《鸟哥的Linux私房菜》中的第十三章的内容。
之前的学习笔记中,我们总结的关于文件权限,只有三种,使用者权限、群组权限、其他人权限。但是没有办法针对某一个使用者或某一个群组来设定特定的权限,比如我们有一个文件——data.file。当前的权限为774。也就是说该文件的所有者,已经群组的人员有权限对这个文件进行读写和执行,其他人只能读取文件内容。这个时候,有一个临时用户——temp,不属于data.file文件的所属的组群,但是,想对data.file有读和执行的权限,这个时候就有点麻烦了。
我们如果可以将temp用户加入到data.file所属的组群中,这样虽然能实现相关需求,但是temp用户对data.file文件具有了可写权限,这是非常不安全的。如果我们通过修改data.file其他人的权限,给其他人加上可执行权限,这也是扩大了data.file的权限范围,都有点不合适,因此这个时候ACL的作用就凸显出来了。
《鸟哥的Linux私房菜》中对ACL的权限是如下解释的:ACL——Access Control List,主要目的是在提供传统的owner,group,others的read,write,execute权限之外的细部权限限定。ACL可以针对单一使用者,单一文件或目录来进行r,w,x的权限规范,对于需要特殊权限的使用情况非常有帮助。
通常常见的文件系统都是支持ACL的,如果需要查看自己的磁盘文件系统是否支持ACL,可以通过如下命令
[root@localhost log]# dmesg | grep -i acl
[ 2.079870] systemd[1]: systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
[ 4.335922] SGI XFS with ACLs, security attributes, no debug enabled
出现SGI XFS with ACLs表示支持ACL。
相关实例
##创建一个文件夹
[root@localhost /]# mkdir acl_learn
[root@localhost /]# cd /acl_learn/
#创建一个acl_test1文件。
[root@localhost ~]# touch acl_test1
[root@localhost ~]# ll
total 8
-rw-r--r--. 1 root root 0 May 29 16:47 acl_test1
##规定acl_test1文件的所有者和所属组群
[root@localhost ~]# useradd tony
[root@localhost ~]# groupadd stu
[root@localhost ~]# chown tony:stu acl_test1
[root@localhost ~]# ll
total 8
-rw-r--r--. 1 tony stu 0 May 29 16:47 acl_test1
#新建一个临时用户
[root@localhost ~]# useradd temp
[root@localhost ~]# ll
total 8
-rw-r--r--. 1 tony stu 0 May 29 16:47 acl_test1
#给临时用户temp赋予acl权限。
[root@localhost ~]# setfacl -m u:temp:rx acl_test1
[root@localhost ~]# ll
total 8
-rw-r-xr--+ 1 tony stu 0 May 29 16:47 acl_test1
上面的实例,我们通过setfacl -m [u:使用者:权限]的方式来设定acl_test1文件的acl权限,设定完成之后,文件的权限描述部分会多出一个+号。如果要查看设定的具体的acl权限,需要用到getfacl命令。
用于查询acl权限详情。
这个命令的选项和setfacl相同,这里就免去了选项的说明,只需要通过getfacl filename的方式就能读取文件的acl权限描述
[root@localhost acl_learn]# getfacl acl_test1
# file: acl_test1
# owner: tony ##文件的拥有者
# group: stu ##文件的所属组群
user::rw- ##第二列表示使用者,如果为空表示对应的是文件所有者,这句整个描述的就是文件所有者的权限
user:temp:r-x ## 针对temp用户设定的用户权限。
group::r-- ## 针对文件组群设置的权限
mask::r-x ## 文件预设的有效mask(这个后面会提到)
other::r-- ## 其他人拥有的权限
上面在介绍getfacl命令的时候,显示了一个mask,这个其实就是最大有效权限的意思——使用者或者群组所设定的权限必须要存在于mask的权限设定范围之内才会生效。
如果我们给用户赋予了ACL权限,是需要和mask的值"相与"才能得到用户真正的权限。文件的最大用户权限可以通过setfacl命令进行修改。
setfacl -m m:[rwx] 文件名 的方式修改文件的mask值
##修改acl_test1文件的mask值为r
[root@localhost acl_learn]# setfacl -m m:r acl_test1
[root@localhost acl_learn]# getfacl acl_test1
# file: acl_test1
# owner: tony
# group: stu
user::rw-
user:temp:r-x #effective:r-- ##系统已经标出,用户temp生效的权限只有r
group::r--
mask::r-- ##mask的值变成了r
other::r--
默认的ACL权限——如果给父目录设定了默认的ACL权限,那么父目录中所有的新建子文件都会继承父目录的ACL权限(存量文件的ACL权限不会变化)。
通过 setfacl -m d:[u|g]:[user|group]:权限 文件名
来设定文件夹的默认acl权限。
递归的ACL权限——父目录在设定了ACL权限之后,所有的子文件和子目录也会拥有相同的ACL权限(存量文件的ACL权限也会变化)。
通过setfacl -m u:用户名:权限 -R 文件名
类设定文件夹的递归ACL权限。
#创建一个aclpro文件夹
[root@localhost acl_learn]# mkdir aclpro
[root@localhost acl_learn]# cd aclpro/
[root@localhost aclpro]# ll
total 0
#进入aclpro文件夹,创建file1文件
[root@localhost aclpro]# touch file1
## 这个时候的file1不具有acl权限
[root@localhost aclpro]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
group::r--
other::r--
[root@localhost aclpro]# cd ..
## 设定文件夹默认的ACL权限
[root@localhost acl_learn]# setfacl -m d:u:temp:rx ./aclpro/
##查看之后,发现aclpro已经有默认的acl权限了,多了default
[root@localhost acl_learn]# getfacl ./aclpro/
# file: aclpro/
# owner: root
# group: root
user::rwx
user:temp:r-x
group::r-x
mask::r-x
other::r-x
default:user::rwx
default:user:temp:r-x
default:group::r-x
default:mask::r-x
default:other::r-x
[root@localhost acl_learn]# cd aclpro/
[root@localhost aclpro]# ll
total 0
-rw-r--r--. 1 root root 0 May 29 17:27 file1
## 这个时候存量的文件ACL权限不受影响
[root@localhost aclpro]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
group::r--
other::r--
#新文件的ACL权限与默认的acl权限一致
[root@localhost aclpro]# touch file2
[root@localhost aclpro]# getfacl file2
# file: file2
# owner: root
# group: root
user::rw-
user:temp:r-x #effective:r-- 由于mask的设置这里只有r权限有效
group::r-x #effective:r--
mask::r--
other::r--
##递归设置aclpro文件夹的acl权限
[root@localhost aclpro]# cd ../
[root@localhost acl_learn]# setfacl -m u:temp:rx -R aclpro/
[root@localhost acl_learn]# cd aclpro/
##file1的acl权限产生了变化
[root@localhost aclpro]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:temp:r-x
group::r--
mask::r-x
other::r--
简单梳理了一下ACL权限。