Permitir que o proprietário crie e leia arquivos, mas não modifique ou exclua

15

Gostaria de conceder a um usuário permissões para criar e ler arquivos em um diretório específico, mas não para modificar ou excluir arquivos. Se o usuário puder acrescentar arquivos ok, prefiro não. Isso é no Ubuntu Linux.

Acho que isso é impossível com as permissões padrão de arquivos do Unix, mas talvez isso seja possível usando ACLs? Se isso ajudar, o usuário sempre estará se conectando usando SFTP, portanto, se houver alguma maneira de controlar isso dentro do SFTP (em oposição às permissões do sistema operacional), tudo bem.

Para ficar absolutamente claro, quero o seguinte:

  • echo ola > o teste # é bem-sucedido, porque o teste não existe e a criação é permitida
  • echo ola > > o número do teste pode ser bem-sucedido ou falhar, dependendo se o acréscimo é permitido
  • echo ola2 > teste # falha porque o teste já existe e a modificação não é permitida
  • teste de gato # é bem-sucedido, porque as leituras são permitidas
  • rm test # falha porque a exclusão não é permitida

Se você está se perguntando por que eu quero fazer isso, é tornar um sistema de backup Duplicati resistente ao Ransomware.

    
por paj28 12.08.2015 / 12:34

2 respostas

13

Você pode usar bindfs como:

$ ls -ld dir
drwxr-xr-t 2 stephane stephane 4096 Aug 12 12:28 dir/

Esse diretório é de propriedade de stephane, com group stephane (stephane sendo seu único membro). Observe também o t que impede os usuários de renomear ou remover entradas que não são de sua propriedade.

$ sudo bindfs -u root -p u=rwD,g=r,dg=rwx,o=rD dir dir

Nós bindfs dir com propriedade e permissões fixas para arquivos e diretórios. Todos os arquivos aparecem pertencentes a root (embora, abaixo, no diretório real, eles ainda sejam de propriedade de stephane).

Os diretórios recebem drwxrwxr-x root stephane de permissões, enquanto outros tipos de arquivos recebem -rw-r--r-- root stephane .

$ ls -ld dir
drwxrwxr-t   2 root     stephane   4096 Aug 12 12:28 dir

Agora, a criação de um arquivo funciona porque o diretório é gravável:

$ echo test > dir/file
$ ls -ld dir/file
-rw-r--r-- 1 root stephane 5 Aug 12 12:29 dir/file

No entanto, não é possível fazer um segundo write open() nesse arquivo, pois não temos permissão nele:

$ echo test > dir/file
zsh: permission denied: dir/file

(observe que o acréscimo não é permitido lá (como não faz parte dos seus requisitos iniciais)).

Uma limitação: embora não seja possível remover ou renomear as entradas em dir devido ao t bit, os novos diretórios que você criar lá não terão esse t , então você poderá para renomear ou excluir entradas lá.

    
por 12.08.2015 / 13:34
4

A opção chattr +a permitirá somente o acréscimo. Os arquivos podem ser alterados dessa maneira, mas apenas adicionando (isto é, acrescentando linhas) a eles. Você não pode excluir arquivos existentes, mas criar novos. Isso pode se adequar às suas necessidades:

sudo chattr -R +a /dir/to/apply/to

de man chattr

A file with the 'a' attribute set can only be open in append mode for writing. Only the superuser or a process possessing the CAP_LINUX_IMMUTABLE capability can set or clear this attribute.

(observe que isso também se aplica aos diretórios)

Assim, sua lista ficaria assim:

echo hello > test # succeeds, because test doesn't exist, and creation is allowed
echo hello2 > test # fails, because test already exists, and overwriting is not allowed
echo hello3 >> test # succeeds, because appending is allowed
cat test # succeeds, because reads are allowed
rm test # fails, because delete is not allowed
    
por 12.08.2015 / 13:05