Para a sua primeira pergunta, use o adesivo:
chmod o+t ~/foo
ele não será removível por nenhum usuário, mas o proprietário e o root
Para o comando chown
, não é possível alterar o proprietário sem permissão de superusuário
Eu gostaria de impedir que um diretório fosse deletado, vamos supor que o diretório tenha este caminho
~/foo
existe uma maneira de torná-lo deletável apenas pelo usuário root, sem usar o sudo e sem ser o usuário root ?
por exemplo, isso deve funcionar:
sudo chown -R root:root ~/foo
mas se eu não usar o sudo, o comando acima irá falhar
chown -R root:root ~/foo
# falha
chown: changing ownership of '/home/olegzandr/foo/bar': Operation not permitted
é possível tornar os arquivos undeletable exceto pelo usuário root sem usar o sudo?
(Eu também li sobre o comando chattr
, mas a tag não estava disponível, então não pude adicionar a tag chattr
à pergunta.)
Se eu tentar isso:
Não parece funcionar, porque nenhum erro de permissão é lançado.
Para a sua primeira pergunta, use o adesivo:
chmod o+t ~/foo
ele não será removível por nenhum usuário, mas o proprietário e o root
Para o comando chown
, não é possível alterar o proprietário sem permissão de superusuário
Normalmente, o proprietário de um diretório pode remover e renomear arquivos e subdiretórios nesse diretório. Módulos de segurança do Linux e atributos de arquivo (se habilitados e disponíveis) podem adicionar outras limitações.
Editado para refletir as alterações na pergunta:
Um usuário normal pode criar trivialmente um diretório que exclua todos os usuários, exceto próprios e root. Por exemplo:
mkdir -m 0700 ~/foo
cria um diretório acessível apenas ao usuário proprietário ( drwx------
) e root; Considerando que
mkdir -m 0770 ~/foo
cria um diretório acessível apenas ao usuário proprietário e aos membros do grupo ( drwxrwx---
) e root.
Com as exceções definidas por quaisquer módulos de segurança do Linux que possam estar em uso (digamos, SELinux), o root pode acessar todos os arquivos em um sistema. É por isso que eles são os superusuários, afinal.
Se você executar o comando id -un
, poderá ver seu nome de usuário real atual. O comando id -gn
informa seu grupo real e id -Gn
os nomes dos grupos suplementares dos quais você é membro. Se você for o proprietário do proprietário de um diretório, poderá alterar o grupo de qualquer arquivo ou subdiretório para qualquer grupo do qual seja membro usando o comando chgrp
.
Então, digamos que você seja usuário grand
e você pertença aos grupos marina
e torino
. Se você quiser criar diretórios games-marina
e games-torino
apenas você e todos os usuários que pertencem a esses dois grupos podem acessar (mas outros podem apenas ler, não modificar ou excluir nada), faça
mkdir games-marina
chgrp marina games-marina
chmod u=rwx,g=rx,o= games-marina
mkdir games-torino
chgrp torino games-torino
chmod u=rwx,g=rx,o= games-torino
Em muitos sistemas, os usuários também criam um grupo que corresponde ao seu nome de usuário. Isso é útil em muitos aspectos; por exemplo, geralmente é o grupo padrão para qualquer arquivo que você possui, portanto, é explícito que somente você controla o conteúdo deles.
Um usuário normalmente não pode abandonar arquivos ou diretórios para outros controlarem. Esse tipo de mudança de propriedade realmente requer privilégios de superusuário. (Por exemplo, para alterar o proprietário de um arquivo ou diretório usando chown
, você precisa ser root ou ter o recurso CAP_CHOWN no Linux.)
Existem várias razões pelas quais deixar esse abandono acontecer seria uma má ideia; tecnicamente, poderia ser implementado, mas eu pessoalmente ainda não vi qualquer bom caso de uso. Eu tenho certeza que o OP está tentando fazer algo ... digamos, não útil, aqui.
(Eu escrevi scripts que permitem a propriedade de arquivos em certas árvores de diretórios entre membros pertencentes a um grupo específico - sim, administradores da web -, mas isso é muito fácil de configurar com segurança com sudo
e algumas partes / scripts auxiliares de traço.)
Se quiséssemos criar o diretório /home/olegzandr/foo
que não pode ser deletado pelo proprietário do diretório /home/olegzandr
, precisaríamos criar foo
um ponto de montagem e vincular-montar um diretório (proprietário da raiz) no topo disso. Por exemplo, poderíamos criar o diretório /root/foo
(pertencente ao usuário root, obviamente) e vinculá-lo ao /home/olegzandr/foo
usando, por exemplo.
sudo mount --bind /root/foo /home/olegzandr/foo
Com uma montagem de ligação, o diretório /home/olegzandr/foo
ainda deve existir (como é usado como ponto de montagem) e o proprietário do /home/olegzandr
pode manipular esse diretório, mas não pode removê-lo enquanto a montagem de ligação existir . Como /home/olegzandr/foo
é um novo ponto de montagem de propriedade de root, o proprietário de /home/olegzandr
não pode manipulá-lo.
Para proteger o ponto de montagem de ser removido pelo proprietário de /home/olegzandr
enquanto a montagem de ligação não estiver em vigor, deve-se definir o ponto de montagem /home/olegzandr/foo
imutável. Para criar o ponto de montagem inicial (sem ter a montagem de ligação montada ainda), eu usaria
sudo mkdir /home/olegzandr/foo
sudo chmod 0700 /home/olegzandr/foo
sudo chattr +i /home/olegzandr/foo
Observe que isso também significa que ninguém pode copiar dados acidentalmente ou criar subdiretórios em /home/olegzandr/foo
, a menos que a montagem de ligação esteja em vigor. (Quando a montagem da ligação estiver em vigor, o proprietário, o grupo e as permissões de /root/foo
também serão aplicados a /home/olegzandr/foo
.)
No ext4 e na maioria dos outros sistemas de arquivos, geralmente podemos usar um diretório intermediário imutável para criar o diretório /home/olegzandr/foo/bar
, com /home/olegzandr/foo
sendo imutável. Dessa forma, o proprietário de /home/olegzandr
não pode modificar ou excluir /home/olegzandr/foo
nem excluir /home/olegzandr/foo/bar
. Este último é, além disso, um subdiretório em um diretório de propriedade da raiz e, portanto, não está mais sob a dependência do proprietário de /home/olegzandr
. Para experimentar isso:
sudo mkdir /home/olegzandr/foo
sudo mkdir /home/olegzandr/foo/bar
sudo chmod 0555 /home/olegzandr/foo
sudo chattr +i /home/olegzandr/foo
Você pode definir o proprietário, o grupo e o modo de /home/olegzandr/foo/bar
como desejar. Ele não pode ser excluído (mesmo por root) contanto que /home/olegzandr/foo
seja imutável.
Para alterar o atributo de arquivo imutável, é necessário ser root ou ter o recurso CAP_LINUX_IMMUTABLE
(que normalmente é somente root).
Tags sudo root privileges not-root-user xattr