Pourquoi setuid est-il ignoré sur les répertoires?

19

Sur les systèmes Linux, vous pouvez réussir chmod u+s $some_directory, mais au lieu de forcer la propriété des nouveaux sous-répertoires et fichiers à être le propriétaire du répertoire contenant (et de définir également les sous-répertoires u+s) comme vous pouvez vous y attendre, le système ignore simplement le bit setuid. Les sous-répertoires et les fichiers continuent d'hériter des UID de leurs processus de création, et les sous-répertoires ne sont pas définis par défaut.

Pourquoi setuid est-il ignoré dans les répertoires et comment puis-je faire en sorte que le système le reconnaisse?

Blacklight Shining
la source
Je me demande si l'option de montage "nosuid" peut affecter cela.
Heptite
Le système de fichiers en question n'est pas monté avec - nosuidbien qu'il y en ait un autre (un disque virtuel /dev/shm) qui est / monté / nosuid, et il semble traiter le setuidbit exactement de la même manière. 6_9
Blacklight Shining
2
Quant à l'implémenter, le code source Linux est facilement disponible, n'hésitez pas à implémenter cette fonctionnalité. Puisqu'il existe déjà sur FreeBSD, vous pouvez très facilement copier le code sur je suis sûr. Bien sûr, ces bits n'auraient toujours aucun sens sur le système Linux de quelqu'un d'autre.
mikebabcock

Réponses:

16

Rappelons que les bits setuid et setgid ont été inventés dans un but complètement différent: faire fonctionner un exécutable avec l'uid ou le gid de son propriétaire, plutôt qu'avec l'uid ou le gid de l'utilisateur exécutant le fichier. Toute autre utilisation n'est qu'une fonctionnalité supplémentaire.

Ces bits n'ont aucune fonction sur les fichiers ordinaires qui ne sont pas exécutables. (Et aussi des scripts shell sur certaines distributions, en raison de problèmes de sécurité.) À l'origine, ils n'avaient pas non plus de fonction pour les répertoires. De toute évidence, quelqu'un a décidé qu'il serait intéressant de prendre le setgid inutilisé sur les répertoires et de l'utiliser pour renforcer la cohérence de la propriété du groupe. Après tout, si vous jouez avec la propriété d'un groupe, c'est parce que plus d'une personne travaille avec le fichier, et il est probablement logique que tous les fichiers d'un répertoire donné appartiennent au même groupe, peu importe qui les a créés. Les tracas dus à quelqu'un qui oublie d'exécuter newgrp sont éliminés.

Alors, pourquoi ne pas implémenter la même fonctionnalité pour setuid et le fichier uid? Eh bien, uid est beaucoup plus basique que gid. Si vous implémentez cela, souvent un fichier n'appartiendra pas à l'utilisateur qui l'a créé! Vraisemblablement, l'utilisateur peut toujours modifier le fichier (en supposant que l'umask est quelque chose de sain d'esprit), mais il ne peut pas modifier les bits d'autorisation. Difficile de voir l'utilité de cela.

Isaac Rabinovitch
la source
J'aimerais qu'il soit implémenté, ne serait-ce que pour des raisons de cohérence… X3 Dans tous les cas, à moins d'une solution de contournement comme un cronjob pour passer périodiquement en revue et changer la propriété, / est / existe-t-il un moyen de forcer la propriété du fichier?
Blacklight Shining
4
Je suis tenté de citer Emerson sur la cohérence insensée. Avant de pouvoir me convaincre que c'est une fonctionnalité souhaitable, vous devrez me montrer un cas d'utilisation où cela a du sens.
Isaac Rabinovitch
1
FreeBSD chmod (2) a en fait une discussion à ce sujet, mais mentionne seulement qu'il ne devrait généralement pas être utilisé en raison de "trous de sécurité" non spécifiés. Je soupçonne que la plupart d' autres unix n'a pas adopté cette fonctionnalité , car alors qu'il a quelques cas d'utilisation, ce n'est pas que terriblement utile.
jjlin
1
"Difficile de voir l'utilité de cela" -> défini sur un répertoire personnel, donc les scripts de provisionnement s'exécutant en tant que root ne peuvent pas oublier de montrer quelque chose par accident?
ufotds
1
exécuter des scripts de superutilisateur dans votre répertoire personnel est une très mauvaise idée
Isaac Rabinovitch
7

