分类: LINUX
2008-09-19 16:49:56
Fang Yunlin(Alin Fang)
MSN:
G Talk:
Blog: http://www.alinblog.cn/
这个是我自己的学习笔记。由于自己水平有限,并不代表我说的一定是对的。如果发现错误,希望能联系我更正。谢谢哦。
19 Sep, 2008
第三次修改
GNU
Red Hat Enterprise Linux 5 udpate 2
这是我的fstab
[root@localhost ~]# cat /etc/fstab
LABEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
LABEL=SWAP-sda2 swap swap defaults 0 0
/dev/sdb1 /mnt/sdb1 ext3 defaults 0 0
[root@localhost ~]#
这个是我的挂载情况:
[root@localhost ~]# mount
/dev/sda3 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sdb1 on /mnt/sdb1 type ext3 (rw)
[root@localhost ~]#
我现在要做一个试验:
[root@dhcp-0-157 ~]# useradd user1; echo redhat | passwd --stdin user1;
Changing password for user user1.
passwd: all authentication tokens updated successfully.
[root@dhcp-0-157 ~]# useradd user2; echo redhat | passwd --stdin user2;
Changing password for user user2.
passwd: all authentication tokens updated successfully.
[root@dhcp-0-157 ~]# groupadd public
[root@dhcp-0-157 ~]# cd /mnt/sdb1/
[root@dhcp-0-157 sdb1]# mkdir dir1
[root@dhcp-0-157 sdb1]# ll
total 4
drwxr-xr-x 2 root root 4096 Sep 18 11:59 dir1
[root@dhcp-0-157 sdb1]# chgrp public dir1/
[root@dhcp-0-157 sdb1]# chmod 775 dir1
[root@dhcp-0-157 sdb1]# ll
total 4
drwxrwxr-x 2 root public 4096 Sep 18 11:59 dir1
[root@dhcp-0-157 sdb1]# usermod -G public user1
[root@dhcp-0-157 sdb1]# id user1
uid=500(user1) gid=500(user1) groups=500(user1),502(public)
[root@dhcp-0-157 sdb1]# id user2
uid=501(user2) gid=501(user2) groups=501(user2)
[root@dhcp-0-157 sdb1]#
目录dir1的权限是775,也就是对于属于public组的人都有rwx权限。
而用户user1属于public组。
我们可以简单测试一下用户user1和用户user2对目录dir1的权限:
[root@dhcp-0-157 sdb1]# su user1
[user1@dhcp-0-157 sdb1]$ pwd
/mnt/sdb1
[user1@dhcp-0-157 sdb1]$ touch dir1/file1
[user1@dhcp-0-157 sdb1]$ ls dir1
file1
[user1@dhcp-0-157 sdb1]$ exit
exit
[root@dhcp-0-157 sdb1]# su user2
[user2@dhcp-0-157 sdb1]$ pwd
/mnt/sdb1
[user2@dhcp-0-157 sdb1]$ touch dir1/file2
touch: cannot touch `dir1/file2': Permission denied
[user2@dhcp-0-157 sdb1]$ exit
exit
[root@dhcp-0-157 sdb1]#
我们重新确认一下权限:
[root@dhcp-0-157 sdb1]# ll
total 4
drwxrwxr-x 2 root public 4096 Sep 18 12:10 dir1
[root@dhcp-0-157 sdb1]# id user1
uid=500(user1) gid=500(user1) groups=500(user1),502(public)
[root@dhcp-0-157 sdb1]# id user2
uid=501(user2) gid=501(user2) groups=501(user2)
[root@dhcp-0-157 sdb1]#
我们可以得出这么一个结论:
因为dir1目录具有组rwx权限,且dir1属于public组。
同时user1属于public组。
所以user1对dir1具有rwx权限。
上面情况并没有对/dev/sdb1分区添加acl支持。
============================Open Source的分割线==========================
现在我们做另一个试验:
对/dev/sdb1启动acl支持。
[root@dhcp-0-157 sdb1]# vim /etc/fstab
LABEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
LABEL=SWAP-sda2 swap swap defaults 0 0
/dev/sdb1 /mnt/sdb1 ext3 defaults,acl 0 0
~
[root@dhcp-0-157 sdb1]# mount -o remount /dev/sdb1
[root@dhcp-0-157 sdb1]# mount
/dev/sda3 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sdb1 on /mnt/sdb1 type ext3 (rw,acl)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
[root@dhcp-0-157 sdb1]#
然后做如下操作:
[root@dhcp-0-157 sdb1]# pwd
/mnt/sdb1
[root@dhcp-0-157 sdb1]# mkdir dir2
[root@dhcp-0-157 sdb1]# chgrp public dir2
[root@dhcp-0-157 sdb1]# chmod 000 dir2
[root@dhcp-0-157 sdb1]# id user1
uid=500(user1) gid=500(user1) groups=500(user1),502(public)
[root@dhcp-0-157 sdb1]# id user2
uid=501(user2) gid=501(user2) groups=501(user2)
[root@dhcp-0-157 sdb1]# ll
total 24
drwxrwxr-x 2 root public 4096 Sep 18 13:24 dir1
d--------- 2 root public 4096 Sep 18 15:48 dir2
drwx------ 2 root root 16384 Sep 18 13:21 lost+found
[root@dhcp-0-157 sdb1]#
用用户user1和用户user2尝试访问:
[root@dhcp-0-157 sdb1]# su user1
tou[user1@dhcp-0-157 sdb1]$ touch dir2/file1
touch: cannot touch `dir2/file1': Permission denied
[user1@dhcp-0-157 sdb1]$ exit
exit
[root@dhcp-0-157 sdb1]# su user2
[user2@dhcp-0-157 sdb1]$ touch dir2/file2
touch: cannot touch `dir2/file2': Permission denied
[user2@dhcp-0-157 sdb1]$ exit
exit
[root@dhcp-0-157 sdb1]#
意料之中,无权访问目录dir2.
现在我们对其使用acl。
[root@dhcp-0-157 sdb1]# su user1
[user1@dhcp-0-157 sdb1]$ touch dir2/file1
[user1@dhcp-0-157 sdb1]$ ls dir2
file1
[user1@dhcp-0-157 sdb1]$ exit
exit
[root@dhcp-0-157 sdb1]# su user2
[user2@dhcp-0-157 sdb1]$ touch dir2/file2
touch: cannot touch `dir2/file2': Permission denied
[user2@dhcp-0-157 sdb1]$ exit
exit
[root@dhcp-0-157 sdb1]#
用户user1已经对dir2目录具有控制权限。
但是,请注意:
[root@dhcp-0-157 sdb1]# ll
total 28
drwxrwxr-x 2 root public 4096 Sep 18 13:24 dir1
d---rwx---+ 2 root public 4096 Sep 18 16:01 dir2
drwx------ 2 root root 16384 Sep 18 13:21 lost+found
[root@dhcp-0-157 sdb1]#
请注意,对dir2目录设置了acl之后,目录的group权限变了。
于是我们再做如下尝试:
[root@dhcp-0-157 sdb1]# id user1
uid=500(user1) gid=500(user1) groups=500(user1),502(public)
[root@dhcp-0-157 sdb1]# id user2
uid=501(user2) gid=501(user2) groups=501(user2)
[root@dhcp-0-157 sdb1]# usermod -G public user2
[root@dhcp-0-157 sdb1]# id user2
uid=501(user2) gid=501(user2) groups=501(user2),502(public)
[root@dhcp-0-157 sdb1]#
OK,貌似user1和user2都有对dir2的控制权了。因为同属于public组。
那么我们尝试一下:
[root@dhcp-0-157 sdb1]# rm dir2/*
rm: remove regular empty file `dir2/file1'? y
[root@dhcp-0-157 sdb1]# su user1
[user1@dhcp-0-157 sdb1]$ touch dir2/file1
[user1@dhcp-0-157 sdb1]$ ls dir2
file1
[user1@dhcp-0-157 sdb1]$ exit
exit
[root@dhcp-0-157 sdb1]# su user2
[user2@dhcp-0-157 sdb1]$ touch dir2/file2
touch: cannot touch `dir2/file2': Permission denied
[user2@dhcp-0-157 sdb1]$ exit
exit
[root@dhcp-0-157 sdb1]#
看到了虽然目录dir2的group权限是777,但是属于public组的user2还是无权对dir2进行操作。
现在我们再做一个试验:
在当前的配置环境下,
[root@dhcp-0-157 sdb1]# pwd
/mnt/sdb1
[root@dhcp-0-157 sdb1]# ls
dir1 dir2 lost+found
[root@dhcp-0-157 sdb1]# mkdir dir3
[root@dhcp-0-157 sdb1]# chgrp public dir3
[root@dhcp-0-157 sdb1]# chmod 070 dir3
[root@dhcp-0-157 sdb1]# ll
total 32
drwxrwxr-x 2 root public 4096 Sep 18 13:24 dir1
d---rwx---+ 2 root public 4096 Sep 18 16:09 dir2
d---rwx--- 2 root public 4096 Sep 18 16:14 dir3
drwx------ 2 root root 16384 Sep 18 13:21 lost+found
[root@dhcp-0-157 sdb1]#
再设置acl权限。
[root@dhcp-0-157 sdb1]# setfacl -m u:user1:rwx dir3
[root@dhcp-0-157 sdb1]# getfacl dir3
# file: dir3
# owner: root
# group: public
user::---
user:user1:rwx
group::rwx
mask::rwx
other::---
[root@dhcp-0-157 sdb1]# ll
total 36
drwxrwxr-x 2 root public 4096 Sep 18 13:24 dir1
d---rwx---+ 2 root public 4096 Sep 18 16:09 dir2
d---rwx---+ 2 root public 4096 Sep 18 16:14 dir3
drwx------ 2 root root 16384 Sep 18 13:21 lost+found
[root@dhcp-0-157 sdb1]#
测试权限:
[root@dhcp-0-157 sdb1]# pwd
/mnt/sdb1
[root@dhcp-0-157 sdb1]# su user1
[user1@dhcp-0-157 sdb1]$ touch dir3/file1
[user1@dhcp-0-157 sdb1]$ ls dir3
file1
[user1@dhcp-0-157 sdb1]$ exit
exit
[root@dhcp-0-157 sdb1]# su user2
[user2@dhcp-0-157 sdb1]$ touch dir3/file2
[user2@dhcp-0-157 sdb1]$ ls dir3
file1 file2
[user2@dhcp-0-157 sdb1]$ exit
exit
[root@dhcp-0-157 sdb1]#
对比试验2和对比试验3,同样是070权限,结果却不一样。唯一区别是,对比试验2的070权限是acl设置的,对比试验3的070是管理员设置的。
所以在这里我做一个推测:
有acl访问控制的文件,属组权限必须为所有用户中,对此文件具有最大权限的用户的权限。比如通过acl设置用户user1对dir3具有rw权限,用户user2对dir3具有r权限。那么acl要求dir3至少具有rw权限。
但是我们并不用担心因为acl对文件的ugo权限进行修改导致文件的访问权限过于开放。因为在修改了文件所属组的ugo权限后,acl会根据修改文件权限之前的权限,对用户进行访问控制。
这就是为什么对比试验2中虽然user2属于public组,且dir2权限是070,却不能访问dir2的原因。
为了证实这一点,我们做对比实验4:
在之前的基础上,关闭/dev/sdb1对acl的支持。然后检测user2是否能和对比试验3一样对dir3进行访问。
[root@dhcp-0-157 sdb1]# vim /etc/fstab
LABEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
LABEL=SWAP-sda2 swap swap defaults 0 0
/dev/sdb1 /mnt/sdb1 ext3 defaults 0 0
去掉/dev/sdb1的acl支持。
[root@dhcp-0-157 sdb1]# cd /
[root@dhcp-0-157 /]# ll /mnt/sdb1
total 36
drwxrwxr-x 2 root public 4096 Sep 18 13:24 dir1
d---rwx---+ 2 root public 4096 Sep 18 16:09 dir2
d---rwx---+ 2 root public 4096 Sep 18 16:21 dir3
drwx------ 2 root root 16384 Sep 18 13:21 lost+found
[root@dhcp-0-157 /]# umount /dev/sdb1
[root@dhcp-0-157 /]# mount -a
[root@dhcp-0-157 /]# mount
/dev/sda3 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/sdb1 on /mnt/sdb1 type ext3 (rw)
[root@dhcp-0-157 /]# ll /mnt/sdb1
total 36
drwxrwxr-x 2 root public 4096 Sep 18 13:24 dir1
d---rwx--- 2 root public 4096 Sep 18 16:09 dir2
d---rwx--- 2 root public 4096 Sep 18 16:21 dir3
drwx------ 2 root root 16384 Sep 18 13:21 lost+found
[root@dhcp-0-157 /]#
我们可以看到,去掉对该分区的acl支持后,由于setfacl而被更改了g权限的dir2的g权限070并不会给还原成000。
在对比实验2中,user2无权对dir2进行访问。
现在我们再做一遍。
[root@dhcp-0-157 /]# cd /mnt/sdb1
[root@dhcp-0-157 sdb1]# pwd
/mnt/sdb1
[root@dhcp-0-157 sdb1]# ll
total 36
drwxrwxr-x 2 root public 4096 Sep 18 13:24 dir1
d---rwx--- 2 root public 4096 Sep 18 16:09 dir2
d---rwx--- 2 root public 4096 Sep 18 16:21 dir3
drwx------ 2 root root 16384 Sep 18 13:21 lost+found
[root@dhcp-0-157 sdb1]# su user1
[user1@dhcp-0-157 sdb1]$ touch dir2/file11
[user1@dhcp-0-157 sdb1]$ ls dir2
file1 file11
[user1@dhcp-0-157 sdb1]$ exit
exit
[root@dhcp-0-157 sdb1]# su user2
[user2@dhcp-0-157 sdb1]$ touch dir2/file22
[user2@dhcp-0-157 sdb1]$ ls dir2
file1 file11 file22
[user2@dhcp-0-157 sdb1]$ exit
exit
[root@dhcp-0-157 sdb1]#
由于setfacl操作修改了目录dir2的权限,而不能在取消分区的acl特性的时候回复最初的权限,导致了原本用户user2不能访问的目录dir2,现在user2对其具有完全权限了!
所以设置ACL的时候一定要考虑充分。
此外,由于setfacl会修改group权限,因此给一些特殊的文件设置acl会导致程序运行错误。
比如个人home目录下有一些配置文件是要求600权限的,如果由于对个人home目录递归设置了acl,则有可能造成X图形界面启动异常。比如.dmrc文件。
此外如果对个人home目录设置acl不当,也会造成个人隐私泄露。
====================以下内容感谢得新倾情帮助=============================
ext3文件系统在superblock里面可以设置默认挂载选项。因此有几个分区我们必须注意。
在很多Linux发行版本中,比如Red Hat Enterprise Linux 5.2,在安装系统的时候会把分配的分区设置默认挂载选项acl。所以即使在fstab里面没有加上acl选项,也照样会启用acl支持。
比如/,/boot这些。
[root@dhcp-0-142 ~]# tune2fs /dev/sda1 -l | grep "Default mount options"
Default mount options: user_xattr acl
[root@dhcp-0-142 ~]# tune2fs /dev/sdb1 -l | grep "Default mount options"
Default mount options: (none)
[root@dhcp-0-142 ~]#
不过我们可以通过
tune2fs -o选项来设置这个默认挂载选项。