17692620657
17692620657
北京上门维修电脑 维修电脑电话:17692620657
您的位置:首页 > 新闻动态 > 企业新闻 >

新闻动态

联系我们

北京电脑维修公司

地址:北京天洋城广场
手机:17692620657

咨询热线17692620657

linux权限控制之ACL

发布时间:2019-05-07 21:16人气:

linux权限控制之ACL
 
ACL,就是Access Control List,一个文件/目录的访问控制列表,可以针对任意指定的用户/组分配RWX权限
 
用户权限管理始终是 Unix 系统管理中最重要的环节。大家对 Linux/Unix 的 UGO 权限管理方式一定不陌生,还有最常用的 chmod 命令。为了实现一些比较复杂的权限管理,往往不得不创建很多的组,并加以详细的记录和区分(很多时候就是管理员的噩梦)。可以针对某一个用户对某一文件指定一个权限,恐怕管理员都期待的功能。比如对某一个特定的文件,用户A可以读取,用户B所在的组可以修改,惟独用户B不可以……。于是就有了IEEE POSIX 1003.1e这个ACL的标准。所谓ACL,就是Access Control List,一个文件/目录的访问控制列表,可以针对任意指定的用户/组分配RWX权限。现在主流的商业Unix系统都支持ACL。FreeBSD也提供了对ACL的支持。Linux在这个方面也不会落后,从2.6版内核开始支持ACL。
 
准备工作:
 
支持ACL需要内核和文件系统的支持。现在2.6内核配合EXT2/EXT3, JFS, XFS, ReiserFS等文件系统都是可以支持ACL的。用自己工作用的物理分区体验ACL,总是不明智的行为。万一误操作导致分区的损坏,造成数据的丢失,损失就大了。作一个loop设备是个安全的替代方法。这样不需要一个单独的分区,也不需要很大的硬盘空间,大约有个几百KB就足够进行我们的体验了。OK,下面我使用Fedora Core 5和Ext3文件开始对Linux的ACL的体验。
 
首先创建一个512KB的空白文件:
 
#dd if=/dev/zero of=/opt/testptn bs=1k count=512
 
和一个loop设备联系在一起:
 
#losetup /dev/loop1 /opt/testptn
 
创建一个ext3文件系统
 
#mkfs.ext3 /dev/loop1
 
挂载此文件系统,在挂载时需要告知内核在此设备中使用acl
 
#mount -o rw,acl /dev/loop1 /mnt
 
现在我已经得到了一个小型的文件系统。而且是支持ACL的。并且即使彻底损坏也不会影响硬盘上其他有价值的数据。可以开始我们的ACL体验之旅了。
 
首先新建一个文件作为实施ACL的对象:
 
#touch file1
 
#ll file1
 
然后看一下这个文件缺省的ACL ,这时这个文件除了通常的UGO权限外,并没有ACL
 
#getfacl file1
#file:file1
#owner:root
#group:root
user::rw-
group::r--
other::r--
 
注意:即使是不支持ACL的情况下,getfacl仍然返回一个这样的结果,不过setfacl是不能工作的。
 
下面添加几个用户和用户组,一会我将使用ACL赋予他们不同的权限:
 
#useradd ceshi1
#useradd ceshi2
#useradd ceshi3
#groupadd ceshi
#usermod -G ceshi ceshi1 ceshi2 ceshi3
 
在目前情况下,新建的用户没有权限在file1中操作
 
现在我们对file1的ACL赋予ceshi1足够的权限
 
#setfacl -m u:ceshi1:rw file1
#su - ceshi1
#echo "ceshi1" >>file1
#cat file1
 
显示修改成功,用户ceshi1可以对file1做读写操作,我们来看一下file1的ACL
 
#getfacl file1
#file:file1
#owner:root
#group:root
user::rw-
user:ceshi1:rw-
group::r--
mask::rw-
other::r--
 
ll file1
-rw-rw-r--+ root root
 
权限后面有个‘+’这个说明file1设置了ACL,接下来我们修改一下ceshi1的权限,同时给ceshi这个组读的权限
 
