Por que a rm tem permissão para excluir um arquivo pertencente a outro usuário?

52

Da postagem Por que a rm pode remover arquivos somente leitura? Eu entendo que rmsó precisa de permissão de gravação no diretório para remover o arquivo. Mas acho difícil digerir o comportamento em que podemos excluir facilmente um arquivo que possui e agrupa diferentes.

Eu tentei o seguinte

mtk: my username
abc: criou um novo usuário

$ 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>

Eu estava pensando que isso não deveria ter sido permitido. Um usuário deve poder excluir apenas arquivos de sua propriedade? Alguém pode esclarecer por que isso é permitido? e qual é a maneira de evitar isso? Só posso pensar em restringir a permissão de gravação do diretório pai para desabilitar exclusões de arquivos surpresas.

mtk
fonte

Respostas:

100

A razão pela qual isso é permitido está relacionada ao que a remoção de um arquivo realmente faz. Conceitualmente, rmo trabalho é remover uma entrada de nome de um diretório. O fato de o arquivo ficar inacessível se esse for o único nome do arquivo e que o inode e o espaço ocupado pelo arquivo puderem ser recuperados nesse ponto é quase incidental. O nome da chamada do sistema que o rmcomando chama, ou seja unlink, é até sugestivo desse fato.

E, remover uma entrada de nome de um diretório é fundamentalmente uma operação nesse diretório , para que esse diretório seja o que você precisa ter permissão para gravar.


O cenário a seguir pode torná-lo mais confortável? Suponha que haja diretórios:

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

E há um arquivo que é de minha propriedade e que possui dois links físicos:

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

Não importa como esse link /home/you/myfiledireto chegou lá em primeiro lugar. Talvez rootcoloque lá.

A ideia deste exemplo é que você deve remover o link físico /home/you/myfile. Afinal, está bagunçando seu diretório. Você deve poder controlar o que existe e o que não existe lá dentro /home/you. E quando você remover /home/you/myfile, observe que você realmente não excluiu o arquivo. Você removeu apenas um link para ele.


Note que se o sticky bit é definido no diretório que contém um arquivo (mostra-se como tem ls), então você fazer necessidade de ser o proprietário do arquivo, a fim de ser autorizado a excluí-lo (a menos que você possui o diretório). A parte pegajosa geralmente está ativada /tmp.

Celada
fonte
6
Com a parte adesiva no diretório, você precisa modificar o arquivo para poder removê-lo. Ou seja, se o arquivo pertencer a outra pessoa no mesmo grupo que você e o grupo puder gravar no arquivo, você poderá removê-lo. Corolário: qualquer pessoa pode remover um arquivo com permissão de gravação pública. (Todos sujeitos a ser capaz de modificar o diretório, é claro.)
Jonathan Leffler
11
Eu posso estar interpretando mal você, mas você não está dizendo que posso removê-lo -rw-rw-rw- 1 root root 0 Sep 1 11:11 /tmp/foocomo meu usuário comum ( /tmpé persistente) porque posso escrever? No entanto, eu não posso.
Celada
4
Acredito que o cenário me/ youentre em um foco mais claro se você tiver a hipótese de que o usuário (aquele que não possui o arquivo) criou o link. Pronomes são difíceis de usar; digamos que Al cria /home/al/file1, e Bob, que tem acesso de execução (e talvez leitura) /home/al, vincula o arquivo /home/bob/als_file. Bob deve ser impedido de remover um link que ele criou?   E Al deve ter permissão para excluir (desvincular) /home/bob/als_filequando ele não tem acesso de gravação /home/bob? Esta estrada leva ao caos.
Scott
2
@ JonathanLeffler: Como mostra o exemplo de Scott, não, desvincular e truncar não tem o mesmo resultado líquido quando há links físicos em jogo.
Kevin
6
@ Kevin Eu acho que o ponto é que, se alguém tiver permissão de gravação no arquivo, para que ele possa destruir o conteúdo, ele também poderá desvinculá-lo (supondo que ele também tenha permissão de gravação no diretório). O inverso não se aplica - poder remover o arquivo de um diretório não significa que ele deve destruir o conteúdo, pois eles podem ser acessados ​​em outro diretório. Essa é a lógica por trás de como o bit pegajoso funciona.
Barmar
9

Para remover um arquivo, você só precisa gravar no diretório em que o arquivo está.

Se você não gostar disso, poderá definir o bit "pegajoso" via chmod +t dirse estiver em um sistema operacional recente (esse recurso foi introduzido por volta de 1986 no SunOS).

Se você deseja ser mais refinado, precisa de um sistema de arquivos com uma implementação ACL moderna como o ZFS. As ACLs padrão do NFSv4 baseadas em NTFS incluem suporte para permissões de exclusão específicas de arquivo por usuário e uma permissão "delete_child" para diretórios.

esperto
fonte
9
Observe que, para adicionar o tbit, você precisa ser o proprietário do diretório. E se você possui o diretório, sempre pode remover arquivos, independentemente de o tbit estar definido ou não. Se você vincular um arquivo ao diretório de outra pessoa, você deve estar preparado para que outra pessoa possa removê-lo. Uma alternativa seria criar primeiro um subdiretório seu e adicionar seu arquivo lá, pois o proprietário não seria capaz de remover esse subdiretório se ele não estiver vazio.
Stéphane Chazelas
6
Você descreve a situação de uma maneira enganosa. Tecnicamente, um arquivo não está em um diretório; em vez disso, um nome para um arquivo está no diretório e rmé uma operação no diretório, não no arquivo. Um arquivo é removido quando a última referência a ele é removida, mas tecnicamente isso é um efeito colateral.
Reinierpost
0

A lógica é semelhante à de uma casa: o proprietário ou inquilino decide quais convidados serão expulsos, independentemente de quem é o proprietário. Além disso, o convidado despejado que é bem-vindo em outra casa (tem outro link no diretório de outra pessoa) não congelará até a morte lá fora.

rackandboneman
fonte