Accéder aux fichiers dans un répertoire sans x-permission?

19

J'ai un peu de mal à comprendre ce que signifie l'autorisation d'exécution pour les répertoires. Dois-je comprendre correctement que tout élément d'un répertoire pour lequel un utilisateur n'a pas de droits x est inaccessible même si les éléments contenus dans le répertoire donnent des droits spécifiques à l'utilisateur?

Ou l'utilisateur aura-t-il toujours un accès direct aux éléments du répertoire, mais ne pourra tout simplement pas répertorier ce qui se trouve dans le répertoire?

(Ce que j'essaie vraiment de comprendre, c'est à quel point un répertoire est protégé contre l'accès des autres utilisateurs s'ils n'ont pas l'autorisation x pour cela.)

Leo
la source

Réponses:

20

Le bit x pour le répertoire est également appelé bit de recherche. En fait, il vous permet d'accéder aux inodes des fichiers répertoriés dans le dossier. Donc, si vous voulez accéder à /home/user/foo/bar.txt, vous devez avoir un accès à la recherche sur chaque ancêtre de bar.txt

Citant de la page

Étant donné que les répertoires ne sont pas utilisés de la même manière que les fichiers standard, les autorisations fonctionnent légèrement (mais seulement légèrement) différemment. Une tentative de liste des fichiers dans un répertoire nécessite une autorisation de lecture pour le répertoire, mais pas sur les fichiers qu'il contient. Une tentative d'ajouter un fichier à un répertoire, de supprimer un fichier d'un répertoire ou de renommer un fichier nécessite tous une autorisation d'écriture pour le répertoire, mais (peut-être de manière surprenante) pas pour les fichiers qu'il contient. L'autorisation d'exécution ne s'applique pas aux répertoires (un répertoire ne peut pas également être un programme). Mais ce bit d'autorisation est réutilisé pour des répertoires à d'autres fins.

Une autorisation d'exécution est nécessaire sur un répertoire pour pouvoir y entrer (c'est-à-dire faire de certains répertoires votre répertoire de travail actuel).

Exécuter est nécessaire sur un répertoire pour accéder aux informations d'inode des fichiers qu'il contient. Vous en avez besoin pour rechercher un répertoire dans lequel lire les inodes des fichiers. Pour cette raison, l'autorisation d'exécution sur un répertoire est souvent appelée autorisation de recherche à la place.

Une autorisation de recherche est requise dans de nombreuses situations courantes. Considérez la commande cat / home / user / foo. Cette commande nécessite clairement une autorisation de lecture pour le fichier foo. Mais à moins que vous n'ayez l'autorisation de recherche sur les répertoires /, / home et / home / user, cat ne peut pas localiser l'inode de foo et ne peut donc pas le lire! Vous avez besoin d'une autorisation de recherche sur chaque répertoire ancêtre pour accéder à l'inode de n'importe quel fichier (ou répertoire), et vous ne pouvez pas lire un fichier à moins que vous puissiez accéder à son inode.

Veuillez lire la section du répertoire des autorisations de fichiers.

Mise à jour: Leo a soulevé une très bonne question. Si nous connaissons l'inode, pouvons-nous accéder à un fichier à partir d'un répertoire dont le bit x n'est pas défini? Je pense que nous ne devrions pas pouvoir le faire. Je ne l'ai pas testé par le programme c mais plutôt utilisé quelques commandes bash pratiques pour le confirmer.

user@user-desktop:~/test$ ls -lart
total 12
drwxr-xr-x 49 user user 4096 2011-11-30 22:37 ..
drwxr-xr-x  3 user user 4096 2011-11-30 22:37 .
drwxr-xr-x  2 user user 4096 2011-11-30 22:38 level1
user@user-desktop:~/test$ ls -lart level1/
total 12
drwxr-xr-x 3 user user 4096 2011-11-30 22:37 ..
drwxr-xr-x 2 user user 4096 2011-11-30 22:38 .
-rw-r--r-- 1 user user    8 2011-11-30 22:38 file1
user@user-desktop:~/test$ stat level1
  File: `level1'
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 808h/2056d  Inode: 95494       Links: 2
Access: (0755/drwxr-xr-x)  Uid: ( 1000/    user)   Gid: ( 1000/    user)
Access: 2011-11-30 22:46:16.576702105 +0530
Modify: 2011-11-30 22:38:12.386701913 +0530
Change: 2011-11-30 22:46:08.876702102 +0530
user@user-desktop:~/test$ stat level1/file1 
  File: `level1/file1'
  Size: 8           Blocks: 8          IO Block: 4096   regular file
