查看文件系统是否支持ACL
[root@foundation0 RHCE]# dmesg | grep -i acl
[ 1.177048] systemd[1]: systemd 208 running in system mode. (+PAM +LIBWRAP +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ)
[ 2.622530] SGI XFS with ACLs, security attributes, large block/inode numbers, no debug enabled
通过ugo权限限制用户访问:
[root@foundation0 acl]# ll test.txt
-rw-r--r--. 1 root root 15 Nov 27 19:42 test.txt
[root@foundation0 acl]# chmod o-r test.txt
[root@foundation0 acl]# ll test.txt
-rw-r-----. 1 root root 20 Nov 28 09:51 test.txt
其它用户或组无法查看文件test.txt
[test@foundation0 acl]$ id
uid=1001(test) gid=1001(test) groups=1001(test) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[test@foundation0 acl]$ cat test.txt
cat: test.txt: Permission denied
Test用户属于其它的范围,其它现在没有任何权限,所有test无法访问文件,现在要实现的功能是,即使test用户在其它的范围内,也要能查看或执行test.txt文件:
解决方法:
使用ACL
配置acl选项参数:
setfacl
-m设定指定的acl参数
-x删除指定的ACL参数
-b删除所有的ACL设置条目
-d设置默认的default
-k删除default的ACL参数
-R递归设置acl
查看文件的ACL
[root@foundation0 acl]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
group::r--
other::---
配置ACL用户权限
[root@foundation0 acl]# setfacl -m u:test:rw- test.txt # u:指明要配置用户 rw-是test这个用户拥有访问文件的权限
[root@foundation0 acl]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
user:test:rw-
group::r--
mask::rw-
other::---
与没有配置ACL相比,多了user:test:rw-和mask:rw-字段,这个字段的意思是允许test用户可以读写test.txt文件,即使test没有其它用户组的权限
配置ACL的文件,权限里多了一个+号,表示这个文件配置了ACL
[root@foundation0 acl]# ll test.txt
-rw-rw----+ 1 root root 15 Nov 27 19:45 test.txt
这样test用户就可以查看文件了
[test@foundation0 acl]$ cat test.txt
this is a test
配置ACL组权限:
将用户添加到组:
[root@foundation0 acl]# usermod -aG admins test
[root@foundation0 acl]# id test
uid=1001(test) gid=1001(test) groups=1001(test),1002(admins)
添加用户test001,默认情况下,这个用户不能访问test.txt文件
[root@foundation0 acl]# useradd test001
[test001@foundation0 acl]$ cat test.txt
cat: test.txt: Permission denied
将test001添加到组admins中
[root@foundation0 acl]# usermod -aG admins test001
[root@foundation0 acl]# id test001
uid=1002(test001) gid=1003(test001) groups=1003(test001),1002(admins)
[test001@foundation0 acl]$ grep admins /etc/group
admins:x:1002:test,test001
将组admins添加到test.txt的acl权限中,这个属于这个组的所有成员都有权限访问test.txt文件了
[root@foundation0 acl]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
user:test:rw-
group::r--
mask::rw-
other::---
将组admins添加到test.txt的acl权限中:
[root@foundation0 acl]# setfacl -m g:admins:rw- test.txt
[root@foundation0 acl]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
user:test:rw-
group::r--
group:admins:rw-
mask::rw-
other::---
与没有添加组acl权限相比,多了一个group:admins:rw-字段,这个字段表示属于admins组的所有成员都有读写test.txt文件的权限
[test001@foundation0 acl]$ cat test.txt
This is a test file
现在所有属于组admins的成员都可以访问test.txt文件了
mask定义facl所有权限的最大权限,文件所有者权限不受影响
[root@foundation0 acl]# chmod 600 test.txt
[root@foundation0 acl]# ll test.txt
-rw-------+ 1 root root 15 Nov 27 19:45 test.txt
[root@foundation0 acl]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
user:test:rw-#effective:---
group::r--#effective:---
group:admins:rw-#effective:--- #有效权限为空
mask::---#相当于掩码,mask权限相当于所有权限的最大值,现在mask都没有权限,所有其它都没有权限了
other::---
Effective:表示有效的权限,如果为---,表示这个权限不生效,因为600表示只有文件所有者才有权限,所属组或其它用户没有权限。
mask控制 user:test:rw- group::r-- group:admins:rw- 的权限
[root@foundation0 acl]# chmod 640 test.txt
[root@foundation0 acl]# ll test.txt
-rw-r-----+ 1 root root 20 Nov 28 10:18 test.txt
[root@foundation0 acl]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
user:test:rw-#effective:r--
group::r--
group:admins:rw-#effective:r--
mask::r--
other::---
现在所属组有只读权限,mask的权限也为只读权限。
可以通过修改mask的权限来提升acl其它用户和其它组的权限:
[root@foundation0 acl]# setfacl -m m:rw test.txt
[root@foundation0 acl]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
user:test:rw-
group::r--
group:admins:rw-
mask::rw-#这里修改了
other::---
这个修改mask的rw权限,所以用户test和组admins都有rw权限,mask表示所属用户或组的最大权限
对目录配置acl默认值:
-d 表示配置ACL目录的默认值:
[root@foundation0 acl]# ll -d /acl#未配置前的值
drwxr-xr-x. 2 root root 21 Nov 28 10:18 /acl
[root@foundation0 acl]# setfacl -m d:g:admins:rwx /acl#配置目录/acl的默认ACL值
[root@foundation0 acl]# ll -d /acl
drwxr-xr-x+ 2 root root 21 Nov 28 10:18 /acl#会在权限最后一位添加一个+号
[root@foundation0 acl]# getfacl /acl
getfacl: Removing leading '/' from absolute path names
# file: acl
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:group:admins:rwx
default:mask::rwx
default:other::r-x
与一般权限相比,多了以default开头的字段,表示这个目录默认值ACL权限
修改acl目录权限的default:other的权限配置为空:
[root@foundation0 acl]# setfacl -m d:o::-- /acl
[root@foundation0 acl]# getfacl /acl
getfacl: Removing leading '/' from absolute path names
# file: acl
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:group:admins:rwx
default:mask::rwx
default:other::---
修改目录acl default权限的mask权限配置为rw-:
[root@foundation0 acl]# setfacl -m d:m::rw- /acl
[root@foundation0 acl]# getfacl /acl
getfacl: Removing leading '/' from absolute path names
# file: acl
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x#effective:r--
default:group:admins:rwx#effective:rw-
default:mask::rw-
default:other::---
修改目录acl 的default组的admins的权限为r--
[root@foundation0 acl]# setfacl -m d:g:admins:r-- /acl
[root@foundation0 acl]# getfacl /acl
getfacl: Removing leading '/' from absolute path names
# file: acl
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:group:admins:r--
default:mask::r-x
default:other::---
[root@foundation0 acl]# setfacl -m d:g:admins:r-- /acl
[root@foundation0 acl]# getfacl /acl
getfacl: Removing leading '/' from absolute path names
# file: acl
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:group:admins:r--
default:mask::r-x
default:other::---
总结:
由以上修改实例可以看出,default权限所有的权限位都可以修改,修改格式为:
Default 缩写为d
Group缩写为g#d:g::r-x或d:g:admins:r--
Mask缩写为m#d:m::rw-
Other缩写为o#d:o::rw-
User缩写为u#d:u::rw-
: 或:: 按原样写
其它按原样写
删除acl权限
-x删除指定的ACL参数
[root@foundation0 acl]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
user:test:rw- #删除这个权限
group::r--
group:admins:rw-
mask::rw-
other::---
[root@foundation0 acl]# setfacl -x u:test test.txt#直接到用户就可以了,不要指定详细的权限值
[root@foundation0 acl]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
group::r--
group:admins:rw-
mask::rw-
other::---
删除默认的权限:
-k删除default的ACL参数
[root@foundation0 acl]# getfacl /acl
getfacl: Removing leading '/' from absolute path names
# file: acl
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:group:admins:rwx
default:mask::rwx
default:other::---#加粗为默认权限
[root@foundation0 acl]# setfacl -k /acl
[root@foundation0 acl]# getfacl /acl
getfacl: Removing leading '/' from absolute path names
# file: acl
# owner: root
# group: root
user::rwx
group::r-x
other::r-x#目录所有的默认权限已删除
删除所有的ACL
-b删除所有的ACL设置条目
[root@foundation0 acl]# ls
test.txt
[root@foundation0 acl]# ll
total 8
-rw-rw----+ 1 root root 20 Nov 28 10:18 test.txt
[root@foundation0 acl]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
group::r--
group:admins:rw-
mask::rw-#因添加ACL而添加的字段
other::---
[root@foundation0 acl]# setfacl -b test.txt
[root@foundation0 acl]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
group::r--
other::---
[root@foundation0 acl]# ls -al test.txt
-rw-r-----. 1 root root 20 Nov 28 10:18 test.txt#现在没有ACL字段,是普通的UGO权限