是否可以保留 setgid 位来由非 root 用户解压缩文件?



我有一个具有以下权限的文件夹:

drwxrws--x+ 13 myuser  www-data      4096 Mar 20 09:57 project-folder

在此文件夹中,我有一个具有以下权限的存档archive.zip

-rw-rw----+    1 myuser www-data  10260 Mar 20 09:56 archive.zip

当我通过调用unzip archive.zip解压缩存档时,我得到了以下文件列表:

drwxrwx--x+    3 myuser www-data   4096 May  5  2017 folder-from-archive

如我们所见,所有者组与父文件夹project-folderwww-data相同,但folder-from-archive没有setgid位(权限的"s"部分),并且该文件夹的内容不归组www-data所有:

-rw-rw----+ 1 myuser myuser 1083 May  5  2017 LICENSE
-rw-rw----+ 1 myuser myuser 2197 May  5  2017 README.md
-rw-rw----+ 1 myuser myuser  720 May  5  2017 autoload.php
-rw-rw----+ 1 myuser myuser  786 May  5  2017 composer.json
drwxrwx--x+ 3 myuser myuser 4096 May  5  2017 source

但是当我尝试以 root 用户身份解压缩此存档时,权限和组所有者(以及文件夹中的文件)是正确的:

drwxr-s--x+    3 root www-data   4096 May  5  2017 folder-from-archive

文件夹folder-from-archive中的文件:

-rw-r-----+ 1 root www-data 1083 May  5  2017 LICENSE
-rw-r-----+ 1 root www-data 2197 May  5  2017 README.md
-rw-r-----+ 1 root www-data  720 May  5  2017 autoload.php
-rw-r-----+ 1 root www-data  786 May  5  2017 composer.json
drwxr-s--x+ 3 root www-data 4096 May  5  2017 source

正如我们在root用户解压缩后所看到的,文件夹继承了粘滞位,并为自己和所有包含的文件设置了正确的组www-data

如何为用户myuser获得相同的行为?

用户rootwww-data组的成员吗?如果是这样,这将解释为什么root提取具有正确的提取组所有者。

同样,如果myuser不在www-data组中,则文件将提取为myuser:myuser

请参阅man chmod

SETUID 和 SETID 位

如果常规文件的组 ID 与用户的有效组 ID 或用户的补充组 ID 之一不匹配,chmod将清除常规文件的设置组 ID 位,除非用户具有适当的权限。其他限制可能会导致忽略 MODE 或 RFILE 的设置用户 ID 和设置组 ID 位。 此行为取决于基础 chmod 系统调用的策略和功能。 如有疑问,请检查基础系统行为。

原始注释

我有一个用户报告,对于某些文件,setgid 路径下的文件具有 $user:$user,而不是预期的 $user:$group。我怀疑这可能是由于存档提取,因为 setgid 位在提取的目录之前是正确的,在该目录中,该组是正确的,但 setgid 丢失。

我的谷歌搜索只发现了这个帖子。鉴于我决定对其进行测试,但是我无法使用unziptar.gz 文件并使用tar提取运行了类似的测试:

创建测试存档

$ cd ~ && mkdir testdata
$ ls -ld testdata
drwxrwxr-x 12 flakrat flakrat 512 May 16 11:43 testdata
$ cd testdata
$ for n in {1..10}; do mkdir $n; for m in {1..10}; do touch $n/$m; done; done
$ cd ..
$ zip -r -q testdata.zip testdata

创建/project/mygroup,使用setgid组工作区

$ cd /project
$ mkdir mygroup && chgrp mygroup mygroup && chmod g+rwxs mygroup
$ ls -ld mygroup
drwxrwsr-x 2 flakrat mygroup 512 May 16 11:46 mygroup

提取存档

$ cd /project/mygroup
$ unzip -q ~/testdata.zip

查看结果,该组在整个提取树中完好无损

$ ls -ld testdata
drwxrwsr-x 12 flakrat mygroup 512 May 16 11:43 testdata
$ ls -l testdata
total 0
drwxrwsr-x 2 flakrat mygroup 512 May 16 11:43 1
drwxrwsr-x 2 flakrat mygroup 512 May 16 11:43 10
...
$ ls -l testdata/1/
total 0
-rw-rw-r-- 1 flakrat mygroup 0 May 16 11:43 1
-rw-rw-r-- 1 flakrat mygroup 0 May 16 11:43 10
...

最新更新