Autoriser le propriétaire à créer et lire des fichiers, mais pas à modifier ni supprimer

17

Je voudrais donner à un utilisateur des autorisations pour créer et lire des fichiers dans un répertoire particulier, mais pas pour modifier ou supprimer des fichiers. Si l'utilisateur peut ajouter des fichiers, c'est correct, mais je préfère ne pas. C'est sur Ubuntu Linux.

Je pense que cela est impossible avec les autorisations de fichier Unix standard, mais peut-être est-ce possible en utilisant des ACL? L'utilisateur se connectera toujours à l'aide de SFTP, donc s'il y avait un moyen de contrôler cela dans SFTP (par opposition aux autorisations du système d'exploitation), ce serait bien.

Pour être absolument clair, je veux ce qui suit:

  • echo hello> test # réussit, car le test n'existe pas et la création est autorisée
  • echo hello >> test # peut réussir ou échouer, selon que l'ajout est autorisé
  • echo hello2> test # échoue, car le test existe déjà et la modification n'est pas autorisée
  • cat test # réussit, car les lectures sont autorisées
  • rm test # échoue, car la suppression n'est pas autorisée

Si vous vous demandez pourquoi je veux faire cela, c'est pour rendre un système de sauvegarde Duplicati résistant à Ransomware.

paj28
la source
1
Les fichiers sont toujours créés vides. Lorsque vous le faites echo > test, le shell fait un open("test", O_WRONLY|O_CREAT|O_TRUNC)qui crée le fichier, puis invoque echoqui écrit le contenu afin de le modifier. Vous pouvez maintenant autoriser uniquement la première ouverture (WR) à réussir.
Stéphane Chazelas
@ StéphaneChazelas - édité pour préciser que l'ajout est autorisé
paj28

Réponses:

16

Vous pouvez utiliser bindfscomme:

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

Ce répertoire appartient à stephane, le groupe stephane (stephane étant son seul membre). Notez également tque cela empêche les utilisateurs de renommer ou de supprimer des entrées qui ne leur appartiennent pas.

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

Nous- bindfs dirmêmes avec une propriété et des autorisations fixes pour les fichiers et les répertoires. Tous les fichiers semblent appartenir à root(bien qu'en dessous dans le vrai répertoire, ils appartiennent toujours à stephane).

Les répertoires obtiennent des drwxrwxr-x root stephaneautorisations tandis que d'autres types de fichiers en obtiennent -rw-r--r-- root stephane.

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

La création d'un fichier fonctionne maintenant car le répertoire est accessible en écriture:

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

Cependant, il n'est pas possible de faire une deuxième écriture open() sur ce fichier car nous n'avons pas la permission dessus:

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

(notez que l'ajout n'y est pas autorisé (car il ne fait pas partie de vos exigences initiales)).

Une limitation: bien que vous ne puissiez pas supprimer ou renommer des entrées à dircause du tbit, les nouveaux répertoires que vous créez ne comporteront pas ce tbit, vous pourrez donc y renommer ou supprimer des entrées.

Stéphane Chazelas
la source
C'est génial! Merci d'avoir pris le temps de trouver une solution aussi élégante. J'avais entendu parler de bindfs auparavant, mais c'est la première fois que je l'utilise.
paj28
4

L' chattr +aoption autorisera uniquement l'ajout. Les fichiers peuvent être modifiés de cette façon, mais uniquement en y ajoutant (c'est-à-dire en y ajoutant des lignes). Vous ne pouvez pas supprimer des fichiers existants, mais en créer de nouveaux. Cela pourrait répondre à vos besoins:

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

de man chattr

Un fichier avec le jeu d'attributs «a» ne peut être ouvert qu'en mode ajout pour l'écriture. Seul le superutilisateur ou un processus possédant la capacité CAP_LINUX_IMMUTABLE peut définir ou effacer cet attribut.

(notez qu'il s'applique également aux répertoires)

Votre liste ressemblerait donc à:

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
la source
Ok, cela semble prometteur. Il empêche correctement les suppressions et si un fichier a l'attribut, il empêche les remplacements. Cependant, lorsque de nouveaux fichiers sont créés, ils n'obtiennent pas automatiquement l'attribut. Existe-t-il un moyen pour que cela se produise automatiquement?
paj28
Si le répertoire a l'attribut, les fichiers se comporteront en conséquence bien que l'attribut ne soit pas explicitement défini. Le problème vient des fichiers dans de nouveaux sous-répertoires. Par exemple dir1 est chattr +aalors je peux créer un fichier, je ne suis pas autorisé à le supprimer, peut ajouter. Si je crée dir1 / dir2 alors je peux faire comme bon me semble IN
dir2
1
Malheureusement pas: dpaste.com/042XQ7X
paj28
Aahh, désolé - j'ai fait un mauvais test plus tôt
Fiximan
@ paj28 votre lien est rompu :-(
mjaggard