ACL访问控制列表
1. 前言引用
众所周知,在Linux操作系统中,传统的权限管理分是以三种身份(属主、属組以及其它人)搭配三种权限(可读、可写以及可执行),并且搭配三种特殊权限(SUID,SGID,STICKY),来实现对系统的安全保护。但是,随着业务和需求的发展和扩大,仅有的这种模式已经不能满足当前复杂环境下的权限控制需求。
比如,当前有一个/house目录,要求用户:james可以读写,用户:tom只能查看,用户:jack可以读写删除,此时怎么办呢?
对于以上的需求,仅仅依托现有的传统权限管理模式,是无法实现的。为了解决该类型的问题,Linux 开发出了一套新的文件系统权限管理方法,叫做 文件访问控制列表 ACL(Access Control Lists)。通过使用 ACL,可以完美解决如上类型的需求问题。
2. ACL定义
ACL 是 Access Control List 的缩写,主要目的是针对在传统的三种身份和三种权限之外,提供更加细化的局部权限设定。官方手册来讲,它主要针对用户、用户组、以及掩码方面控制权限。除了文件的所有者,所属组和其它人,可以对更多的用户设置权限。
简单去理解就是,ACL 可以针对单个用户、单个用户组来进行权限细化的控制。而在windows系统上,没有这个ACL,ACL是类Unix(Unix-like)操作系统权限的额外支持项目,因此要使用ACL必须要有文件系统的支持才行。
3. 那些文件系统支持ACL
Linux下的文件系统支持acl的有:ext2、ext3、ext4,xfs。
CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加
tune2fs –o acl /dev/sdb7
取消的方式 tune2fs -o ^acl /dev/sda7
mount –o acl /dev/sdb1 /mnt/test
取消的方式,重新挂载不指定。
ACL生效顺序:所有者,自定义用户,自定义组,其他人。先判断是否是文件的OWNER,如果是,则执行OWNER的权限后结束,如果不是OWNER,则判断是否是ACL的USER,如果是则执行USER权限后结束,如果不是ACL的USER, 则判断是否属于GROUP或ACL GROUP,如果是,则取最大权限。如果不属于任何GROUP,则执行OTHER。
所有人->所有组->其他人
4. 用法介绍
a.为多用户或组的文件和目录赋予访问权限rwx
• getfacl file|directory #查看文件的acl属性。
• setfacl -m u:wang:rwx file|directory #为文件设置acl的user属性。
• setfacl -Rm g:sales:rwX directory #为文件设置acl的group属性。
• setfacl -M file.acl file|directory #恢复acl属性
• setfacl -m g:salesgroup:rw file| directory #为文件设置acl的group属性。
• setfacl -m d:u:wang:rx directory #设置ACL默认权限,仅影响新创建的文件及目录,不影响当前。
• setfacl -x u:wang file|directory #删除一条默认权限,但是删除后,仍有属性(+)存在。
• setfacl -X file.acl directory # 批量删除acl属性。
b.ACL文件上的group权限是mask 值(自定义用户,自定义组,拥有组的最大权限) ,而非传统的组权限getfacl
可看到特殊权限: flags通过ACL赋予目录默认x权限, 目录内文件也不会继承x权限base ACL 不能删除
setfacl -k dir #删除默认ACL权限
setfacl –b file1 #清除所有ACL权限
getfacl file1 | setfacl --set-file=- file2 #复制file1的acl权限给file2
c.ACL文件上的group权限是mask 值(自定义用户,自定义组,拥有组的最大权限) ,而非传统的组权限
getfacl 可看到特殊权限: flags
通过ACL赋予目录默认x权限, 目录内文件也不会继承x权限
base ACL 不能删除
setfacl -k dir #删除默认ACL权限
setfacl –b file1 #清除所有ACL权限
getfacl file1 | setfacl --set-file=- file2 #复制file1
d. 备份和恢复ACL 主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p
参数。但是tar等常见的备份工具是不会保留目录和文件的ACL信息。
getfacl -R /tmp/dir1 > acl.txt
setfacl -R -b /tmp/dir1
setfacl -R --set-file=acl.txt /tmp/dir1
setfacl --restore acl.txt
getfacl -R /tmp/dir1的acl权限给file2。
- 示例描述
1.创建一个目录house,属主liubei,属组shuguo,权限设置755,组成员刘备、关羽、张飞,现在刘备写了一份密函(权限750),将其放在屋子里,关羽、张飞虽然能进入house进行查看,但是这个密函的owner和group都是刘备,所以两个人干着急,却看不了。现在需要你想个办法先让关羽能查看,张飞不能。
[root@localhost app]# ll
total 0
drwxr-xr-x. 2 liubei shuguo 20 Jul 29 17:18 house
[root@localhost app]# cat house/l_file
I am beibei !!!
切换到关羽下查看l_file内容,被拒绝。
[root@localhost app]# su - guanyu
Last login: Sat Jul 29 17:36:42 CST 2017 on pts/1
[guanyu@localhost ~]$ cat /app/house/l_file
cat: /app/house/l_file: Permission denied
现在利用acl赋予其r_x权限。
再切换到关羽下,查看,发现可以了。
[guanyu@localhost ~]$ cat /app/house/l_file
I am beibei !!!
然后在想个办法让他们两个都能查看。
2.要求在app目录下创建/app/dir1/dir2/dir3,dir1/file1,dir2/file2,dir3/file3,递归对文件dir1/dir2/dir3,dir1/file1,dir2/file2,dir3/file3设置acl的user为刘备,权限7,设置完后并清除acl属性,然后将其恢复。
[root@bogon app]# tree .
.
└── dir1
├── dir2
│ ├── dir3
│ │ └── file3
│ └── file2
└── file1
下图列出目录信息
下图列出文件信息
下面备份目录及其下所有文件的acl属性到acl.txt文件。
下面清除dir1及目录下的文件的acl属性。
[root@bogon app]# setfacl -Rb dir1/
[root@bogon app]# ll
total 4
-rw-r–r–. 1 root root 654 Jul 30 21:04 acl.txt
drwxr-xr-x. 3 root root 31 Jul 30 20:44 dir1 #发现‘+’号被清除了
接下来恢复文件的acl属性。
3.在/testdir/dir里创建的新文件自动属于g1组,组g2的成员如: alice能对这些新文件有读写权限,组g3的成员如: tom只能对新文件有读权限,其它用户(不属于g1,g2,g3)不能访问这个文件夹。
这个需要用到SGID权限设置g1组。
创建三个组g1,g2,g3:
[root@bogon /]# groupadd g1
[root@bogon /]# groupadd g2
[root@bogon /]# groupadd g3
创建文件/testdir/dir:
[root@bogon /]# mkdir -p /testdir/dir
当对一个目录作用了SGID权限之后,任何对该目录有wx权限的用户在该目录下创建的文件及目录的所有属均为该目录的所有组。
为dir设置SGID属性:
[root@bogon /]# chmod g+s /testdir/dir
设置alice的辅助组g2:
[root@bogon /]# useradd -G g2 alice
设置tom的辅助组g3:
[root@bogon /]# useradd -G g3 tom
可以看到group的x位置上面有个s(S代表无x权限)
[root@bogon /]# ll /testdir/
total 0
drwxr-sr-x. 2 root root 6 Jul 30 21:34 dir
其他人权限设置为无:
[root@bogon /]# chmod o= /testdir/dir/
对当前目录设置,使g1,g2对目录拥有rx权限:
[root@bogon testdir]# setfacl -m g:g2:rx,g:g3:rx dir/
设置ACL默认权限,仅影响新创建的文件及目录,不影响当前:
[root@bogon testdir]# setfacl -m d:g:g2:rw,d:g:g3:r dir/
4.在/app目录下创建一个名为d1的目录,要求其owner,group均为root,权限设置为755。要求guanyu用户对该目录及所有用户在其下创建的新文件新目录均有rwx权限。