Exécuter vs lire bit. Comment fonctionnent les autorisations de répertoire sous Linux?

381

Dans mon CMS, j'ai remarqué que les répertoires ont besoin de l'exécutable bit ( +x) défini pour que l'utilisateur puisse les ouvrir. Pourquoi l'autorisation d'exécution est-elle requise pour lire un répertoire et comment fonctionnent-elles dans Linux?

Nick.h
la source
17
... euh, parce que c'est ce que le drapeau "+ x" est pour :)
Badp
16
Pensez comme ceci: l'entrée du répertoire contient les noms de fichiers , donc "lire" un répertoire répertorie les fichiers, "utiliser" le répertoire accède aux fichiers.
tylerl
7
Avec le répertoire execute bit défini , vous êtes autorisé à parcourir sa hiérarchie . Étant donné que vous appartenez à "d'autres" personnes et que vous n'avez que execute bit set ( chmod 771 dirOne), vous ne pouvez pas lister le contenu de dirOne. MAIS si elle contient un sous-répertoire "dirTwo" avec des droits définis comme ( chmod 774 dirTwo), vous pouvez lister son contenu!
Stéphane
1
Les futurs visiteurs devraient également consulter la question correspondante sur AskUbuntu: askubuntu.com/q/1106822/295286
Sergiy Kolodyazhnyy Le

Réponses:

352

Lorsque vous appliquez des autorisations à des répertoires sous Linux, les bits d'autorisation ont une signification différente de celle des fichiers classiques.

  • Le bit de lecture ( r) permet à l'utilisateur concerné de répertorier les fichiers du répertoire.
  • Le bit d’écriture ( w) permet à l’utilisateur concerné de créer, renommer ou supprimer des fichiers du répertoire et de modifier les attributs du répertoire.
  • Le bit d’exécution ( x) permet à l’utilisateur concerné d’entrer dans le répertoire et d’accéder aux fichiers et aux répertoires
  • Le bit collant ( Tou tsi le bit d'exécution est défini pour les autres) indique que les fichiers et les répertoires de ce répertoire ne peuvent être supprimés ou renommés que par leur propriétaire (ou root).
Chris Down
la source
25
Excellente réponse, mais je pense que la dernière phrase est trompeuse. Aucune de ces autorisations ne peut en réalité être remplacée par fichier. Ici, «accès» est un peu ambigu: +xsur le répertoire, l'accès aux fichiers inodes est autorisé via ce répertoire spécifique (rien de moins, rien de plus, enfin… peut- chdirêtre +xaussi besoin ). Pour lire ou écrire le contenu d'un fichier, l'utilisateur doit aussi +r/ +wsur ce fichier, mais il s'agit d'autorisations distinctes (elles ne remplacent rien).
Stéphane Gimenez
2
Le drapeau immuable est spécifique au système de fichiers et il ne remplacera pas précisément ces autorisations. C'est pourquoi je pense que la dernière phrase est trompeuse :-)
Stéphane Gimenez le
1
Je pense qu'il pourrait être utile de mentionner ACL dans cette réponse et dans d’autres, car leur application pour certains annuaires peut être trompeuse si l’on ne
tenait
4
Il semble que cette réponse ne mentionne pas l'effet combiné de bit d'écriture et de bit d'exécution, comme le dit la réponse de Baldrick ci-dessous? C'est-à-dire que si vous avez seulement une permission d'écriture mais pas une permission d'exécution, c'est tout à fait inutile.
xji
1
@ StéphaneGimenez " +xsur le répertoire accorde l'accès aux fichiers inodes" - Cela semble être un bon némonique, mais peut-être ne raconte-t-il pas toute l'histoire? Sans le bit d'exécution défini sur un répertoire, vous ne pouvez pas modifier le nom de fichier d'un fichier de ce répertoire. Je me demande pourquoi, car le nom de fichier est stocké dans une entrée de répertoire, pas un inode.
Kevin Wheeler
259

D'abord, réfléchissez: qu'est-ce qu'un répertoire? C'est juste une liste d'éléments (fichiers et autres répertoires) qui y vivent. Donc: répertoire = liste de noms.

Lire bit = Si défini, vous pouvez lire cette liste. Donc, par exemple, si vous avez un répertoire nommé poems:

  • Vous pouvez ls poemset vous obtiendrez une liste des objets qui y vivent ( -lne révélera aucun détail!).
  • Vous pouvez utiliser la complétion de ligne de commande c'est-à-dire touch poems/so <TAB> poems/somefile.
  • Vous ne pouvez pas créer poemsvotre répertoire de travail cd.

Write bit = Si défini, vous pouvez modifier cette liste, c'est-à-dire vous pouvez {ajouter, renommer, supprimer} des noms. Mais! En réalité, vous ne pouvez le faire que si le bit d'exécution est également défini.

Execute bit = Définissez ce répertoire comme votre répertoire de travail cd. Vous avez besoin de cette permission si vous voulez:

  • accéder (lire, écrire, exécuter) les éléments qui y vivent.
  • modifier la liste elle-même, c'est-à-dire y ajouter, renommer, supprimer des noms (bien entendu, le bit d'écriture doit être défini sur le répertoire).