Device: 808h/2056d  Inode: 60775       Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    user)   Gid: ( 1000/    user)
Access: 2011-11-30 22:38:19.846701917 +0530
Modify: 2011-11-30 22:38:16.366701915 +0530
Change: 2011-11-30 22:38:16.366701915 +0530
user@user-desktop:~/test$ chmod -x level1
user@user-desktop:~/test$ stat level1/file1 
stat: cannot stat `level1/file1': Permission denied
user@user-desktop:~/test$ ls -lart level1/
ls: cannot access level1/..: Permission denied
ls: cannot access level1/.: Permission denied
ls: cannot access level1/file1: Permission denied
total 0
-????????? ? ? ? ?                ? file1
d????????? ? ? ? ?                ? ..
d????????? ? ? ? ?                ? .
user@user-desktop:~/test$ cat level1/file1
cat: level1/file1: Permission denied
user@user-desktop:~/test$ find . -inum 95494
./level1
user@user-desktop:~/test$ find . -inum 60775
user@user-desktop:~/test$ find ./level -inum 60775
find: `./level': No such file or directory
user@user-desktop:~/test$ find ./level1 -inum 60775
Amey Jah
la source
2
Donc, si j'ai le numéro d'inode d'un fichier / répertoire dans un répertoire sans droit de recherche, je serais en mesure d'y accéder aussi longtemps que ses autorisations le lui permettent? (Obtenir le numéro d'inode sans être capable de faire des statistiques est assez difficile, je suppose.)
Leo
@Leo Je pense que nous ne devrions pas pouvoir le faire. J'ai mis à jour la réponse. Si vous avez un petit talon en C, veuillez le vérifier et nous le faire savoir.
Amey Jah
1
@AmeyJah, en fait, je parie que vous le pouvez. Considérez ce qui se passe lorsque vous liez en dur un fichier à un autre répertoire auquel vous êtes autorisé. Même inode, mais vous pouvez ensuite le lire. En d'autres termes, l'autorisation de lecture ne dépend pas du système qui recherche tous les dossiers auxquels l'inode pourrait appartenir et qui vérifie s'ils ont le bit x. Excellente réponse cependant. Merci beaucoup.
user1477
@AmeyJah ls , stat etc. use stat (2) etc. Juste au cas où vous ne le sauriez pas maintenant. Je pourrais écrire un programme C mais votre test fait tout ce que le programme montrerait bien que sûr qu'il puisse faire plus, le point est le même: il utilise les appels système (section 2). Les appels de bibliothèque (section 3) sont de niveau plus élevé que les appels système, mais cela ne change rien (par exemple, remove (3) utilise rmdir (2) pour les répertoires et unlink (2) pour les fichiers).
Pryftan
5

Puisque vous demandez des répertoires:

lire signifie: lire le contenu, c'est-à-dire les lister avec ls.

écrire signifie: écrire dans le réalisateur. c'est-à-dire la création de fichiers ou de sous-répertoires.

exécuter signifie: entrer dans ce répertoire.

les autorisations de lecture et d'exécution peuvent être un peu délicates pour les répertoires.

Par exemple, si vous avez des autorisations de lecture mais que vous ne l'exécutez pas, vous pouvez répertorier le contenu du répertoire mais ne pouvez pas y accéder. Vous ne pouvez pas non plus lister des fichiers ou répertoires spécifiques même si vous connaissez ses noms.

Si vous disposez d'une autorisation d'exécution mais que vous ne lisez pas, vous pouvez y accéder mais ne pouvez pas lister directement les fichiers. Mais, si vous connaissez les noms des fichiers ou répertoires, vous pouvez les répertorier.

cœur magique
la source
2
Si vous avez une autorisation de lecture mais ne l'exécutez pas, vous pouvez lister (ls) le contenu du répertoire mais ne pouvez pas accéder (cat) aux fichiers qu'il contient. Si vous avez l'autorisation d'exécution mais que vous ne lisez pas et que vous connaissez les noms des fichiers, vous pouvez y accéder (cat).
dash17291
2

L'autorisation d'exécution sur les répertoires signifie:

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

Si vous n'avez pas le xdroit sur votre répertoire, vous ne pouvez pas:

  • Entrez dans le répertoire (ex: cd)
  • Impossible d'accéder à n'importe quel fichier de ce répertoire (même si vous connaissez le nom).

Exemple:

$ ls -ld testdir
drw------- 2 xxxxxx xxxxxx 14 2011-11-29 19:38 testdir

$ cd testdir
bash: cd: testdir: Permission denied

$ cat testdir/a
cat: testdir/a: Permission denied

$ chmod 700 testdir
$ cat testdir/a
Some text.

Lisez Linux File Permission Confusion pt 2 pour une bonne introduction sur le sujet.

La seule chose que l' xautorisation ne semble pas empêcher est d'accéder aux noms des fichiers de ce répertoire.

Exemple:

$ ls -ld testdir
drw------- 2 xxxxxx xxxxxx 14 2011-11-29 19:38 testdir

$ ls testdir
ls: cannot access testdir/a: Permission denied
ls: cannot access testdir/b: Permission denied
a  b
lgarzo
la source