Quand chmod échoue-t-il?


8

Dans quelles circonstances chmodéchouera-t-il?

J'ai regardé la page de manuel mais elle spécifie uniquement l'utilisation et n'entre pas dans les détails sur les circonstances dans lesquelles cela ne fonctionnera pas.

Je suppose que chmodcela fonctionnera si:

  • tu es root
  • vous possédez le fichier cible (et définissez un bit de mode banal, c'est-à-dire pas un bit collant, d'autres)

Les utilisateurs peuvent-ils utiliser chmodpour modifier les autorisations sur un fichier auquel ils ont accès en groupe? Est-ce lié à l'accès en lecture / écriture?


2
Il échouera si l'inode ne peut pas être modifié, par exemple le système de fichiers est en lecture seule.
jordanm du

Réponses:


3

Seul le propriétaire du fichier ou l'utilisateur root peut modifier les autorisations d'un fichier. Les autorisations actuelles sur le fichier ou sur son répertoire parent ne sont pas pertinentes¹. Ceci est spécifié dans POSIX :

L'application doit s'assurer que l'ID utilisateur effectif du processus correspond au propriétaire du fichier ou que le processus dispose des privilèges appropriés pour ce faire.

Sur la plupart des unités, les «privilèges appropriés» signifient l'exécution en tant que root. Si ces conditions ne sont pas remplies, chmodéchoue généralement avec EPERM, bien que d'autres comportements tels que l'interruption du programme en raison d'une violation de la sécurité soient autorisés.

De plus, certaines variantes Unix ont des moyens spécifiques au système d'autoriser ou d'interdire chmod. Par exemple, Linux a une capacité ( CAP_FOWNER) qui permet aux processus de modifier les autorisations d'un fichier et d'autres métadonnées quel que soit son propriétaire.

D'autres raisons chmodpeuvent échouer même si le fichier existe, est accessible et possède le propriétaire approprié. Les plus courants incluent un système de fichiers en lecture seule ou un système de fichiers qui ne prend pas en charge les autorisations telles que FAT. Les moins courants incluent des restrictions spécifiques au système telles que l' attribut immuable du système de fichiers ext2 et des successeurs de Linux.

¹ Sauf dans la mesure où le processus en cours d'exécution chmoddoit pouvoir accéder au fichier, il doit donc disposer de l'autorisation d'exécution sur le répertoire contenant le fichier et tout autre répertoire qu'il parcourt pour le faire.


2

Les détails souhaités se trouvent dans la page de manuel de l'appel système chmod (). Au lieu d' man chmodutilisation man 2 chmod. man chattret man 2 setxattrvous intéressera également; les attributs de fichier définis par chattr / setxattr () augmentent le comportement des autorisations Unix traditionnelles définies par chmod.


J'essaierai cela quand je serai sans travail.
Wug

1

Selon la norme UNIX, "l'ID utilisateur effectif du processus doit correspondre au propriétaire du fichier ou le processus doit disposer des privilèges appropriés pour ce faire."

Le morceau sur les privilèges appropriés nécessite quelques explications. Sur les systèmes traditionnels, chmod est autorisé sur tous les fichiers lorsque l'UID effectif (sous Linux, l'UID du système de fichiers, mais voir ci-dessous) du processus est 0 [c'est-à-dire root].

Linux a un système appelé capacités , et le CAP_FOWNERbit contrôle la capacité à utiliser chmodsur tous les fichiers. Par défaut, toutes les capacités sont accordées lorsqu'un execve()appel crée un processus racine (soit en exécutant un binaire setuid, soit lorsque l'UID réel est 0) ou lorsque l'UID effectif est défini sur 0 (et supprimé lorsqu'il est défini sur une valeur non nulle) et un ensemble de fonctionnalités, notamment CAP_FOWNERactivées lorsque l’UID du système de fichiers est défini sur 0 (et désactivées lorsqu’il est défini sur une valeur différente de zéro). Lisez la page de manuel pour plus de détails.

Vous avez mentionné le bit collant, mais omis le fait que les utilisateurs ne peuvent pas non plus définir le bit setgid sur un fichier lorsqu'ils ne font pas partie du groupe affecté au fichier. Le bit setuid ou setgid peut également être ignoré dans des circonstances supplémentaires définies par l'implémentation.


0

Les utilisateurs peuvent-ils utiliser chmod pour modifier les autorisations sur un fichier auquel ils ont accès en groupe?

Pourquoi n'essayez-vous pas de voir?

$ touch foo
$ sudo install -o root -g $(id -gn) -m660 foo bar
$ ls -la bar
-rw-rw----  1 root  staff  0 Oct 21 21:33 bar
$ chmod g-w bar
chmod: bar: Operation not permitted
$ chmod g+x bar
chmod: bar: Operation not permitted

Je l'ai poussé, mais c'est lié à la sécurité et je ne veux pas rater accidentellement un cas de bord.
Wug

Si vous vous inquiétez d'un cas de bord, vous pouvez (au moins pour minimiser les risques) le faire chmod, puis vérifier les autorisations sur celui-ci. Si vous vous sentez paranoïaque, faites-le fsyncavant de vérifier.
nanofarad
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.