web-dev-qa-db-fra.com

Quand pourrais-je ou devrais-je utiliser chmod g + s sur un fichier ou un répertoire?

Lors du déploiement récent vers un nouvel environnement (Solaris 9), l'une des étapes a consisté à copier un ensemble de fichiers et de répertoires vers leur nouvel emplacement, puis à appliquer le bit UID de groupe (à l'aide de "chmod -R g + s") à tous fichiers dans l'arborescence des répertoires donnant un mode -rwxr-s --- à tout. Le résultat était qu'aucun de nos scripts Shell ne s'exécuterait à moins qu'ils ne soient ouverts et réenregistrés individuellement. Je dois ajouter que nous avions précédemment défini g + s sur le dossier parent cible avant de copier les fichiers; cela avait défini le mode initial sur tous les nouveaux répertoires sur drwxr-s --- mais les fichiers avaient un mode -rwxr-x ---

Après avoir finalement découvert quelle étape a causé le problème, nous avons pu couper cette étape et continuer.

Je voudrais cependant comprendre ce que signifie le bit "s" lorsqu'il est appliqué aux répertoires et aux fichiers, dans l'espoir que cela explique pourquoi nous avons eu le problème en premier lieu.

32
Jordanhillbilly

La définition des répertoires g + s fait que tous les nouveaux fichiers créés dans ce répertoire ont leur groupe défini sur le groupe du répertoire.

Cela peut en fait être très pratique à des fins de collaboration si vous avez le umask défini de sorte que les fichiers ont l'écriture de groupe par défaut.

Remarque: C'est ainsi que cela fonctionne sous Linux, cela pourrait fonctionner complètement différemment sous Solaris.

75
Powerlord

Pour les fichiers exécutables, cela signifie que lorsque le fichier est exécuté, il est exécuté en tant que groupe propriétaire du fichier et non en tant que groupe de l'utilisateur exécutant le fichier.

Ceci est utile si vous souhaitez que les utilisateurs puissent assumer les autorisations d'un groupe particulier juste pour exécuter une commande.

Cependant, il s'agit également d'un risque pour la sécurité car il permet aux utilisateurs d'élever leurs autorisations. Vous devez savoir que les scripts avec cet ensemble de bits ne feront rien qui permettrait aux utilisateurs d'abuser de ces autorisations supplémentaires.

12
SpoonMeiser

Voici une explication très pratique de SGID (chmod g + s): http://www.linuxnix.com/sgid-set-sgid-linuxunix/

SGID (Set Group ID up on execution) est un type spécial d'autorisations de fichiers accordées à un fichier/dossier. Normalement, sous Linux/Unix, lorsqu'un programme s'exécute, il hérite des autorisations d'accès de l'utilisateur connecté. SGID est défini comme l'octroi d'autorisations temporaires à un utilisateur pour exécuter un programme/fichier avec les autorisations des autorisations de groupe de fichiers pour devenir membre de ce groupe pour exécuter le fichier. En termes simples, les utilisateurs obtiendront les autorisations du groupe de fichiers lors de l'exécution d'un dossier/fichier/programme/commande.

7
Tomasz Błachowicz

Pour un exécutable, g+s remplace l'ID de groupe sous lequel l'exécutable s'exécutera (il est généralement hérité du parent).

