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

时间:2018-03-20 10:14:44

标签: linux ubuntu zip unzip setuid

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

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

我们可以看到,所有者组www-data与父文件夹project-folder相同,但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获取相同的行为?

1 个答案:

答案 0 :(得分:1)

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

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

请参阅man chmod

  

SETUID和SETGID BITS

     

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

原始笔记

我有一个用户报告,setgid路径下的文件有$ user:$ user表示某些文件,而不是预期的$ user:$ group。我怀疑它可能是由于存档提取,因为setgid位正确到解压缩目录,其中组正确但是setgid丢失。

我的谷歌搜索只发现了这个帖子。鉴于我决定测试它,但是我无法使用unzip复制问题,也使用tar.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
...