Como conceder permissões para ler gravar, mas não excluir o arquivo

12

Desejo dar aos usuários a capacidade de criar arquivos de gravação e leitura em outro diretório de usuários, mas não ter a opção de excluir o arquivo após a criação (o bit não funciona aqui ...), por exemplo:

Eu tenho usuário manager com diretório repository
Eu tenho usuário worker1que precisa gravar arquivos, /manager/repositorymas não pode excluir os arquivos
Eu tenho usuário worker2que precisa gravar arquivos, /manager/repository mas não consigo excluir os arquivos
Eu tenho usuário worker3que precisa gravar arquivos, /manager/repository mas não consigo excluir os arquivos

mas worker 1-2-3não pode excluir os arquivos somente depois de criados managere rootpode excluir os arquivos worker 1-2-3criados.

Eu tentei alguns chowne chmodtruques com a aplicação do bit sticky sem sucesso.

user63898
fonte
1
Os worker*usuários gravam no diretório de uma certa maneira? Você mencionou em um comentário que os arquivos de log estão aqui, isso significa que um determinado executável é iniciado para criar arquivos aqui? Nesse caso, você pode dar ao workergrupo sudopermissão para executar o executável como manager. Em seguida, o executável criaria logs como o managerusuário que poderia ser legível pelos trabalhadores.
Centimane
Se o usuário puder modificar o arquivo, também poderá apagar seu conteúdo, "efetivamente" excluindo-o. Parece que você precisa de algum tipo de interface de "envio", não de sistemas de arquivos. Os e-mails seriam os mais simples.
ybungalobill

Respostas:

8

Ao contrário do Windows, não há permissão de exclusão distinta no Unix / Linux. O direito de excluir (ou criar ou renomear) um arquivo está vinculado ao diretório que o contém. Remova a permissão de gravação dos trabalhadores /manager/repository/para negar que os trabalhadores criem, excluam e renomeiem arquivos.

Observe que não é possível permitir a criação de arquivos, mas negar sua exclusão.

contra-modo
fonte
como pode remover a permissão de gravação como o arquivo será escrito o tempo todo que é arquivo de log
user63898
. Enquanto que costumava ser verdade, muitos sistemas modernos suportam ACLs estendidas (NFSv4 ACLs como suportados pelo FreeBSD, Solaris ou Linux (remendo Richacl) que dão capacidades semelhantes como o Windows NT ACLs sua distribuição Linux estoque é provável não tê-lo embora.
Stéphane Chazelas
@ user63898 você remove as permissões de gravação do diretório em que o arquivo está, não do próprio arquivo.
GnP 7/09/16
6

Antes de tudo, verifique se a ACL está ativada no seu sistema e execute este comando

setfacl -d -R -m user::rwx,user:worker1:---,user:worker2:---,user:worker3:--- \
/manager/repository

Como funciona

  • Este comando dará permissões de leitura, gravação e execução para o proprietário no diretório /manager/repository. Ele revogará todas as permissões para worker1, worker2e worker3.

  • Isso dará a outros usuários acesso de leitura e gravação, mas negará o acesso de exclusão.


De man setfacl:

-d, --default
       All  operations  apply to the Default ACL.

-R, --recursive
       Apply operations to all files and directories recursively.

-m, --modify
       Options to modify the ACL of a file or directory.
Rahul
fonte
obrigado, mas o problema é que os usuários são criados o tempo todo. e alguns são excluídos pelo administrador. então isso significa que eu preciso atualizar sempre o diretório com o setfacl? existe alguma solução mais genérica?
User63898
Sim, quando tento criar o arquivo worker1, toque em /manager/repository/x.txt. Estou obtendo: touch: não é possível tocar em `/manager/repository/x.txt ': permissão negada
user63898
Ainda estou obtendo Permissão negada quando eu faço o repositório ls -ld, estou obtendo: drwxrwxr-t 2 gerenciador de usuários 4096 7 de setembro 11:30 repositório /
user63898 7/16
ao fazer o setfacl -d -R -m usuário :: rwx, usuário: worker1: --- repositório / e, em seguida, tentar criar um arquivo a partir do worker1, toque em /manager/repository/x.txt. /repository/x.txt ': permissão negada
user63898
5
isso ainda não permitiria que alguém escrevesse um arquivo vazio aqui? O Like echo " " > $fileclobberá o conteúdo do arquivo com "", que é tecnicamente uma gravação, mas efetivamente exclui o conteúdo. Parece que um repo real como svn seria a melhor aposta aqui.
Centimane
3

Para fazer isso com permissões, você precisaria de um sistema com suporte para ACLs semelhantes às ACLs do NFSv4. Por exemplo, no FreeBSD, se o sistema de arquivos estiver montado com a nfsv4aclsbandeira, você poderá:

mkdir testdir
chown manager:worker-group testdir
chmod 775 testdir
setfacl -m group@:D::deny testdir

Negar explicitamente a delete_childpermissão aos membros do worker-groupgrupo.

No entanto, observe que, como os trabalhadores seriam proprietários dos arquivos criados, eles ainda poderiam modificar as ACLs e, concedendo a si mesmos a deletepermissão, teriam precedência sobre a delete_childpermissão do diretório pai e eu não sou. com certeza existe uma maneira de contornar isso (pelo menos nos sistemas de arquivos UFS no FreeBSD). Por exemplo, eles poderiam fazer:

$ touch file
$ rm -f file
rm: file: Operation not permitted
$ setfacl -m owner@:d::allow file
$ rm -f file
$
Stéphane Chazelas
fonte
0

Para obter permissões de gravação da /manager/repositorypasta. Portanto, todos os usuários que não são root poderão gravar ou excluir os arquivos internos /manager/repository, mas não excluir nenhum arquivo desse diretório.

chmod 755 /manager/repository
Josef Klimuk
fonte
0

podemos modificar os arquivos e pastas, mas não podemos excluir.

Para remover os atributos, execute os seguintes comandos:

Para arquivos:

$ sudo chattr -R -a file.txt

Para diretórios:

$ sudo chattr -R -a dir1/
Ankitsrivasta
fonte
(1) De acordo com a documentação, o aatributo significa somente acréscimo. Os usuários podem editar esses arquivos? (2) Qual é o efeito de definir o aatributo em um diretório?
1576 Scott