Je crois que la réponse à cette question porte sur les problèmes de sécurité de "distribution de fichiers" qui ont eu pour conséquence que la plupart des systèmes d'exploitation de type Unix modernes ne permettent pas de "distribution de fichiers". "File giveaway" est lorsqu'un utilisateur non superutilisateur change la propriété d'un fichier en une personne autre que cet utilisateur. Cette capacité offre de nombreuses possibilités de méfaits.

Étant donné que les cadeaux de fichiers ne sont pas autorisés, setuid sur les répertoires, qui exécuteraient la même fonction sous une autre forme, n'est pas autorisé ou ignoré s'il est défini.

Quant à changer le comportement, vous devrez modifier les bibliothèques et les utilitaires du système d'exploitation.

Yedric
la source
2

Un très bon cas d'utilisation pour l'implémenter est le suivant:

Disons que vous avez un serveur multi-sites avec 3 sites sécurisés. Vous avez créé 3 groupes, un pour chacun des différents responsables de sites. Tous les fichiers de tous les sites doivent appartenir à l'utilisateur apache pour qu'apache puisse y lire et écrire (drupal / wordpress, etc.).

Si le setuid mais fonctionnait comme le bit setgid pour les permissions des répertoires ressemblerait à ceci:

/var/www/sitea - apache:groupa  rwS rwS ---
/var/www/siteb - apache:groupb  rwS rwS ---
/var/www/sitec - apache:groupc  rwS rwS ---

De cette façon, chaque groupe de responsables avait accès pour voir et toucher uniquement leur contenu, mais l'utilisateur du serveur Web apache pouvait servir tout le contenu et il n'était pas nécessaire pour les utilisateurs de s'inquiéter de changer la propriété des fichiers téléchargés.

Un autre cas d'utilisation est pour les téléchargements ftp / http anonymes ou même sftp / ssh. Le groupe et le GID du répertoire de téléchargement seraient root, tout comme le propriétaire et l'UID. Les autres autorisations seraient -wx. Cela permettrait à tout le monde d'écrire au répertoire de téléchargement mais ils ne pouvaient rien lire une fois qu'il était téléchargé et root détiendrait tous les fichiers nouvellement créés.

Il y a donc deux cas d'utilisation parfaitement bons et valides pour activer la fonctionnalité UID sur les répertoires pour correspondre au bit GID.

Steven Mercurio

user297422
la source
1
Cela ne semble pas répondre à la question qui a été posée.
Kevin Panko
2
@KevinPanko Non, cela ne répond pas à ma question. Il pourrait même être hors sujet pour le site («à quoi sert un cas d'utilisation <nonexistent feature X>?»). Cependant, cela se rapporte à ma question et, en tant que demandeur, je la trouve utile.
Blacklight Shining
0

Un peu tard pour la fête, mais au cas où de futurs lecteurs tomberaient dessus, cela) mount -o.... ou quoi non). Comme souvent, la page de manuel n'est pas conforme au comportement OS-X qu'elle indique littéralement:

4000 (le bit set-user-ID-on-execution) [...] Les répertoires avec le bit set-user-id défini forceront tous les fichiers et sous-répertoires créés en leur possession par le propriétaire du répertoire et non par l'uid du processus de création [...]

mais il énumère également une possibilité d'obtenir le même effet sans renoncer à la propriété d'origine. Linux utilise '[g /] setfacls' pour des effets similaires (ce sont des permissions qui ne sont pas vraiment visibles à première vue, donc cela peut parfois être une nuisance).

En ce qui concerne «comment puis-je obtenir des effets similaires», lisez l'intégralité de la page de manuel et jouez avec:

