在Linux一般权限管理中,对文件的访问可以通过控制该文件的(目录)属主、属组和其他人三个用户角色进行;每种用户身份拥有读(read)、写(write)和执行(execute)三种权限。但是在实际工作中,这三种身份实在是无法满足精细的权限控制要求。请看下面的例子。
drwxrwx--- 45 user1 group1 12288 Feb 25 16:48 /project/
以上根目录下有一个 /project/ 目录,user1用户和在group1组中的用户都有访问和修改权限,但如果有另外一个用户user2需要有访问权限(rx)且不能有修改权限如该何操作呢?给other用户rx权限和将user2加入到group1组都不是好的选择。能不能单独给user2授权/project/目录的访问权限呢?是可以的,这时就要用到ACL权限了。
ACL是Access Control List(访问控制列表)的缩写,在Linux系统中,ACL用于设定用户针对文件的权限。路由器中也有ACL的概念,但和我们这里讲的ACL并不相同。
开启ACL权限
ACL需要文件系统支撑,ACL的开启由挂载参数决定的。在 CentOS 6.x 系统中 ACL 权限默认是开启的,不需要手工开启。那该如何查看 ACL 权限是否开启了呢?可以这样查看:
1 [root@CentOS release 6.5 ~]# dumpe2fs -h /dev/mapper/vg_root-lv_root 2 dumpe2fs 1.41.12 (17-May-2010) 3 Filesystem volume name: <none> 4 Last mounted on: / 5 Filesystem UUID: 391a5a62-13d3-4f4f-a312-d46490508500 6 Filesystem magic number: 0xEF53 7 Filesystem revision #: 1 (dynamic) 8 Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize 9 Filesystem flags: signed_directory_hash 10 Default mount options: user_xattr acl 11 Filesystem state: clean 12 Errors behavior: Continue 13 Filesystem OS type: Linux
略……
#dumpe2fs是查询指定分区文件系统详细信息的命令,只支撑ext*类的文件系统。
其中,dumpe2fs 命令可选的选项及其含义如下:
- -h:仅显示超级块中的信息,而不显示磁盘块组的详细信息;
使用 dumpe2fs 命令可以査看到这个分区文件系统的详细信息。dmpe2fs命令输出结果中 Default mount options: user_xattr acl 显示分区/dev/mapper/vg_root-lv_root的默认挂载选项包括acl,所以不需要额外操作。
如果我们的Linux文件系统不支持ACL权限可以加用如下命令添加:
[root@localhost ~]# mount -o remount,acl / #重新挂载对应分区,并加入ACL权限参数
使用 mount 命令重新挂载加入 的ACL 权限,临时有效,系统重启后挂载参数还是原来的。要想永久生效,需要修改 /etc/fstab 文件,命令如下:
[root@localhost ~]#vi /etc/fstab UUID=56e5d02a-2fa6-40a8-b4ac-374407905c59 /ext4 defaults,acl 1 1 #defaults后加入ACL权限,用逗号分隔 [root@localhost ~]# mount -o remount / #重新挂载文件系统或重启系统,使修改生效
建议采用修改/etc/fstab再remount的方式,可以验证fstab配置对不对,有问题可及时修改,避免fstab配置有错误导致重启无法开机或分区无法挂载等意外情况。
ACL权限设置
1、ACL权限管理命令
现在分区已经支持ACL了,管理ACL权限主要涉及两个命令查看ACL(getfacl)和设置ACL(setfacl),下面我们先了解下这两个命令的语法:
[root@localhost ~]# getfacl 文件名 #查看ACL权限 [root@localhost ~]# setfacl 选项 文件名 #设定ACL权限
setfacl 选项:
- -m:设定 ACL 权限。如果是给予用户 ACL 权限,则使用"u:用户名:权限"格式赋予;如果是给予组 ACL 权限,则使用"g:组名:权限" 格式赋予;
- -x:删除指定的 ACL 权限;
- -b:删除所有的 ACL 权限;
- -d:设定默认 ACL 权限。只对目录生效,指目录中新建立的文件拥有此默认权限;
- -k:删除默认 ACL 权限;
- -R:递归设定 ACL 权限。指设定的 ACL 权限会对目录下的所有子文件生效;
# setfacl -h setfacl 2.2.51 -- set file access control lists Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ... -m, --modify=acl modify the current ACL(s) of file(s) -M, --modify-file=file read ACL entries to modify from file -x, --remove=acl remove entries from the ACL(s) of file(s) -X, --remove-file=file read ACL entries to remove from file -b, --remove-all remove all extended ACL entries -k, --remove-default remove the default ACL --set=acl set the ACL of file(s), replacing the current ACL --set-file=file read ACL entries to set from file --mask do recalculate the effective rights mask -n, --no-mask don't recalculate the effective rights mask -d, --default operations apply to the default ACL -R, --recursive recurse into subdirectories -L, --logical logical walk, follow symbolic links -P, --physical physical walk, do not follow symbolic links --restore=file restore ACLs (inverse of `getfacl -R') --test test mode (ACLs are not modified) -v, --version print version and exit -h, --help this help text
2、给用户添加ACL权限
针对某个文件或目录设置特定用户对其的特定访问权限。
[root@localhost ~]# ll -d /project/ #查看 /project/ 当前的权限状态
drwxrwx--- 2 root sys 4096 1月19 05:21 /project/
#给user2分配rx权限 [root@localhost ~]# setfacl -m u:user2:rx /project/ #给用户user2赋予r-x权限,使用"u:用户名:权限" 格式
[root@localhost ~]# ll -d /project/ drwxrwx---+ 3 root sys 4096 1月19 05:22 project/ #使用ls-l査询时会发现,在权限位后面多了一个"+",表示此目录拥有ACL权限 [root@localhost ~]# getfacl /project #查看/prpject目录的ACL权限 #file: /project <-文件名 #owner: root <-文件的属主 #group: sys <-文件的属组 user::rwx <-用户名栏是空的,说明是属主的权限 user:user2:r-x <-用户user2的权限 group::rwx <-组名栏是空的,说明是属组的权限 mask::rwx <-mask权限 other::--- <-其他人的权限
可以看到虽然user2不是/project目录的属主、属组和other用户,作为一个特殊的用户对该目录拥有了访问权限。
3、给用户组添加ACL权限
除了可以给用户添加ACL权限,也可以给用户组添加ACL权限,用于控制这个组中的用户对某个文件或目录的权限。
[root@localhost /]# setfacl -m g:group2:rwx project/ #为组group2纷配ACL权限,使用"g:组名:权限"格式 [root@localhost /]# ll -d project/ drwxrwx---+ 2 root sys 4096 1月19 06:21 project/ #属组并没有更改 [root@localhost /]# getfacl project/ #file: project/ #owner: root #group: sys user::rwx user:user2:r-x group::rwx group:group2:rwx <-用户组group2拥有了rwx权限 mask::rwx other::--
4、最大有效权限mask
mask 是用来指定最大有效权限的。mask 的默认权限是 rwx。其他用户或组的有效权限都是和mask权限相与得到的。如果mask权限是r--,则不管user2的权限是多少那么他的最大权限也不会超过r--。例:user2的权限是r-x,其有效权限是r-- 与 r-x结果是r--,这个比较容易理解。
修改mask权限的命令:
[root@localhost /]# setfacl -m m:rx /project #设定mask权限为r-x,使用"m:权限"格式 [root@localhost /]# getfacl /project #file:project/ #owner:root #group:sys user::rwx group::rwx #effective:r-x mask::r-x #mask权限变为r-x other::--
5、默认ACL权限
给 /project 目录设定了 ACL 权限,在这个目录中新建一些子文件和子目录,是不会继承父目录的 ACL 权限的。如果我们希望在这个目录下新创建文件也有对应的ACL权限,除了手动授权以外,还有更好的方法。
默认 ACL 权限的作用是:如果给父目录设定了默认 ACL 权限,那么父目录中所有新建的子文件都会继承父目录的 ACL 权限。默认 ACL 权限只对目录生效。命令如下:
[root@localhost /]# setfacl -m d:u:user2:rx /project/ #使用"d:u:用户名:权限"格式设定默认ACL权限 [root@localhost project]# getfacl project/ # file: project/ # owner: root # group: sys user:: rwx user:user2:r-x group::rwx group:group2:rwx mask::rwx other::-- default:user::rwx <-多出了default字段 default:user:st:r-x default:group::rwx default:mask::rwx default:other::-- [root@localhost /]# cd project/ [root@localhost project]# touch testfile [root@localhost project]# mkdir testdir [root@localhost project]# ll 总用量8-rw-rw----+ 1 root root 02月19 06:33 testfile drwxrwx---+ 2 root root 4096 1月19 06:34 testdir
可以看到在/project/下新创建的文件和目录testfile、testdir 继承了父目录用户user2的ACL权限。
6、递归ACL权限
递归是指父目录在设定 ACL 权限时,所有的子文件和子目录也会拥有相同的 ACL 权限。
[root@localhost project]# setfacl -m u:user2:rx -R /project/ #-R递归
7、删除ACL权限
删除指定的ACL权限:
[root@localhost /]# setfacl -x u:user2 /project/ #删除指定用户和用户组的ACL权限 [root@localhost /]# getfacl project/ # file:project/ # owner: root # group: sys user::rwx group::rwx group:group2:rwx mask::rwx other::--
user2用户的权限已被删除
删除所有ACL权限:
[root@localhost /]# setfacl -b /project #删除文件的所有ACL权限 [root@localhost /]# getfacl /project #file: project/ #owner: root # group: sys user::rwx group::rwx other::--
可以看到所有ACL权限已被删除
总结:1、当要给某个用户或用户组分配特殊权限时可用ACL
2、ACL权限需要分区支持
3、除了给用户和组设置ACL权限外还可以设置默认ACL权限和mask权限