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

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

我在为多个用户访问同一组文件设置系统时遇到了麻烦。我读过教程和文档,也尝试过 ACL,但还没有成功。

我的情况:

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

我已将文件夹的组设置为sharedusers,并将 SGID 内所有新创建的文件/目录设置为同一组。

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

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

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::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

似乎没问题,因为当我创建包含新文件的新文件夹时,权限是正确的。

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--

可以看到,该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/

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--

它也有ubuntu组,而不是sharedusers预期的组。

有人能解释一下这个问题并给我建议吗?提前谢谢了!

答案1

此行为是 ACL_MASK 在起作用。查看文件index.php,它理论上确实获得了预期的权限group:sharedusers:rwx,但实际上获得了另一个权限#effective:r--。这是因为理论值与进行了异或以mask::r--得出有效值,即您看到的ls -l(或ll)。

现在的 ACL_MASKmask::r--实际上是 ACL 的一个安全特性,它可以阻止您授予不想要的访问权限:当添加一个现有文件(而不是创建一个新文件)时,ACL 会将 ACL_MASK 设置为文件的先前值,在本例中为r--

这不仅限于 unzip。这适用于以下情况:添加文件而不是创造它。您可以尝试cptar例如,并最终得到相同的结果。

事实上,文献(man 5 acl)在段落中指出对象创建和默认 ACL这些default值仅适用于使用以下任何系统调用创建的对象:创建()创建目录()mknod()mkfifo(), 或者打开()

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

相关内容