Cas intéressant 1 : Si vous disposez des autorisations d'écriture + exécution sur un répertoire, vous pouvez {supprimer, renommer} les éléments qui y sont contenus même si vous ne disposez pas d'une interdiction d'écriture sur ces éléments. (utilisez un peu collant pour éviter cela)

Cas intéressant 2 : Si vous disposez d'une autorisation d'exécution (mais pas d'écriture) sur un répertoire ET que vous avez l'autorisation d'écriture sur un fichier résidant dans celui-ci, vous ne pouvez pas supprimer le fichier (car il implique de le supprimer de la liste). Cependant, vous pouvez en effacer le contenu. Par exemple, s'il s'agit d'un fichier texte, vous pouvez utiliser vi pour l'ouvrir et tout supprimer. Le fichier sera toujours là, mais il sera vide.

Sommaire:

Lire le bit = Vous pouvez lire les noms sur la liste.
Write bit = Vous pouvez {ajouter, renommer, supprimer} les noms de la liste SI le bit d'exécution est également défini.
Execute bit = Vous pouvez faire de ce répertoire votre répertoire de travail.

PS: L'article mentionné par Kusalananda est une bonne lecture.

Baldrick
la source
17
Considérer l'annuaire comme une liste rend les choses plus claires et logiques.
Trismegistos
20
Excellente réponse, mais trop centrée sur le terme "répertoire de travail". J'ai besoin du xbit pour tout accès à ce fichier: car cat a/b/c/d, j'ai besoin du xbit sur tous a, bet cmême si je ne les utilise pas en tant que cwd.
Glglgl
1
C'est là que j'ai découvert que vous ne pouvez pas écrire à moins que ce ne soit aussi exécutable! Le cas 2 est également intéressant, excellente réponse!
Mirko
1
Une autre remarque est que même si vous avez la xpermission sur le répertoire, si vous n'avez pas la xpermission sur le fichier à l' intérieur, vous ne pouvez pas vraiment "exécuter" le fichier. Vous ne pouvez le faire que catpar exemple, mais vous ne pouvez pas exécuter le fichier lui-même.
xji
2
Si vous voulez ls -ltravailler pour un dossier, vous devez avoir à la fois une autorisation ret une xpermission.
Eric Wang
44

J'ai préparé ce tableau avec toutes les autorisations possibles et leurs effets pratiques.

autorisations de répertoire linux

(*) Uniquement les noms de fichiers : les autres attributs tels que la taille ou la date ne sont pas accessibles. Par exemple, vous pouvez utiliser la touche de tabulation pour la saisie semi-automatique mais pas la commande ls.

Quelques réflexions :

  • Avec X non défini , R et W sont généralement inutiles.
  • X seul la désactivation de RW vous donne un faux sentiment de sécurité puisque vous pouvez lire et écrire à l'aveuglette le contenu du fichier et accéder aux sous-répertoires. Vous devez vous assurer que tous les enfants directs du répertoire ont des autorisations explicites.
  • Rarement vous utiliserez d'autres valeurs que:
    • 0 : pas d'accès.
    • 1 : accès minimum permettant la traversée.
    • 5 : Autorise la lecture / écriture, mais ne modifie pas la structure de l'arborescence de répertoires elle-même.
    • 7 : accès complet.
David
la source
1
Je considérerais 5 comme une valeur utile lorsque vous souhaitez autoriser la lecture / écriture, mais ne modifiez pas la structure de l’arborescence de répertoires elle-même.
hgiesel
Tu as raison. Mis à jour!
David
4
Grand tableau récapitulatif. Je me demande ce que quelqu'un pensait avoir -W-fonctionnellement équivalent aux ---annuaires. Pas très intuitif. Bien sûr, ces types de bits de bas niveau ne le sont souvent pas.
CivFan
2
J'ai testé cela sur mon mac, mais avec -W-, je pourrais renommer le répertoire (dans un répertoire avec un sticky bit) mais pas avec ---. Cela semble être une différence
cozyconemotel
3
@ David, vous manquez le peu collant.
Pacerier
42

Voici un bon article à ce sujet.

Sommaire:

Un répertoire avec son xbit défini permet à l'utilisateur de cd(changer de répertoire) dans ce répertoire et d'accéder aux fichiers qu'il contient.

Détails:

  • Lire ( r)

    La possibilité de lire les noms des fichiers stockés dans ce répertoire.

  • Écrire ( w)

    Possibilité de renommer des fichiers du répertoire, de créer de nouveaux fichiers ou de supprimer des fichiers existants, si vous disposez également des autorisations d'exécution. Si vous n'avez pas de permanente d'exécution, alors les permanentes d'écriture n'ont pas de sens.

  • Exécuter ( x)

    La possibilité d' cdentrer dans ce répertoire et d'accéder aux fichiers de ce répertoire.

Voici quelques exemples qui devraient faciliter la compréhension:

# "Full Access".  Reegen can list, create, delete, rename, delete,
# and stat any files in dir.
# Access to file contents is subject to the permissions
# of the file itself.
# New files can be created, any file can be deleted, regardless of
# file permissions.
drwx------  1 reegen    reegen          4096 Jan 01 2003  dir

# Reegen can do everything in the "Full Access" list except create,
# delete, or rename files in this directory.
dr-x------  1 reegen    reegen          4096 Jan 01 2003  dir

# Reegen can do everything in the "Full Access" list except list the
# filenames in this directory.  If she suspects there is a file
# named "program" she can list it, but cannot do an 'ls'
# of the directory itself.  She can access any file (file
# permissions permitting) if she knows its name.  She can
# create new files, or rename/delete existing ones.
d-wx------  1 reegen    reegen          4096 Jan 01 2003  dir

# Reegen cannot create or delete any files in this directory.
# She can access any file (permissions permitting) if she
# knows its name already.
d--x------  1 reegen    reegen          4096 Jan 01 2003  dir

Il y a encore plus d'informations dans l' article de Hacking Linux Exposed .

Kusalananda
la source
4

Extrait du livre de Robert Love "Programmation du système LINUX" chapitre 1 section permission-

entrez la description de l'image ici

Alhelal
la source
2

Pour toute opération accédant à un fichier ou à un répertoire, il faut d'abord résoudre le chemin d'accès au fichier ou au répertoire. La résolution nécessite que l'utilisateur dispose d'une autorisation d'exécution sur tous les répertoires du chemin, à l'exception du composant final. Donc, pour les répertoires, vous pouvez penser que le bit d’exécution signifie «résolvable».

Prenons le chemin /a/b/c.txtcomme exemple, disons que l'utilisateur a 1) exécuter l'autorisation sur /et /a; 2) a l'autorisation de lecture sur /a/b; 3) lire et écrire la permission sur /a/b/c.txt.

  • L'utilisateur échouera à lire (liste) /a, car il n'a pas de permission de lecture. Mais la résolution du chemin n'échoue pas.

  • L'utilisateur sera en mesure de lire (liste) /a/b, parce que l'utilisateur a l' autorisation d' exécution sur /, /aet l' autorisation de lecture /a/b. Notez que, lors de la lecture /a/b, le nom du fichier c.txtest visible, mais les métadonnées (par exemple, la taille du fichier) et le contenu ne l’est pas, car le nom du fichier est stocké dans le répertoire, pas dans le fichier, mais les métadonnées sont stockées dans l’inode du fichier.

  • L'utilisateur ne parviendra pas à lire /a/b/c.txt, parce que lors de la résolution du chemin de /la /aà /a/b, elle échoue à /a/bcar l'utilisateur n'a pas l' autorisation d' exécution.

