Torna o diretório inalterável ou não-editável, exceto pelo root

1

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.

    
por Alexander Mills 06.12.2016 / 09:44

2 respostas

2

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

    
por 06.12.2016 / 09:49
2

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).

    
por 06.12.2016 / 10:41