Comment donner des autorisations pour lire, écrire, mais pas supprimer le fichier

12

Je veux donner aux utilisateurs la possibilité de créer des fichiers d'écriture et de lecture dans un autre répertoire utilisateur, mais ne pas avoir la possibilité de supprimer le fichier après sa création (le sticky bit ne fonctionnera pas ici ...) par exemple:

J'ai un utilisateur manager avec un répertoire repository
J'ai un utilisateur worker1qui doit écrire des fichiers /manager/repositorymais
je ne peux pas supprimer les fichiers J'ai un utilisateur worker2qui doit écrire des fichiers /manager/repository mais
je ne peux pas supprimer les fichiers J'ai un utilisateur worker3qui doit écrire des fichiers /manager/repository mais ne peut pas supprimer les fichiers

mais worker 1-2-3ne peut pas supprimer les fichiers une fois créés uniquement manageret rootpeut supprimer les fichiers worker 1-2-3créés.

J'ai essayé quelques trucs chownet chmodastuces pour appliquer le bit collant sans succès.

user63898
la source
1
Les worker*utilisateurs écrivent-ils dans le répertoire d'une certaine manière? Vous avez mentionné dans un commentaire que les fichiers journaux vont ici, donc cela signifie-t-il qu'un certain exécutable est lancé pour créer des fichiers ici? Si c'est le cas, vous pouvez donner au workergroupe l' sudoautorisation d'exécuter l'exécutable en tant que manager. Ensuite, l'exécutable créerait des journaux en tant managerqu'utilisateur pouvant être lus par les travailleurs.
Centimane
Si l'utilisateur peut modifier le fichier, il peut également effacer son contenu, le "supprimant" ainsi. Il semble que vous ayez besoin d'une sorte d'interface de "soumission", pas de systèmes de fichiers. Les courriels seraient les plus simples.
ybungalobill

Réponses:

8

Contrairement à Windows, il n'y a pas d'autorisation de suppression distincte sous Unix / Linux. Le droit de supprimer (ou de créer ou de renommer) un fichier est lié au répertoire contenant. Supprimez l'autorisation d'écriture pour les travailleurs sur /manager/repository/afin de refuser aux travailleurs de créer, supprimer et renommer des fichiers.

Notez qu'il n'est pas possible d'autoriser la création de fichiers mais de refuser leur suppression.

contre-mode
la source
comment supprimer l'autorisation d'écriture car le fichier sera écrit tout le temps comme fichier journal
user63898
. Alors que celui utilisé pour être vrai, de nombreux systèmes modernes prennent en charge ACLs étendues (NFSv4 comme pris en charge par FreeBSD, Solaris ou Linux (patch Richacl) qui donnent des fonctionnalités similaires que Windows NT ACLs votre stock distribution Linux est susceptible de ne pas avoir cependant.
Stéphane Chazelas
@ user63898 vous supprimez les autorisations d'écriture du répertoire dans lequel se trouve le fichier, et non du fichier lui-même.
GnP
6

Tout d'abord, assurez-vous que ACL est activé dans votre système, puis exécutez cette commande

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

Comment ça fonctionne

  • Cette commande donnera des autorisations de lecture, d'écriture et d'exécution au propriétaire sur le répertoire /manager/repository. Il révoquera toutes les autorisations pour worker1, worker2et worker3.

  • Cela donnera aux autres utilisateurs un accès en lecture et en écriture mais refusera l'accès à la suppression.


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
la source
merci, mais le problème est que les utilisateurs sont créés tout le temps. et certains sont supprimés par l'administrateur. cela signifie donc que je dois à chaque fois mettre à jour le répertoire avec le setfacl? existe-t-il une solution plus générique?
user63898
oui lorsque j'essaie de créer un fichier à partir de worker1, touchez /manager/repository/x.txt im: touch: ne peut pas toucher `/manager/repository/x.txt ': Autorisation refusée
user63898
obtention toujours d'autorisation refusée lorsque je fais ls -ld référentiel im obtenir: drwxrwxr-t 2 utilisateurs du gestionnaire 4096 7 septembre 11:30 référentiel /
user63898
lors de la définition de setfacl -d -R -m user :: rwx, user: worker1: --- repository /, puis en essayant de créer un fichier à partir de worker1, touchez /manager/repository/x.txt en obtenant: touch: impossible de toucher `/ manager /repository/x.txt ': Autorisation refusée
user63898
5
cela ne permettrait-il pas encore à quelqu'un d'écrire un fichier vide ici? Comme echo " " > $fileclaquer le contenu du fichier avec "", qui est techniquement une écriture, mais supprime efficacement le contenu. Il semble qu'un repo réel comme svn soit le meilleur pari ici.
Centimane
3

Pour ce faire, avec des autorisations, vous auriez besoin d'un système prenant en charge les ACL similaires aux ACL NFSv4. Par exemple, sur FreeBSD, si le système de fichiers est monté avec l' nfsv4aclsindicateur, vous pouvez faire:

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

Refuser explicitement l' delete_childautorisation aux membres du worker-groupgroupe.

Cependant, notez que puisque les travailleurs seraient propriétaires des fichiers qu'ils créent, ils seraient toujours en mesure de modifier les listes de contrôle d'accès sur eux, et en s'accordant l' deleteautorisation, cela prévaudrait sur l' delete_childautorisation du répertoire parent et je ne suis pas sûr qu'il y a un moyen de contourner cela (au moins sur les systèmes de fichiers UFS sur FreeBSD). Par exemple, ils pourraient faire:

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

Pour prendre des autorisations d'écriture à partir du /manager/repositorydossier. Ainsi, tous les utilisateurs qui ne sont pas root pourront écrire ou supprimer des fichiers à l'intérieur /manager/repository, mais ne supprimer aucun fichier de ce répertoire.

chmod 755 /manager/repository
Josef Klimuk
la source
0

nous pouvons modifier les fichiers et les dossiers mais ne pouvons pas les supprimer.

Pour supprimer les attributs, exécutez les commandes suivantes:

Pour les fichiers:

$ sudo chattr -R -a file.txt

Pour les répertoires:

$ sudo chattr -R -a dir1/
Ankitsrivasta
la source
(1) Selon la documentation, l' aattribut signifie ajout uniquement. Les utilisateurs peuvent-ils modifier ces fichiers? (2) Quel est l'effet de la définition de l' aattribut sur un répertoire?
Scott