#setfacl -m u:ceshi1:rwx,g:ceshi:r file1
#getfacl file1
#file:file1
#owner:root
#group:root
user::rw-
user:ceshi1:rwx
group::rw-
group:ceshi:r--
mask::rwx
other::r--
 
可以看到设置后的权限,ceshi1已经有了执行的权限,而ceshi这个组也获得了读取文件内容的权限。也许有人已经注意到了两个问题:首先, file1的组权限从r--变成了rw-。其次,mask是什么?为什么也变化了呢?我们先从mask说起。如果说acl的优先级高于UGO,那么 mask就是一个名副其实的最后一道防线。它决定了一个用户/组能够得到的最大的权限。这样我们在不破坏已有ACL的定义的基础上,可以临时提高或是降低安全级别:
 
#setfacl -m mask::r file1
#getfacl file1
#file:file1
#owner:root
#group:root
user::rw-
user:ceshi1:rwx    #effective:r--
group::r--
group:ceshi:r--
mask::r--
other::r--
 
在ceshi1对应的ACL项的后边出现了effective的字样,这是实际ceshi1得到的权限。Mask只对其他用户和组的权限有影响,对owner和other的权限是没有任何影响的。执行ls的结果也显示UGO的设置也有了对应的变化。因为在使用了ACL的情况下,group的权限显示的就是当前的mask。通常我们把mask设置成rwx,以不阻止任何的单个ACL项。
 
*需要注意的是,每次修改或添加某个用户或组的ACL项的时候,mask都会随之修改以使最新的修改能够真正生效。所以如果需要一个比较严格的mask的话,可能需要每次都重新设置一下mask。
 
体验2 - ACL的其他功能:删除和覆盖
 
如何删除已有的ACL项?
 
#setfacl -x g:ceshi file1
#getfacl file1
#file:file1
#owner:root
#group:root
user::rw-
user:ceshi1:rwx
group::r--
mask::rwx
other::r--
 
删除了ceshi组的权限 ,如果需要去除所有ACL权限,也可以使用-b选项,所有的ACL都会被删除
 
#setfacl -d file1
#getfacl file1
#file:file1
#owner:root
#group:root
user::rw-
group::r--
other::r--
 
我们可以用--set设置一些新的ACL项,并把原有的ACL项全部覆盖掉,和-m不同,-m选项只是修改已有的配置或是新增加一些,--set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含UGO的设置,不能象-m一样只是添加ACL就可以了。如:
 
#setfacl --set u::rw,u:ceshi1:rw,g::r,o::- file1
#getfacl file1
#file:file1
#owner:root
#group:root
user::rw-
user:ceshi1:rw-
group::r--
mask::rw-
other::---
 
o::-的完整写法是other::---,通常我们可以把“-”省掉,但是当权限位只包含一个“-”必须至少保留一个
 
如果希望对目录下的所有子目录都设置同样的ACL,可以使用-R参数:
 
#setfacl --set -R u::rw,u:ceshi1:rw,g::r,o::- dir1    ??
 
 
如果希望从一个文件读入ACL,并修改当前的文件的ACL,可以用-M参数:
 
#cat test.acl
user:testu1:rw-
user:testu2:rw-
group:testg1:r--
group:testg2:r--
mask::rw-
other::---
 
如果我们希望在一个目录中新建的文件和目录都是用一个预定的ACL,那么我们可以使用默认(default)ACL。在对一个目录设置了默认的ACL以后,每个在目录中创建的文件会自动继承目录的默认ACL作为自己的ACL。用setfacl的-d选项可以做到这一点:
 
#setfacl -d --set g:ceshi:rwx dir1
#getfacl dir1
# file: dir1
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:group:testg1:rwx
default:mask::rwx
default:other::r-x
 
默认ACL已经被设置,建立一个文件试试:
 
#touch dir1/file1
#getfacl /dir1/file1
#owner:root
#group:root
user::rw-
group::r-x                      #effective:r--
group:ceshi:rwx                #effective:rw-
mask::rw-
other::r--
 
file1自动继承了dir1对testg1设置的ACL。只是由于mask的存在使得testg1只能获得rw-权限
 
体验4 - 备份和恢复ACL
 
 

推荐资讯

17692620657