Pourquoi rm est-il autorisé à supprimer un fichier appartenant à un autre utilisateur?

52

De la poste Pourquoi rm peut-il supprimer des fichiers en lecture seule? Je comprends que vous avez rmsimplement besoin d’une permission d’écriture sur le répertoire pour supprimer le fichier. Mais je trouve difficile de digérer le comportement où nous pouvons facilement supprimer un fichier qui propriétaire et groupe différent.

J'ai essayé le suivant

mtk: mon nom d'utilisateur
abc: a créé un nouvel utilisateur

$ ls -l file
-rw-rw-r-- 1 mtk mtk       0 Aug 31 15:40 file
$ sudo chown abc file
$ sudo chgrp abc file
$ ls -l file
-rw-rw-r-- 1 abc abc       0 Aug 31 15:40 file
$ rm file
$ ls -l file
<deleted>

Je pensais que cela n'aurait pas dû être autorisé. Un utilisateur devrait-il pouvoir supprimer uniquement les fichiers en sa possession? Quelqu'un peut-il expliquer pourquoi cela est autorisé? et quel est le moyen d'éviter cela? Je ne peux que penser à limiter l’autorisation en écriture du répertoire parent pour interdire les suppressions de fichier surprises.

mtk
la source

Réponses:

100

La raison pour laquelle cela est autorisé est liée à ce que supprime réellement un fichier. Conceptuellement, rmle travail de est de supprimer une entrée de nom d'un répertoire. Le fait que le fichier puisse alors devenir inaccessible s'il s'agissait du seul nom du fichier et que l'inode et l'espace occupé par le fichier peut donc être récupéré à ce stade est presque accessoire. Le nom de l'appel système invoqué par la rmcommande, qui est unlink, suggère même ce fait.

Et, supprimer une entrée de nom d'un répertoire est fondamentalement une opération sur ce répertoire , de sorte que ce répertoire est ce dont vous avez besoin pour pouvoir écrire.


Le scénario suivant peut le rendre plus confortable? Supposons qu'il existe des répertoires:

/home/me    # owned and writable only by me
/home/you   # owned and writable only by you

Et il y a un fichier qui appartient à moi et qui a deux liens durs:

/home/me/myfile
/home/you/myfile

Peu importe comment ce lien dur est /home/you/myfilearrivé là en premier lieu. Peut-être le rootmettre là.

L'idée de cet exemple est que vous devriez être autorisé à supprimer le lien dur /home/you/myfile. Après tout, cela encombre votre répertoire. Vous devriez pouvoir contrôler ce qui existe et n’existe pas à l’intérieur /home/you. Et lorsque vous supprimez /home/you/myfile, notez que vous n'avez pas réellement supprimé le fichier. Vous avez seulement supprimé un lien vers celui-ci.


Notez que si le bit sticky est sur le répertoire contenant un fichier (apparaît comme tdans ls), alors vous avez besoin d'être le propriétaire du fichier afin d'être autorisé à le supprimer (sauf si vous possédez le répertoire). Le bit collant est généralement activé /tmp.

Celada
la source
6
Avec le bit collant sur le répertoire, vous devez pouvoir modifier le fichier pour pouvoir le supprimer. Autrement dit, si le fichier appartient à une autre personne du même groupe que vous et que le groupe peut écrire dans le fichier, vous pouvez supprimer le fichier. Corollaire: n'importe qui peut supprimer un fichier avec une autorisation d'écriture publique. (Tous sujets à pouvoir modifier le répertoire, bien sûr.)
Jonathan Leffler
1
Je vous interprète peut-être mal, mais ne dites-vous pas que je peux le supprimer en -rw-rw-rw- 1 root root 0 Sep 1 11:11 /tmp/footant qu'utilisateur régulier ( /tmpcollant) parce que je suis autorisé à l'écrire? Pourtant je ne peux pas.
Celada
4
Je pense que le scénario me/ youdevient plus clair si vous supposez que l'utilisateur (celui qui n'est pas propriétaire du fichier) a créé le lien. Les pronoms sont difficiles à utiliser. Disons qu'Al crée /home/al/file1et que Bob, qui a un accès en lecture (et peut-être en lecture) /home/al, relie le fichier en dur /home/bob/als_file. Faut-il empêcher Bob de supprimer un lien qu'il a créé?   Et Al devrait-il être autorisé à supprimer (dissocier) /home/bob/als_filelorsqu'il n'a pas accès en écriture à /home/bob? Cette route mène au chaos.
Scott
2
@JonathanLeffler: Comme le montre l'exemple de Scott, non, le fait de dissocier et de tronquer n'a pas le même résultat net lorsqu'il existe des liens durs en jeu.
Kevin
6
@ Kevin Je pense que le fait est que si quelqu'un a une permission d'écriture sur le fichier pour pouvoir en détruire le contenu, il peut tout aussi bien être autorisé à la dissocier (en supposant qu'il dispose également d'une permission d'écriture dans le répertoire). L'inverse ne s'applique pas - le fait de pouvoir supprimer le fichier d'un répertoire ne signifie pas qu'il devrait être capable de détruire le contenu, car ils peuvent être accessibles depuis un autre répertoire. Telle est la logique derrière le fonctionnement du bit sticky.
Barmar
9

Pour supprimer un fichier, il vous suffit de pouvoir écrire dans le répertoire dans lequel se trouve le fichier.

Si vous n'aimez pas cela, vous pouvez définir le paramètre "Post-it" via chmod +t dirsi vous utilisez un système d'exploitation à mi-parcours récent (cette fonctionnalité a été introduite vers 1986 dans SunOS).

Si vous voulez être plus précis, vous avez besoin d’un système de fichiers avec une implémentation ACL moderne telle que ZFS. Les listes de contrôle d'accès NFSv4 standard basées sur NTFS incluent la prise en charge des autorisations de suppression spécifiques aux fichiers par utilisateur et une autorisation "delete_child" pour les répertoires.

schily
la source
9
Notez que pour ajouter le tbit, vous devez posséder le répertoire. Et si vous possédez le répertoire, vous pouvez toujours supprimer des fichiers, que le tbit soit défini ou non. Si vous liez un fichier à un répertoire de quelqu'un d'autre, vous devez être prêt à ce que quelqu'un d'autre puisse le supprimer. Une alternative serait de créer d’abord un sous-répertoire et d’y ajouter votre fichier, le propriétaire ne pouvant pas supprimer ce sous-répertoire s’il n’est pas vide.
Stéphane Chazelas
6
Vous décrivez la situation de manière trompeuse. Techniquement, un fichier n'est pas dans un répertoire. au lieu de cela, un nom pour un fichier se trouve dans le répertoire et rmconstitue une opération sur le répertoire et non sur le fichier. Un fichier est supprimé lorsque la dernière référence est supprimée, mais techniquement, il s'agit d'un effet secondaire.
reinierpost
0

La logique est semblable à celle d'une maison: le propriétaire ou le locataire décide quels invités jeter, peu importe à qui appartiennent les invités. En outre, l'invité expulsé qui est le bienvenu dans une autre maison (a un autre lien fixe dans le répertoire de quelqu'un d'autre) ne gèlera pas à l'extérieur.

rackandboneman
la source