使用“unzip”等命令不遵守的 ACL 的新创建文件/文件夹的默认权限

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(之前创建的)和administratorunzip. 以及内部文件的 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--.

这不仅限于解压缩。无论何时添加文件而不是创建文件,这都适用。例如,您可以尝试cptar,并且最终会得到相同的结果。

事实上,文档 ( man 5 acl) 在OBJECT CREATION AND DEFAULT ACLs段落中指出,这些default值仅适用于使用以下任何系统调用创建的对象:creat()mkdir()mknod()mkfifo()open( )

因此,我无法为您提供一个好的解决方案,因为您将无法将 ACL 默认机制用于您正在执行的操作。

  • “添加”和“创建”有什么区别?你认为 `cp` 和 `tar` 使用哪个系统调用?我很确定 `cp` 和 `tar` 使用 open() 或 creat()。掩码具有限制性的原因是 `cp`/`tar` 为 open() 提供了更受限的模式参数和/或之后使用 chmod()/fchmod() 更改权限(组权限映射到掩码)。 (3认同)