chmod +a 'guest allow read,write,delete,add_file,add_subdirectory,file_inherit,directory_inherit' ./[DIRECTORY]

vous pouvez vérifier via

ls -le

si tout va bien. D'autres options incluent l'insertion de règles à des positions spécifiques, la suppression ou le remplacement de règles spécifiques. Les deux options notables ici sont " file_inheritet directory_inherit" permettant d'attacher les règles à un nouveau répertoire / fichier.

Je n'aime pas vraiment utiliser setUID, mais setGID est très pratique sur les serveurs de fichiers où la simple définition du groupe «principal» ne fonctionne pas ou les clients ont des masques de fichiers interdisant l'écriture de groupe. Cela serait résolu par:

chmod +a 'mygroup allow read,write,delete,add_file,add_subdirectory,file_inherit,directory_inherit' /fileserver/groupfolders/mygroup
Keith
la source
Bienvenue sur Stack Exchange! C'est une bonne réponse, bien qu'en ce qui concerne OS X plutôt que les distributions Linux (qui, comme vous l'avez mentionné, utilisent un système ACL différent), cela ne semble pas tout à fait aussi pertinent ici. Ce serait certainement un bon ajustement sur une question sur la façon de faire OS X honorer les répertoires setuid; vous devriez peut-être en poster un ?
Blacklight Shining
Soit dit en passant, le morceau que vous avez omis de la page de manuel d'OS X chownsemble en fait assez important! «[…] Si le système de fichiers sous-jacent prend en charge cette fonctionnalité: voir chmod (2) et l' option suiddir pour monter (8).» En fait, je n'avais jamais remarqué ce bit auparavant. Si HFS implémente suiddir, vous pouvez réellement obtenir cela sur un système OS X commun.
Blacklight Shining
(Et les ACL OS X sont tout aussi «pas vraiment visibles à première vue» que les ACL Linux.)
Blacklight Shining
0

Eh bien, cela devrait respecter la norme. Je peux penser sur de nombreux scénarios avec sftp uniquement que cela me sauverait beaucoup de problèmes, à la fois avec acl et le jeu de masques acl que sshd fait, et la réinitialisation que je dois faire pour ce masque.

La sécurité par défaut est assez utile, mais si vous n'en faites pas une option, vous créez simplement un winghtmare.

https://www.gnu.org/software/coreutils/manual/html_node/Directory-Setuid-and-Setgid.html

Quoi qu'il en soit, c'est comme Linux, alors utilisez simplement acl pour contourner ces problèmes.

user576407
la source
-1

Selon http://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories, le bit setuid est ignoré pour les répertoires sur les systèmes UNIX et Linux. Il est cependant possible de le faire agir comme vous l'attendez sur FreeBSD.

mikebabcock
la source
Inutile - j'ai demandé pourquoi setuidétait ignoré pour les répertoires et s'il était possible de le faire reconnaître sur Linux.
Blacklight Shining
Il semble évident qu'il est ignoré sous Linux car il est ignoré sous Unix, ce qui rend le comportement correct pour que Linux s'intègre avec real * nix. N'hésitez pas à lire l'article en question. Même réponse sur greenend.org.uk/rjk/tech/perms.html de 2004, également un doublon de serverfault.com/questions/371541/…
mikebabcock
Alors pourquoi est-il ignoré sur Unix?
Isaac Rabinovitch
@IsaacRabinovitch depuis que Blacklight a clairement indiqué que la question concerne Linux, ce n'est pas pertinent [ironie] mais je soupçonne son comportement simplement indéfini où plusieurs Unix ont fait des choses différentes avec lui et ne rien faire est une hypothèse plus sûre.
mikebabcock
La question / est / étiquetée linux, oui, mais cela ne signifie pas que je préférerai une réponse vague «C'est fait de cette façon parce que d'autres systèmes le font de cette façon» à une réponse qui explique pourquoi c'est fait de cette façon sur d'autres systèmes. (Peut-être que la linuxbalise devrait simplement être supprimée?)
Blacklight Shining