Por que um usuário não raiz pode excluir arquivos criados pela raiz?

24

Dado um usuário não root "joshua", como root, criei um arquivo chamado "foo" no diretório inicial do joshua (/ home / johsua /); fica assim:

-rw-r--r--  1 root   root       0 12-19 21:00 foo

e exclua-o como joshua, eu posso excluí-lo com sucesso.

Eu esperaria que joshua não tenha permissão suficiente para excluí-lo. É algum tipo de 'herança de permissões'? Minha plataforma é o Debian 5.0.7.

Joshua
fonte
1) Isso é fora de tópico. 2) Duvido muito que você tenha sido capaz de excluí-lo como usuário não root sem sudoou com outro escalonamento de privilégios. Você provavelmente ignorou alguma coisa.
DarkDust
16
@DDarkDust Um arquivo é uma entrada em seu diretório pai. Se você tem direitos de gravação em um diretório, você pode remover arquivos nele, independentemente de quem detém os arquivos (a menos que o sticky bit também é definido no diretório)
nºs
@nos: Parvo eu, você está certo.
DarkDust
1
Uma entrada em seu diretório pai é uma referência a um arquivo. Não é o arquivo em si. (Caso contrário, como poderia um arquivo ser difícil ligado a mais de um diretório?)
David Schwartz
@DavidSchwartz isso é verdade, mas excluir o arquivo do diretório é remover a referência na estrutura de diretórios.
Mc0e

Respostas:

43

O usuário não excluiu o arquivo, o sistema o fez. O usuário apenas removeu o arquivo de seu próprio diretório. O sistema excluiu o arquivo porque sua contagem de referência caiu para zero. Por acaso, o usuário que remove o arquivo do diretório reduziu sua contagem de referência para zero. (Se o arquivo tiver sido vinculado a outro diretório ou se um identificador tiver sido aberto, ele não será excluído.)

O sistema exclui arquivos automaticamente quando a contagem de referência cai para zero. O proprietário do arquivo não importa. Existem várias maneiras de alguém que não seja o proprietário de um arquivo reduzir a contagem de referência para zero.

A remoção de um arquivo de um diretório (chamado de 'desvinculação') é uma operação no diretório. Desvincular um arquivo reduz sua contagem de referências.

Da mesma forma, um usuário que não seja o proprietário pode fechar o último identificador em um arquivo que não esteja vinculado a nenhum diretório. Fechar esse identificador excluiria o arquivo também, pois novamente a contagem de referência cairia para zero.

David Schwartz
fonte
1
E é claro que o rmcomando atrapalha um pouco as águas, porque rmé uma abreviação de "remove", e os usuários são treinados para pensar rmcomo uma operação "delete". Muitos usuários usam rmtodos os dias sem ter consciência de que a operação realmente executada é um "desvincular", não uma "excluir". Como resultado, não deve ser realmente surpreendente que muitos usuários achem esse comportamento surpreendente quando o encontrarem pela primeira vez.
Daniel Pryden
É definitivamente surpreendente para muitas pessoas. Pelo menos o rmcomando de fato remove um arquivo ou diretório de um diretório. É pior no Windows, onde o comando é chamado del, porque costumava excluir um arquivo, mas em máquinas Windows modernas (desde o NT4), também é uma operação de desvinculação.
David Schwartz
"O usuário não excluiu o arquivo, o sistema excluiu" Isso não faz sentido. O "sistema" não pode fazer alterações que exijam acesso privilegiado em nome de usuário não privilegiado. Como tal, esta resposta falhará ao explicar por que o mesmo usuário não pode fazer o mesmo se o diretório atual pertencer a + gravável apenas pela raiz. A resposta abaixo de @kerrek é precisa e concisa.
FractalSpace
@FractalSpace Hein? O sistema pode fazer alterações que exijam acesso privilegiado em nome de um usuário sem privilégios e o faz o tempo todo. Por exemplo, alterar os bytes em um disco requer acesso privilegiado. No entanto, se um usuário puder modificar um arquivo, o sistema decidirá modificar alguns bytes no disco, mesmo que o usuário não tenha permissão para modificar esses bytes. Um usuário não pode modificar a memória do kernel, mas pode fazê-lo ao executar em nome de um usuário. Os sistemas operam decidindo executar operações que seus usuários não podem autorizar diretamente.
David Schwartz
Sim. E, eventualmente, tudo é feito pelo "sistema". Mas não antes de passar por regras estritas de separação de privilégios definidas para esse "espaço do usuário" específico. Nesse cenário, por exemplo, "sistema" não está agindo como regra geral, mas segue as permissões definidas no "diretório pai". A parte principal desse problema na questão do OP.
FractalSpace
0

Primeiro palpite: para excluir um arquivo, você precisa de permissões de gravação na pasta que o contém. Então tente / home / johsua / foo / bar, dê 755 para foo e 644 para bar.

Eugen Rieck
fonte