Linux文件权限管理(访问控制列表)ACL | 您所在的位置:网站首页 › 查看文件权限属性的命令为 › Linux文件权限管理(访问控制列表)ACL |
ACL是Linux里面常见的概念但并不是Linux特有的。很多产品包括硬件都有ACL的概念,比如思科交换机路由器也有ACL。无论在什么地方看到ACL,它的名称既然叫访问控制列表那就是要实现控制功能的,确切的说ACL就是用来实现灵活的权限控制的。##### ACL的常用参数及使用格式## getfacl file |directory #查看ACL属性 setfacl -m u:uname:rwx file|directory #指定用户ACL权限 setfacl -M file.acl file|directory #通过调用文件的方式授予ACL权限 setfacl -m g:group:rw file| directory #指定组ACL权限 setfacl -m d:u:uname:rx directory #默认权限,此目录新建文件默认有ACL setfacl -x u:uname file |directory #删除用户ACL权限 setfacl -X file.acl directory #通过调用文件删除ACL setfacl -k dir #删除默认ACL权限 setfacl –b file1 #清除所有ACL权限 getfacl file1 | setfacl --set-file=- file2 #复制file1的acl权限给file2 --set #set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含 UGO的设置,不能象-m一样只是添加ACL就可以 示例:
setfacl --set u::rw,u:wang:rw,g::r,o::- file1
有的人说既然传统的属主(owner)、属组(group)、其他(other)读写执行管理已经实现了权限管理那这个ACL有什么意义呢?那是因为我们传统的权限控制还不够强大,功能还有很大所欠缺。为什么这样说呢?那我们新建一个文件testfile它的默认属性如下:
[13:58:54root@localhost data]#touch /data/testfile [13:59:13root@localhost data]#ll testfile -rw-r--r--. 1 root root 0 Mar 17 13:59 testfile 比方说我们现在有这么一个需求,我就希望属于other的“u1”用户对这个文件没有访问权限而不影响其他other成员的正常访问,如果直接把other权限给改了,那other的其他成员也无法访问该文件,影响范围太广了,结果很显然,系统默认的权限管理无法实现这个需求。
为什么系统默认的无法实现这功能呢?因为传统的权限设的太简陋了,它只有两个属性:第一所有者、第二所属组;根据这两个属性把访问文件的人只能分为简单的三类人:第一是文件所有者、第二是组的成员、第三是其他人,而上面的用户“u1”不属于这三类人属于第四类人。万一再来了个需求我不仅希望“u1”不能访问这个文件,还要“u2"能读写,还要“u3”只能读和执行...默认权限管理区分不出这么多人,所有它只能实现简单的权限分配。因为这种场景所以就引入了ACL。
ACL除了文件的所有者,所属组和其他人,可以对更多的用户,甚至可以支持不同的组来设置权限,可以设置你任意指定的某个人或组还设置权限。
那在传统权限管理无法满足的条件下,我们就以ACL来实现上面的需求,我们希望在不影响传统权限的情况下“u1”不能访问testfile: 首先确认下用户是否已创建
[15:40:46root@localhost data]#cat /etc/passwd|tail -1 u1:x:1009:1011::/home/u1:/bin/bash 查看文件原来的属性
[16:27:33root@localhost data]#ll testfile -rw-r--r--. 1 root root 0 Mar 17 13:59 testfile 设置“u1”对此文件权限为0(以八进制表示也可以用-表示)
[16:29:31root@localhost data]#setfacl -m u:u1:0 testfile 注意看赋予acl权限后和文件原本属性变化,other位后面多了个+号
[16:31:49root@localhost data]#ll testfile -rw-r--r--+ 1 root root 0 Mar 17 13:59 testfile 切换到属于other的“u1”查看是否具有相应的other权限,结果显然以ACL的权限优先,other权限已经没有了
[16:31:54root@localhost data]#su u1 [16:43:51u1@localhost data]$cat testfile cat: testfile: Permission denied 使用getfacl命令列出该文件的访问控制列表
[17:25:54u3@localhost data]$getfacl testfile # file: testfile # owner: root #该文件所有者 # group: root #该文件所属组 user::rw- #文件默认的权限属性 user:u1:--- #ACL指定u1用户的权限 group::r-- #文件默认所属组权限 mask::rwx #顾名思义 掩码起到遮掩作用 权限的线高位待会详细描述 other::r-- #文件默认other权限 ACL使用是不是非常灵活,想针对谁就针对谁,甚至还可以针对组设置,比如我们希望g1组的人对testfile具有读和写权限,只需要把用户附加组设给g1即可。
新建g1组并指定该组对testfile指定读写权限,新建用户u2并指定所属组为g1
[17:36:42root@localhost data]#groupadd g1 [17:36:54root@localhost data]#setfacl -m g:g1:rw testfile [17:37:44root@localhost data]#useradd -G g1 u2 [17:47:06root@localhost data]#id u2 uid=1012(u2) gid=1015(u2) groups=1015(u2),1014(g1) [17:47:12root@localhost data]#su u2 [17:47:23u2@localhost data]$cat testfile asdf [17:47:34u2@localhost data]$exit exit ACL优先级 ACL的优先级顺序是所有者>ACL自定义用户>ACL自定义组>其他人,当一个用户去访问某个文件的时候,它会判断访问此文件的人是不是所有者,如果是权限立即生效,后面不会再继续往后判断,如果不是那它继续判断访问者是否ACL指定的用户,如果是那ACL里面设置那用户的权限生效了,它就不往后看了,下面做个验证:把前面已经指定权限为0的u1放进g1组,看看u1是保留原来的0权限还是获得了g1组的rw-权限 先看看控制列表
[17:47:43root@localhost data]#getfacl testfile # file: testfile # owner: root # group: root user::rw- user:u1:--- #u1 group::r-- group:g1:rw- #g1 mask::rw- other::r-- 结果:u1加入了g1组后对testfile还是无访问权限,他没有得到g1组的rw-权限。
[17:48:35root@localhost data]#gpasswd -a u1 g1 Adding user u1 to group g1 [22:35:44root@localhost data]#id u1 uid=1009(u1) gid=1011(u1) groups=1011(u1),1014(g1) [22:36:03root@localhost data]#su u1 [22:36:25u1@localhost data]$cat testfile cat: testfile: Permission denied 想要用户u1获得g1的读写权限只有把原来用ACL指定的0权限删除了,使用-x参数删除:
[22:44:47root@localhost data]#setfacl -x u:u1 testfile [22:45:15root@localhost data]#su u1 [22:46:13u1@localhost data]$cat testfile asdf [22:46:20u1@localhost data]$echo m9l >>testfile mask 注意看testfile文件原来的group位,它已经不是我们一开始创建此文件时候的group用的了,看看是不是和下面的访问控制列表的mask权限一样?是的没错,原来ll列出来的group位已经被mask取代了。
[23:02:45root@localhost data]#ll testfile -rw-rw-r--+ 1 root root 9 Mar 17 22:47 testfile [23:02:59root@localhost data]#getfacl testfile # file: testfile # owner: root # group: root user::rw- user:u2:rw- group::r-- group:g1:rw- mask::rw- other::r-- mask权限用来做权限的限高的,所有自定义的用户和组都只能比它低而不能比它高,这有什么用呢?我们可能会遇到这样一种场景,我们针对了很多用户设置了ACL权限,读写执行各不相同难以管理。某天觉得这些用户的权限稍大了,要把他们的权限设小一点,如果用传统的方法一个个的手动设置太麻烦了十几个呢,那这时候mask的作用就体现出来了,我们只需要把mask设置小一点,因为所有人的权限只能比它低,就全降级了,那我们先来试试吧,真能起到这样的效果吗?
为了实验就先再多造两用户吧
[23:30:55root@localhost data]#cat /etc/passwd | tail -4 u1:x:1009:1011::/home/u1:/bin/bash u2:x:1010:1012::/home/u2:/bin/bash u3:x:1011:1015::/home/u3:/bin/bash u4:x:1012:1016::/home/u4:/bin/bash 然后指定大点的权限
[23:32:38root@localhost data]#setfacl -m u:u3:7 testfile [23:33:05root@localhost data]#setfacl -m u:u4:6 testfile 好了,先看看表,注意看mask权限是不是变大了,因为人为的设定的权限比mask的大了,它也随之往上加了
[23:33:25root@localhost data]#getfacl testfile # file: testfile # owner: root # group: root user::rw- user:u2:rw- user:u3:rwx user:u4:rw- group::r-- group:g1:rw- mask::rwx other::r-- 因为mask权限现在就是文件原所属组的权限,直接改了所属组也就改了mask
[23:33:38root@localhost data]# ll testfile -rw-rwxr--+ 1 root root 9 Mar 17 22:47 testfile 不过我们还是通过改ACL的mask来吧,还是用-m,设置所有用户权限为只读r,看到被限的用户的小尾巴没有?表面上给的权限再高的用户因为有了限高杆都超不过去,有效的只能是r--,所有用户的权限都降下来了,所以刚刚说的那个场景十几个用户我就不用一个个去设了,设置mask轻松解决了。
[23:41:37root@localhost data]#setfacl -m mask::r testfile [23:46:57root@localhost data]#getfacl testfile # file: testfile # owner: root # group: root user::rw- user:u2:rw- #effective:r-- user:u3:rwx #effective:r-- user:u4:rw- #effective:r-- group::r-- group:g1:rw- #effective:r-- mask::r-- other::r-- 当然这样设完以后本旨上它改动的就是group位的权限
[23:47:02root@localhost data]# ll testfile -rw-r--r--+ 1 root root 9 Mar 17 22:47 testfile 批量设置文件做还原备用 ACL大家在某些场景下用还是非常灵活的,至少比传统权限要方便,功能更加丰富而且还有一个问题,我们在某些场景下,比方说有一个目录里面有很多文件权限各不相同,有些应用需要把这目录的文件临时更改为777权限,这些文件被批量修改权限后需要撤销回归到原来的权限,传统的文件管理的话我们得把每个权限记下来而且还要一个一个改回去,下面模拟这样一个场景:
[00:37:42root@localhost data]#mkdir /data/dir [00:37:50root@localhost data]#touch dir/f{1..10} 假设每个文件的权限各不一样,懒得一个个改了= =
[00:38:23root@localhost data]#ll dir total 0 -rw-r--r--. 1 root root 0 Mar 18 00:38 f1 -rw-r--r--. 1 root root 0 Mar 18 00:38 f10 -rw-r--r--. 1 root root 0 Mar 18 00:38 f2 -rw-r--r--. 1 root root 0 Mar 18 00:38 f3 -rw-r--r--. 1 root root 0 Mar 18 00:38 f4 -rw-r--r--. 1 root root 0 Mar 18 00:38 f5 -rw-r--r--. 1 root root 0 Mar 18 00:38 f6 -rw-r--r--. 1 root root 0 Mar 18 00:38 f7 -rw-r--r--. 1 root root 0 Mar 18 00:38 f8 -rw-r--r--. 1 root root 0 Mar 18 00:38 f9 如果一个应用需要把这些权限各不一样的文件临时的改为777,我们用chmod递归把该目录的文件批量改的话后面要恢复就很麻烦,这时候ACL就用得着了,因为ACL也能用-R批量修改方式来设置权限,假设有个叫bin的服务账号
[01:00:51root@localhost data]#setfacl -R -m u:bin:rwx dir 这样设完以后bin这个服务就对这个目录有了完全的控制权限
[01:01:13root@localhost data]#getfacl dir # file: dir # owner: root # group: root user::rwx user:bin:rwx group::r-x mask::rwx other::r-x 包括该目录下的所有文件
[01:01:55root@localhost data]#getfacl dir/f1 # file: dir/f1 # owner: root # group: root user::rw- user:bin:rwx group::r-- mask::rwx other::r-- 当做完实验或者做完配置了bin这个服务不用了,我们可以把可以把ACL属性清除批量还原原来的文件属性。 有+号代表有ACL属性
[01:02:12root@localhost data]#ll dir/f1 -rw-rwxr--+ 1 root root 0 Mar 18 00:38 dir/f1 虽然可以使用-x参数删除bin的权限,但是它的ACL属性还存在。
[01:14:49root@localhost data]#setfacl -x u:bin dir/f1 [01:14:58root@localhost data]#getfacl dir/f1 # file: dir/f1 # owner: root # group: root user::rw- group::r-- mask::r-- other::r-- 注意它的加号还有,说明这种删除它没能完全清除上面的ACL属性只是清除了特定的权限而已
[01:15:22root@localhost data]#ll dir/f1 -rw-r--r--+ 1 root root 0 Mar 18 00:38 dir/f1 彻底删除上面的ACL属性要使用-b选项,+消失了
[01:16:18root@localhost data]#setfacl -b dir/f1 [01:27:21root@localhost data]#ll dir/f1 -rw-r--r--. 1 root root 0 Mar 18 00:38 dir/f1 那有了这个-b我们就省事了,那我做完所有的操作了我想把这个权限回归
[01:29:45root@localhost data]#setfacl -R -b dir/ [01:29:57root@localhost data]#ll dir/ total 0 -rw-r--r--. 1 root root 0 Mar 18 00:38 f1 -rw-r--r--. 1 root root 0 Mar 18 00:38 f10 -rw-r--r--. 1 root root 0 Mar 18 00:38 f2 -rw-r--r--. 1 root root 0 Mar 18 00:38 f3 -rw-r--r--. 1 root root 0 Mar 18 00:38 f4 -rw-r--r--. 1 root root 0 Mar 18 00:38 f5 -rw-r--r--. 1 root root 0 Mar 18 00:38 f6 -rw-r--r--. 1 root root 0 Mar 18 00:38 f7 -rw-r--r--. 1 root root 0 Mar 18 00:38 f8 -rw-r--r--. 1 root root 0 Mar 18 00:38 f9 备份和恢复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 |
CopyRight 2018-2019 实验室设备网 版权所有 |