$ cp `which id` id-test 
 $ ./id-test[.____.[uid=1001(user1) gid = 1001 (group1) groups = 1001 (group1), 2001 (project1) 
 $ chgrp project1 id-test 
 $ chmod g + s id-test 
 $ ./id-test[.____.[uid=1001(user1) gid = 1001 (group1) egid = 2001 (projet1) groupes = 1001 (groupe1), 2001 (projet1)

(egid est "id de groupe efficace" - généralement le même que gid, "id de groupe", mais ici différent.)

Pour un répertoire, g+s remplace l'ID de groupe que les nouveaux fichiers et répertoires auront (il est généralement hérité du créateur).

$ mkdir project 
 $ chgrp project1 file1 
 $ umask 
 0022 
 $ touch project/file1 
 $ ls -l project/file1 
 - rw-r - r-- 1 utilisateur1 groupe1 0 fichier1 
 $ chmod g + s projet 
 $ touch projet/fichier2 
 $ ls -l projet/fichier2 
 - rw-r - r-- 1 utilisateur1 projet1 0 fichier2

Vous devrez peut-être encore jouer avec umask pour de meilleurs résultats; quelque chose au moins aussi permissif que 0007 est requis pour l'écriture partagée, et quelque chose au moins aussi permissif que 0027 est requis pour la lecture partagée.

$ umask 0077 
 $ touch projet/fichier3 
 $ ls -l projet/fichier3 
 - rw ------- 1 utilisateur1 projet1 0 fichier3 
 $ umask 0027 
 $ touch project/file4 
 $ ls -l project/file4 
 - rw-r ----- 1 user1 project1 0 file4 
 $ umask 0007 
 $ Touch project1/file5 
 $ Ls -l project1/file5 
 - rw-rw ---- 1 user1 project1 0 file5
4
ephemient

Pour les fichiers, cela signifie que le fichier est exécuté en tant que groupe propriétaire du fichier, et non pas l'utilisateur du groupe qui exécute le fichier. Il est utilisable lorsque vous souhaitez permettre à l'utilisateur de faire quelque chose pour lequel il n'a pas le privilège. Par exemple, pour un SGBD que j'utilise, il est courant de permettre à tout le monde de sauvegarder des bases de données. Bien que seul le groupe 'dbms' ait un accès en lecture/écriture au fichier de la base de données, le programme de sauvegarde a g + s défini pour permettre à quiconque d'accéder à la base de données par son intermédiaire, mais pas directement.

Pour les répertoires, cela signifie que les répertoires nouvellement créés appartiendront au groupe propriétaire du répertoire et non à l'utilisateur du groupe qui a créé le fichier. Un bon exemple pour cela est l'espace web du projet sourceforge.net. Imaginez 3 développeurs qui maintiennent le site Web du projet. Maintenant, si l'un d'eux crée un fichier, lui seul peut y écrire (par défaut). Pour contourner ce problème, tous les utilisateurs d'un même projet se trouvent également dans le même groupe et le répertoire a le privilège rws pour ce groupe.Par conséquent, quiconque crée le fichier est créé en lecture et en écriture pour le groupe.

2
Milan Babuškov

Pour développer un peu votre problème spécifique, il a déjà été noté que les exécutables sgid peuvent causer des problèmes en accordant aux utilisateurs des autorisations dont ils ne disposent pas normalement. Bien que cela soit un problème pour tout exécutable, il crée une condition de concurrence critique potentiellement exploitable dans le cas des scripts (signifiant spécifiquement "des fichiers qui s'exécutent au moyen d'un interpréteur externe identifié par un #! Au début du fichier") qui peut être utilisé pour exécuter n'importe quel code arbitraire avec les autorisations du script.

Les dérivés Unix ont mis en œuvre un certain nombre de schémas au fil des ans qui visent à atténuer ou à éliminer cette vulnérabilité, dont la plupart ont inclus une certaine forme d'interdiction de l'exécution des scripts suid ou sgid ou vous obligeant à parcourir quelques cerceaux pour l'activer (généralement script par script). Un tel schéma serait la cause de votre incapacité à exécuter les scripts après avoir activé leur indicateur sgid.

0
Dave Sherohman

Lorsque vous devez l'utiliser: corrigez le problème de propriété du fichier SVN lorsque vous utilisez svn + ssh. Quelqu'un m'a dit que cela ne se produit que sur BDB, mais j'ai également eu un tel problème dans le stockage FSFS. Fondamentalement, lorsque vous souhaitez conserver la propriété des fichiers enfants dans un répertoire cohérent lorsque d'autres utilisateurs y écrivent des éléments, vous devez utiliser u + s/g + s.

0
William Yeung

Plus d'informations sur setuid et setgid ici

0
Ryan