Chinaunix首页 | 论坛 | 博客
  • 博客访问: 488486
  • 博文数量: 82
  • 博客积分: 3003
  • 博客等级: 中校
  • 技术积分: 1285
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-11 15:27
文章分类

全部博文(82)

文章存档

2011年(1)

2010年(5)

2009年(63)

2008年(13)

我的朋友

分类: LINUX

2008-09-19 16:49:56

ACL文件访问列表实验笔记—关于使用不当导致的安全问题(无理论非扫盲版)


文档撰写者信息:

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 ~]#





我现在要做一个试验:



对比试验1



[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组。

所以user1dir1具有rwx权限。



上面情况并没有对/dev/sdb1分区添加acl支持。





============================Open Source的分割线==========================



现在我们做另一个试验:

对比试验2

/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,貌似user1user2都有对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]#



看到了虽然目录dir2group权限是777,但是属于public组的user2还是无权对dir2进行操作。





现在我们再做一个试验:

对比试验3

在当前的配置环境下,


[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权限,结果却不一样。唯一区别是,对比试验2070权限是acl设置的,对比试验3070是管理员设置的。



所以在这里我做一个推测:

acl访问控制的文件,属组权限必须为所有用户中,对此文件具有最大权限的用户的权限。比如通过acl设置用户user1dir3具有rw权限,用户user2dir3具有r权限。那么acl要求dir3至少具有rw权限。

但是我们并不用担心因为acl对文件的ugo权限进行修改导致文件的访问权限过于开放。因为在修改了文件所属组的ugo权限后,acl会根据修改文件权限之前的权限,对用户进行访问控制。

这就是为什么对比试验2中虽然user2属于public组,且dir2权限是070,却不能访问dir2的原因。



为了证实这一点,我们做对比实验4

对比实验4

在之前的基础上,关闭/dev/sdb1acl的支持。然后检测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/sdb1acl支持。



[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权限的dir2g权限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选项来设置这个默认挂载选项。

阅读(1574) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~