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

17

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

Eu acho que isso é impossível com permissões de arquivo Unix padrão, mas talvez isso seja possível usando ACLs? O usuário sempre estará se conectando usando SFTP; portanto, se houvesse alguma maneira de controlar isso no SFTP (ao contrário das permissões do SO), tudo bem.

Para ser absolutamente claro, quero o seguinte:

  • echo hello> test # é bem-sucedido, porque o teste não existe e a criação é permitida
  • echo hello >> test # pode ter êxito ou falhar, dependendo se o acréscimo é permitido
  • echo hello2> test # falha, porque o teste já existe e a modificação não é permitida
  • teste de gato # foi bem-sucedido, porque 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, é para tornar um sistema de backup Duplicati resistente ao Ransomware.

paj28
fonte
1
Os arquivos são sempre criados vazios. Quando você faz echo > test, o shell faz um open("test", O_WRONLY|O_CREAT|O_TRUNC)que cria o arquivo e depois invoca echoque grava o conteúdo para modificá-lo. Agora você pode permitir que apenas a primeira abertura (WR) seja bem-sucedida.
Stéphane Chazelas 12/08/2015
@ StéphaneChazelas - editado para esclarecer que anexar é permitido
paj28

Respostas:

16

Você poderia usar bindfscomo:

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

Esse diretório é de propriedade do stephane, com o grupo stephane (sendo o único membro o stephane). Observe também o tque 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 dirnos superamos com propriedade e permissões fixas para arquivos e diretórios. Todos os arquivos parecem pertencentes a root(embora por baixo do diretório real ainda sejam de propriedade de stephane).

Diretórios obtêm drwxrwxr-x root stephanepermissões enquanto outros tipos de arquivos obtêm -rw-r--r-- root stephaneoutros.

$ 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 uma segunda gravação open() nesse arquivo, pois não temos permissão:

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

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

Uma limitação: enquanto você não pode remover ou renomear entradas por dircausa do tbit, os novos diretórios criados nele não terão esse tbit; portanto, você poderá renomear ou excluir entradas lá.

Stéphane Chazelas
fonte
Isto é brilhante! Obrigado por dedicar um tempo para elaborar uma solução tão elegante. Eu já tinha ouvido falar em bindfs antes, mas esta é a primeira vez que o usei.
paj28
4

A chattr +aopção permitirá anexar apenas. Os arquivos podem ser alterados dessa maneira, mas apenas adicionando (ou seja, acrescentando linhas) a eles. Você não pode excluir arquivos existentes, mas criar novos. Isso pode atender às suas necessidades:

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

a partir de man chattr

Um arquivo com o conjunto de atributos `a 'só pode ser aberto no modo de acréscimo para gravação. Somente o superusuário ou um processo que possui o recurso CAP_LINUX_IMMUTABLE pode definir ou limpar esse atributo.

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

Portanto, sua lista seria semelhante a:

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
Fiximan
fonte
Ok, isso parece promissor. Previne corretamente exclusões e, se um arquivo tiver o atributo, evitará substituições. No entanto, quando novos arquivos são criados, eles não obtêm automaticamente o atributo. Existe alguma maneira de fazer isso acontecer automaticamente?
paj28
Se o diretório tiver o atributo, os arquivos se comportarão de acordo, apesar de não ter o atributo definido explicitamente. O problema são arquivos em novas subdiretórios. Por exemplo, dir1 é chattr +aentão eu posso criar um arquivo, não tenho permissão para removê-lo, posso acrescentar. Se eu criar dir1 / dir2 então eu posso fazer o que quiser IN dir2
Fiximan
1
Infelizmente não: dpaste.com/042XQ7X
paj28
Aahh, desculpe - Eu fiz um teste errado antes
Fiximan
@ paj28 seu link está quebrado :-(
mjaggard