使用ACL的新创build的文件/文件夹的默认权限不受像“unzip”

我在为多个用户访问同一组文件的系统设置系统时遇到了麻烦。 我读过tuts和文档,并与ACL玩,但还没有成功。

我的情景:

有多个用户,例如user1user2 ,属于一个名为sharedusers的组。 他们必须拥有对同一组文件和目录的所有WRITE权限,比如在/userdata/sharing/

我将文件夹的组设置为sharedusers和SGID,将所有新创build的文件/目录设置为同一组。

 ubuntu@home:/userdata$ ll drwxr-sr-x 2 ubuntu sharedusers 4096 Nov 24 03:51 sharing/ 

我为这个目录设置了ACL,这样我就可以拥有从其父母inheritance的子目录/文件的权限。

 ubuntu@home:/userdata$ setfacl -m group:sharedusers:rwx sharing/ ubuntu@home:/userdata$ setfacl -d -m group:sharedusers:rwx sharing/ 

这是我得到的:

 ubuntu@home:/userdata$ getfacl sharing/ # file: sharing/ # owner: ubuntu # group: sharedusers # flags: -s- user::rwx group::rx group:sharedusers:rwx mask::rwx other::rx default:user::rwx default:group::rx default:group:sharedusers:rwx default:mask::rwx default:other::rx 

看起来没问题,因为当我创build新文件夹里面的新文件,权限是正确的。

 ubuntu@home:/userdata/sharing$ mkdir a && cd a ubuntu@home:/userdata/sharing/a$ touch a_test ubuntu@home:/userdata/sharing/a$ getfacl a_test # file: a_test # owner: ubuntu # group: sharedusers user::rw- group::rx #effective:r-- group:sharedusers:rwx #effective:rw- mask::rw- other::r-- 

如您所见, sharedusers组具有有效权限rw-

但是,如果我有一个zip文件,并使用unzip -q命令解压缩文件夹sharing内的文件,解压缩的文件夹没有组写入 permisison。 因此,来自组sharedusers用户的用户不能修改这些提取的文件夹下的文件。

 ubuntu@home:/userdata/sharing$ unzip -q Joomla_3.0.2-Stable-Full_Package.zip ubuntu@home:/userdata/sharing$ ll drwxrwsr-x+ 2 ubuntu sharedusers 4096 Nov 24 04:00 a/ drwxr-xr-x+ 10 ubuntu sharedusers 4096 Nov 7 01:52 administrator/ drwxr-xr-x+ 13 ubuntu sharedusers 4096 Nov 7 01:52 components/ 

您将发现文件夹a (之前创build)和文件夹administrator通过unzip提取的权限不同。 以及administrator内部文件的ACL:

 ubuntu@home:/userdata/sharing$ getfacl administrator/index.php # file: administrator/index.php # owner: ubuntu # group: ubuntu user::rw- group::rx #effective:r-- group:sharedusers:rwx #effective:r-- mask::r-- other::r-- 

它也有ubuntu组,不像预期的那样sharedusers组。

有人可以解释这个问题,给我build议吗? 先谢谢你!

这是行为中的ACL_MASK。 看一下index.php文件,它理论上得到了预期的权限group:sharedusers:rwx ,但是实际上是另一个group:sharedusers:rwx #effective:r-- 。 这是因为理论值与mask::r--进行XOR mask::r-- ,得到有效的结果,这就是你用ls -l (或ll )看到的结果。

现在,ACL mask::r-- MAS的ACL_MASK实际上就是ACL的一个安全特性,使您无法访问您不希望访问的内容:在添加现有文件(而不是创build新文件)时,ACL会设置ACL_MASK为文件的前一个值,在本例中为r--

这不限于解压缩。 这适用于每当你添加一个文件,而不是创build它。 例如,你可以尝试cp或者tar ,最后得到相同的结果。

实际上,文档( man 5 acl )在OBJECT CREATION AND DEFAULT ACL中指出, default值仅适用于使用以下任何系统调用创build的对象: creat()mkdir()mknod()mkfifo() ,或打开()

所以我不能给你一个好的解决scheme,因为你将无法使用ACL默认机制来完成你正在做的事情。