Linux ACL 体验
一.ACL 简介
用户权限管理始终是 Unix 系统管理中最重要的环节。大家对 Linux/Unix 的 UGO 权限
管理方式一定不陌生,还有最常用的 chmod 命令。为了实现一些比较复杂的权限管理,
往往不得不创建很多的组,并加以详细的记录和区分。
可以针对某一个用户对某一文件指定一个权限,比如对某一个特定的文件,用户A可
以读取,用户B所在的组可以修改,惟独用户B不可以…于是就有了ACL的标准。所
谓ACL,就是Access Control List,一个文件/目录的访问控制列表,可以针对任意指定
的用户/组分配RWX权限。现在主流的商业Unix系统都支持ACL。FreeBSD也提供了
对ACL的支持。Linux在这个方面也不会落后,从2.6版内核开始支持ACL。
二.测试环境
CentOS 5.4 x86_64
三.准备工作
支持ACL需要内核和文件系统的支持。现在2.6内核都是可以支持ACL的。用自己工
作用的物理分区体验ACL,总是不明智的行为。万一误操作导致分区的损坏,造成数
据的丢失,损失就大了。作一个loop设备是个安全的替代方法。这样不需要一个单独
的分区,也不需要很大的硬盘空间,大约有个几百KB就足够进行我们的体验了。
步骤如下:
1.创建一个512KB的空白文件:
root@camlit ~: dd if=/dev/zero of=/opt/testptn count=512
512+0 records in
512+0 records out
262144 bytes (262 kB) copied, 0.020175 seconds, 13.0 MB/s
2.和一个loop设备联系在一起:
root@camlit ~: losetup /dev/loop0 /opt/testptn
3.创建一个EXT2的文件系统:
root@camlit ~: mke2fs /dev/loop0
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
32 inodes, 256 blocks
12 blocks (4.69%) reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
32 inodes per group
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 29 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
4.挂载新建的文件系统:
root@camlit ~: mount -o rw,acl /dev/loop0 /mnt
root@camlit ~: cd !$
root@camlit ~: ls
lost+found
root@camlit ~: mount |grep mnt
/dev/loop0 on /mnt type ext2 (rw,acl)
四.基本操作
1.增加和修改
首先创建一个文件作为实施ACL的对象:
root@camlit ~: cd /mnt
root@camlit ~: touch file1
root@camlit ~: ls -l file1
-rw-r--r-- 1 root root 0 Sep 8 10:49 file1
查看该文件默认的ACL,这是这个文件除了通常的UGO权限之外,并没有ACL:
root@camlit ~: getfacl file1
# file: file1
# owner: root
# group: root
user::rwgroup::
r--
other::r--
注意:
即使是不支持ACL的情况下,getfacl仍然能返回一个这样的结果,不过setfacl是不能
工作的。
下面添加几个用户和组,一会将使用ACL赋予他们不同的权限:
root@camlit ~: groupadd testg1
root@camlit ~: useradd testu1
root@camlit ~: useradd testu2
root@camlit ~: usermod -G testg1 testu1
现在我们看看testu1能做什么:
root@camlit ~: su testu1
testu1@camlit ~: echo "testu1" >> file1
bash: file1: Permission denied
失败了,因为file1不允许除了root以外的用户写。我们现在就通过修改file1的 ACL
来赋予testu1足够的权限。
root@camlit ~: setfacl -m u:testu1:rw file1
root@camlit ~: su testu1
testu1@camlit ~: echo “testu1” >> file1
testu1@camlit ~: cat file1
testu1
修改成功了,用户testu1可以对file1进行读写操作,再来看下file1的 ACL:
testu1@camlit ~: getfacl file1
# file: file1
# owner: root
# group: root
user::rwuser:
testu1:rwgroup::
r--
mask::rwother::
r--
我们ls看下:
testu1@camlit ~: ls -l file1
-rw-rw-r--+ 1 root root 7 Sep 8 11:19 file1
可以看到那个“+”了么?说明file1设置了ACL。
接下来修改testu1的权限,同时给testg1这个组以读的权限:
root@camlit ~: setfacl -m u:testu1:rwx,g:testg1:r file1
root@camlit ~: getfacl file1
# file: file1
# owner: root
# group: root
user::rwuser:
testu1:rwx
group::r--
group:testg1:r--
mask::rwx
other::r--
root@camlit ~: ls -l file1
-rw-rwxr--+ 1 root root 7 Sep 8 11:19 file1
这里有两个问题:首先file1的组权限从r-- 变成了rw-?其次mask又是什么?它为什么
也变化了?如果说acl的优先级高于UGO,那么mask就是一个名副其实的最后一道防
线。它决定了一个用户/组能够得到的最大的权限,这样,我们在不破坏已有的ACL的
定义的基础上,可以临时提高或降低安全级别:
root@camlit ~: setfacl -m mask::r file1
root@camlit ~: getfacl file1
# file: file1
# owner: root
# group: root
user::rwuser:
testu1:rwx #effective:r--
group::r--
group:testg1:r--
mask::r--
other::r--
root@camlit ~: ls -l file1
-rw-r--r--+ 1 root root 7 Sep 8 11:19 file1
从上面看到在testu1对应的ACL项的右边出现了effective 的字样,这是实际testu1得到
的权限,Mask只对其他用户和组的权限有影响,对owner和group的权限是没有任何
影响的。
2. 删除和覆盖
删除已有的ACL项:
root@camlit ~: setfacl -x g:testg1 file1
root@camlit ~: getfacl file1
# file: file1
# owner: root
# group: root
user::rwuser:
testu1:rwx
group::r--
mask::rwx
other::r--
可以看到testg1的权限已经被去掉了,如果需要去掉所有的ACL,可以使用-b选项:
root@camlit ~: setfacl -b file1
root@camlit ~: getfacl file1
# file: file1
# owner: root
# group: root
user::rwgroup::
r--
other::r--
可以使用- - set 设置新的ACL项,并把原来的ACL项全部覆盖掉,和-m不同,-m选
项只是修改已有的配置或是增加一些。如:
root@camlit ~: setfacl --set u::rw,u:testu1:rw,g::r,o::- file1
root@camlit ~: getfacl file1
# file: file1
# owner: root
# group: root
user::rwuser:
testu1:rwgroup::
r--
mask::rwother::---
注意:
o::-: 其完整的写法是other::-- ,正如u::rw的完整写法是user::rw-。通常可以把”-”省略,
但是当权限位只包含“-”时,必须至少保留一个,如果写成o::,就会出现错误。
如果希望对目录下的所有子目录都设置相同的ACL,可以使用 -R 参数。
3.目录的默认ACL
如果希望在一个目录中新建的文件和目录都使用同一个预定的ACL,那么可以使用默
认的ACL。在对一个目录设置了默认的ACL以后,每个在目录中创建的文件都会自动
继承目录的默认ACL作为自己的ACL。
如:
root@camlit ~: mkdir dir1
root@camlit ~: setfacl -d --set g:testg1:rwx dir1
root@camlit ~: 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设置了,创建一个文件试试:
root@camlit ~: touch dir1/file1
root@camlit ~: getfacl dir1/file1
# file: dir1/file1
# owner: root
# group: root
user::rwgroup::
r-x #effective:r--
group:testg1:rwx #effective:rwmask::
rwother::
r--
从上面了解到:
file1 自动继承了dir1对testg1设置的ACL,只是由于mask的存在使得testg1只能获得
rw-权限。
4.备份和恢复ACL
主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p参数。但是tar等
常见的备份工具不会保留目录和文件的ACL信息的。如果希望备份和恢复带有ACL的
文件和目录,可以先把ACL备份到一个文件里,然后使用-- restore选项来恢复这个文
件中保存的ACL信息:
root@camlit ~: getfacl -R dir1/ > dir1.acl
root@camlit ~: ls -l dir1.acl
-rw-r--r-- 1 root root 310 Sep 8 14:10 dir1.acl
我们使用-b选项来删除所有的ACL数据,来模拟从备份中恢复文件和目录:
root@camlit ~: setfacl -R -b dir1
root@camlit ~: getfacl -R dir1
# file: dir1
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
# file: dir1/file1
# owner: root
# group: root
user::rwgroup::
r--
other::r--
现在我们从dir1.acl中恢复被删除的ACL信息:
root@camlit ~: setfacl --restore dir1.acl
root@camlit ~: getfacl -R 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
# file: dir1/file1
# owner: root
# group: root
user::rwgroup::
r-x #effective:r--
group:testg1:rwx #effective:rwmask::
rwother::
r--
阅读(1963) | 评论(0) | 转发(1) |