Ngo*_*ham 4 linux ubuntu access-control-list share file-permissions
我在为访问同一组文件的多个用户设置系统时遇到问题。我已经阅读了 tuts 和 docs 并使用了 ACL,但还没有成功。
我的场景:
例如,有多个用户,user1并且user2属于一个名为 的组sharedusers。他们必须拥有对同一组文件和目录的所有WRITE权限,例如在/userdata/sharing/.
我将文件夹的组设置为sharedusersSGID,以便将所有新创建的文件/目录设置为同一组。
ubuntu@home:/userdata$ ll
drwxr-sr-x 2 ubuntu sharedusers 4096 Nov 24 03:51 sharing/
Run Code Online (Sandbox Code Playgroud)
我为此目录设置了 ACL,因此我可以获得从其父目录继承的子目录/文件的权限。
ubuntu@home:/userdata$ setfacl -m group:sharedusers:rwx sharing/
ubuntu@home:/userdata$ setfacl -d -m group:sharedusers:rwx sharing/
Run Code Online (Sandbox Code Playgroud)
这是我所拥有的:
ubuntu@home:/userdata$ getfacl sharing/
# file: sharing/
# owner: ubuntu
# group: sharedusers
# flags: -s-
user::rwx
group::r-x
group:sharedusers:rwx
mask::rwx
other::r-x
default:user::rwx
default:group::r-x
default:group:sharedusers:rwx
default:mask::rwx
default:other::r-x
Run Code Online (Sandbox Code Playgroud)
似乎没问题,因为当我创建包含新文件的新文件夹并且权限正确时。
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::r-x #effective:r--
group:sharedusers:rwx #effective:rw-
mask::rw-
other::r--
Run Code Online (Sandbox Code Playgroud)
如您所见,该sharedusers组具有有效权限rw-。
但是,如果我有一个 zip 文件,并使用unzip -q命令将文件解压缩到文件夹中sharing,则提取的文件夹没有组写入权限。因此,组中的用户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/
Run Code Online (Sandbox Code Playgroud)
您会发现文件夹a(之前创建的)和administrator由unzip. 以及内部文件的 ACL administrator:
ubuntu@home:/userdata/sharing$ getfacl administrator/index.php
# file: administrator/index.php
# owner: ubuntu
# group: ubuntu
user::rw-
group::r-x #effective:r--
group:sharedusers:rwx #effective:r--
mask::r--
other::r--
Run Code Online (Sandbox Code Playgroud)
它也有ubuntu组,而不是sharedusers预期的组。
有人可以解释这个问题并给我建议吗?先感谢您!
小智 5
这种行为是工作中的 ACL_MASK。查看该index.php文件,理论上它确实获得了预期的权限group:sharedusers:rwx,但实际上是另一个#effective:r--. 这是因为理论值与 进行异或运算mask::r--以给出有效值,这就是您看到的ls -l(或ll)。
现在 ACL_MASKmask::r--实际上是 ACL 的一项安全功能,可防止您在不希望的地方提供访问权限:添加现有文件(而不是创建新文件)时,ACL 将 ACL_MASK 设置为之前的值文件,在本例中为r--.
这不仅限于解压缩。无论何时添加文件而不是创建文件,这都适用。例如,您可以尝试cp或tar,并且最终会得到相同的结果。
事实上,文档 ( man 5 acl) 在OBJECT CREATION AND DEFAULT ACLs段落中指出,这些default值仅适用于使用以下任何系统调用创建的对象:creat()、mkdir()、mknod()、mkfifo()或open( )。
因此,我无法为您提供一个好的解决方案,因为您将无法将 ACL 默认机制用于您正在执行的操作。