Consenti al proprietario di creare e leggere file, ma non di modificarli o eliminarli


17

Vorrei concedere a un utente le autorizzazioni per creare e leggere file in una directory specifica, ma non per modificare o eliminare i file. Se l'utente può aggiungere file, va bene, ma preferirei di no. Questo è su Ubuntu Linux.

Penso che questo sia impossibile con le autorizzazioni standard per i file Unix, ma forse questo è possibile usando gli ACL? L'utente si connetterà sempre tramite SFTP, quindi se ci fosse un modo per controllarlo all'interno di SFTP (al contrario delle autorizzazioni del sistema operativo), andrebbe bene.

Per essere assolutamente chiaro, voglio quanto segue:

  • echo hello> test # ha esito positivo, poiché il test non esiste e la creazione è consentita
  • echo hello >> test # può avere esito positivo o negativo, a seconda che l'aggiunta sia consentita
  • echo hello2> test # non riesce, poiché il test esiste già e la modifica non è consentita
  • cat test # ha esito positivo, poiché le letture sono consentite
  • rm test # ha esito negativo, poiché l'eliminazione non è consentita

Se ti stai chiedendo perché voglio farlo, è rendere un sistema di backup Duplicati resistente al ransomware.


1
I file vengono sempre creati vuoti. Quando lo fai echo > test, la shell fa un open("test", O_WRONLY|O_CREAT|O_TRUNC)che crea il file e quindi invoca echoche scrive il contenuto in modo da modificarlo. Ora potresti consentire solo il primo open (WR) per avere successo.
Stéphane Chazelas,

@ StéphaneChazelas - modificato per chiarire che è consentito l'aggiunta
paj28

Risposte:


16

Puoi usare bindfscome:

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

Quella directory è di proprietà di Stephane, con il gruppo Stephane (Stephane è il suo unico membro). Notare anche tche impedisce agli utenti di rinominare o rimuovere voci di cui non sono proprietari.

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

Siamo noi bindfs dirstessi con proprietà fisse e autorizzazioni per file e directory. Tutti i file sembrano di proprietà di root(anche se nella directory reale sono ancora di proprietà di Stephane).

Le directory ottengono i drwxrwxr-x root stephanepermessi mentre altri tipi di file ne ottengono -rw-r--r-- root stephaneuno.

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

Ora la creazione di un file funziona perché la directory è scrivibile:

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

Tuttavia non è possibile eseguire una seconda scrittura open() su quel file in quanto non abbiamo i permessi su di esso:

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

(tieni presente che non è consentito aggiungere lì (in quanto non parte dei tuoi requisiti iniziali)).

Una limitazione: sebbene non sia possibile rimuovere o rinominare le voci a dircausa del tbit, le nuove directory che crei lì non avranno quel tbit, quindi sarai in grado di rinominare o eliminare le voci lì.


È brillante! Grazie per aver dedicato del tempo per elaborare una soluzione così elegante. Avevo sentito parlare di bindfs prima, ma questa è la prima volta che lo uso davvero.
paj28,

4

L' chattr +aopzione consentirà solo l'aggiunta. I file possono essere modificati in questo modo, ma solo aggiungendoli (cioè aggiungendo righe). Non è possibile eliminare i file esistenti, ma crearne di nuovi. Questo potrebbe soddisfare le tue esigenze:

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

a partire dal man chattr

Un file con l'attributo `a 'impostato può essere aperto solo in modalità append per la scrittura. Solo il superutente o un processo che possiede la capacità CAP_LINUX_IMMUTABLE può impostare o cancellare questo attributo.

(nota che si applica anche alle directory)

Quindi il tuo elenco sarebbe simile 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

Ok, sembra promettente. Previene correttamente le eliminazioni e, se un file ha l'attributo, impedisce le sovrascritture. Tuttavia, quando vengono creati nuovi file non ottengono automaticamente l'attributo. C'è un modo per farlo accadere automaticamente?
paj28,

Se la directory ha l'attributo, i file si comporteranno di conseguenza pur non avendo l'attributo impostato esplicitamente. Il problema sono i file in nuovi sottodir. Ad esempio dir1 è chattr +aquindi posso creare un file, non posso rimuoverlo, posso aggiungere. Se creo dir1 / dir2, allora posso fare come mi pare IN dir2
Fiximan

1
Purtroppo no: dpaste.com/042XQ7X
paj28

Aahh, scusa - ho fatto un test sbagliato prima
Fiximan il

@ paj28 il tuo collegamento è interrotto :-(
mjaggard
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.