分类: LINUX
2018-06-07 16:23:50
【摘要】
对于Linux的文件权限控制,我们并不能像windows那样灵活设置多个用户的访问权限,普遍使用的UGO权限管理方式只能对属主、同组用户和其他组用户进行权限管理,很难对每个用户或用户组进行权限管理。ACL就是为了这种局限性而生的。
ACL(Access Control List, 访问控制列表),它是对UGO权限管理的方式进行了扩展,可以对任意的用户/组分配读、写和执行权限。
本文转自-学领未来
当一个文件创建后,它具有读(r)、写(w)、执行(x)三种操作方式。UGO权限管理方式将访问文件的操作者简单分为三类:文件属主(u)、同组用户(g)与其他组用户(o)。
文件的三种操作方式用三个二进制位表示,第一位表示读权限,第二位表示写权限,第三位表示执行权限。一个文件的权限属性就是有三类用户对该文件的权限使能的集合。当我们用ls查看一个文件的时候,会显示如下结果:
[root@racdg /]# touch test
[root@racdg /]# ll
-rwxr-xr-- 2 root root 4096 Dec 28 13:13 test
最前面的’-’,表示文件为目录类型
第一组的‘rwx’,表示文件属主对文件具有读、写和执行权限
第二组的‘r-x’,表示同组其他用户对文件具有读和执行权限,但没有写权限
第三组的’r--’,表示其他组用户对文件具有读权限,但没有写权限和执行权限
这个时候其他用户是不能对这个文件进行修改的,尝试使用Oracle用户进行修改:
[oracle@racdg ~]$ id oracle
uid=202(oracle) gid=201(oinstall) groups=201(oinstall),202(dba)
[oracle@racdg ~]$ vim test
E45: 'readonly' option is set (add ! to override)
按照一般的方法,我们可以使用chmod和chown命令对该文件权限进行修改,但是如果涉及多个用户,而且要求对一部分用户只有只读权限,另一部分用户有读写权限的时候,就会发现权限位是不够的,那么这个时候就可以使用ACL了。
首先看一下几种类型
类型 |
定义 |
ACL_USER_OBJ |
文件属主的权限 |
ACL_USER |
额外用户的权限 |
ACL_GROUP_OBJ |
文件属组的权限 |
ACL_GROUP |
额外组的权限 |
ACL_MASK |
ACL_USER、ACL_GROUP_OBJ,ACL_GROUP的最大权限 |
ACL_OTHER |
其他组的权限 |
设置ACL的命令是setfacl,-m选项表示修改acl规则:
使用方式是# setfacl -m {u|g}:{user|group}:rwx file
u表示设置ACL_USER的权限,g表示修改ACL_GROUP的权限
查看当前test文件的属性:
[root@racdg tmp]# getfacl test
# file: test
# owner: root
# group: root
user::rw-
group::r--
other::r—
现在将文件的读、写、执行权限授予Oracle用户,同时不修改该文件的属主、属组。
[root@racdg tmp]# setfacl -m u:oracle:rwx test
[root@racdg tmp]# ll
-rw-rwxr--+ 1 root root 8 Dec 28 13:36 test
[root@racdg tmp]# getfacl test
# file: test
# owner: root
# group: root
user::rw- //ACL_USER_OBJ
user:oracle:rwx //ACL_USER
group::r-- //ACL_GROUP
mask::rwx //ACL_MASK
other::r— //ACL_OTHER
这个时候oracle就可以对这个文件进行读写操作了。
可以看到,当设置ACL规则后,ls 查看权限位,在权限位后增加了一个’+’号,这个也方便我们以后在判断文件权限的时候做个参考。
ACL权限删除:
[root@racdg tmp]# setfacl -x u:oracle test
[root@racdg tmp]# getfacl test
# file: test
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--
最近在客户处接到个需求,就是搭建一个sftp服务器供文件的读取和下载,但是每个用户的权限不尽相同。如图,A用户需要对fileA有读写权限,对fileB有读权限;B用户需要对fileB有读写权限,对fileA有读权限;而C用户需要对fileA和fileB都要有读权限。对于这个需求,我曾经尝试通过用户组的方式控制权限,但是绞尽脑汁还是满足不了需求,然后通过ACL的方式,几条命令就解决了一开始以为非常棘手的问题:
[root@racdg tmp]# setfacl -R -m u:userA:rwx fileA
[root@racdg tmp]# setfacl -R -m u:userA:rx fileB
[root@racdg tmp]# setfacl -R -m u:userB:rwx fileB
[root@racdg tmp]# setfacl -R -m u:userB:rx fileA
[root@racdg tmp]# setfacl -R -m u:userC:rx fileA
[root@racdg tmp]# setfacl -R -m u:userC:rx fileB