Voir aussi comment un chemin est résolu dans un fichier .

Dagang
la source
0

Une analogie utile consiste à considérer chaque fichier comme un livre et chaque répertoire comme une pièce dans laquelle les livres sont conservés.

Il y a des règles pour pouvoir lister tous les noms d'une pièce: le bit de lecture pour les répertoires. Règles pour supprimer un livre de la salle: le bit d'écriture pour les répertoires. Et règles pour entrer dans une salle et explorer: le répertoire résultant exécute bit.

Ces règles sont distinctes et différentes des règles de chaque livre. Il existe des règles permettant à quelqu'un d'ouvrir un livre et de lire son contenu: le ou les bits de lecture de chaque fichier. Il existe des règles pour modifier le contenu d'un livre: le ou les bits d'écriture de chaque fichier. Et pour exécuter un fichier: le ou les bits d’exécution de chaque fichier.

J'écris des bits car il y a trois bits pour chaque action. Il existe un bit de lecture pour le propriétaire, un bit de lecture pour le (s) groupe (s) et un bit de lecture pour tout le monde (les autres). Si l'un de ces trois bits est défini pour un utilisateur spécifique, le bit de lecture de cet utilisateur est actif. Peu importe la façon que peu a été révélé actif soit par u ser ou g roupe ou o utres, il a les mêmes résultats efficaces.

Ainsi, un utilisateur pourrait être autorisé à entrer dans une pièce et à retirer des livres de la bibliothèque mais pas autorisé à lire le contenu du même livre.

C'est pourquoi un bit de lecture pour les répertoires est requis: pour contrôler qui est autorisé à répertorier le contenu de la salle (titres du livre).

Et le bit d’ exécution sert à contrôler qui peut entrer dans la salle des livres.

Isaac
la source
-1

La signification de Execute pour les répertoires est assez claire. Comme il n’existe pas d’autorisation Traverse, contrairement à Windows, vous devez surcharger quelque chose. Les concepteurs ont choisi Execute, ce qui cause une confusion sans fin. En tant que spécialiste de la sécurité informatique, attribuer des droits d'exécution à quelque chose que vous n'avez pas l'intention d'exécuter, Exécuter semble louche.

NemoX
la source
1
L’invention du bit d’autorisation d’exécution est antérieure à l’invention du concept d’une autorisation de traversée distincte d’environ deux décennies. La logique de cette réponse dépend d'un calendrier historique qui ne ressemble en rien à celui du monde réel et qui ne remarque pas non plus l'existence GENERIC_EXECUTEet ce qu'il est.
JdeBP