Est-il possible de conserver le bit setgid pour décompresser les fichiers par un utilisateur non root?

J’ai un dossier avec les permissions suivantes:

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

Dans ce dossier, j’ai une archive archive.zip avec les permissions suivantes:

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

Lorsque je décompresse l’archive en appelant unzip archive.zip j’ai reçu la liste suivante:

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

Comme nous pouvons le voir, le groupe propriétaire est identique à www-data pour le dossier de project-folder dossier parent, mais le folder-from-archive n’a pas de bit setgid (la partie des permissions) et le contenu de ce dossier ne appartenant au groupe 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 

Mais lorsque j’ai essayé de décompresser cette archive en tant qu’utilisateur root, les permissions et le propriétaire du groupe (ainsi que les fichiers du dossier) étaient corrects:

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

Fichiers dans le dossier 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 

Comme nous pouvons le voir après décompression par l’utilisateur root, le dossier hérite du sticky bit et définit les www-data groupe correct pour lui-même et tous les fichiers contenant.

Comment obtenir le même comportement pour l’utilisateur myuser ?

L’utilisateur root -il membre du groupe www-data ? Si tel est le cas, cela expliquerait pourquoi l’extraction par root avait le propriétaire de groupe correct pour l’extraction.

De même, si myuser ne figure pas dans le groupe de www-data , les fichiers seront extraits en tant que myuser:myuser

Voir man chmod :

SETUID ET SETGID BITS

chmod efface le bit d’ID de groupe défini d’un fichier régulier si l’ID de groupe du fichier ne correspond pas à l’ID de groupe effectif de l’utilisateur ou à l’un des ID de groupe supplémentaires de l’utilisateur , sauf si l’utilisateur dispose des privilèges appropriés. Des ressortingctions supplémentaires peuvent faire en sorte que les bits MODE-user-ID et set-group-ID de MODE ou RFILE soient ignorés. Ce comportement dépend de la stratégie et des fonctionnalités de l’appel système chmod sous-jacent. En cas de doute, vérifiez le comportement du système sous-jacent.

notes originales

J’ai eu un rapport d’utilisateur que les fichiers sous un chemin de setgid avaient $ user: $ user pour certains fichiers par opposition au groupe $ user: $ attendu. Je soupçonnais que cela pouvait être dû à une extraction d’archive, car le bit setgid était correct jusqu’au répertoire extrait, où le groupe était correct, mais le setgid manquait.

Mon googler a seulement retourné ce message unique. Étant donné que j’ai décidé de le tester, je suis incapable de reproduire le problème en utilisant unzip j’ai également effectué un test similaire en utilisant un fichier tar.gz et en extrayant en utilisant tar :

Créer une archive de test

 $ 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 

Créer /project/mygroup groupe, espace de travail de groupe avec 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 

Extraire l’archive

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

Afficher les résultats, le groupe est intact tout au long de l’arborescence d’extraction complète

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