Comment définir les autorisations par défaut pour les fichiers déplacés ou copiés dans un répertoire?

9

Ma question est similaire à Comment définir les autorisations de fichiers par défaut sur TOUS les fichiers nouvellement créés sous Linux - mais diffère de manière importante:

Je veux que tous les fichiers créés dans (ou copiés ou déplacés vers) un certain répertoire héritent d'un ensemble d'autorisations par défaut différent de celui par défaut du système.

Justification: Le répertoire en question est la "trémie d'admission" pour une application. Les utilisateurs d'un groupe placent des fichiers dans le répertoire et l'application (exécutée sous un autre ID utilisateur du même groupe) les prend et les traite. Le problème est que le propriétaire de chaque fichier placé dans le répertoire est l'utilisateur qui l'a placé là, et les autorisations sont par défaut "rw-r - r--"; Je veux changer cela en "rw-rw ----". L'application qui fait l'admission ne peut pas le faire explicitement, car l'ID utilisateur sous lequel l'application s'exécute ne possède pas le fichier en question et les autorisations par défaut ne permettent pas à l'application de chmoder sur le fichier! De toute évidence, l'utilisateur pourrait faire un chmod après y avoir placé le fichier - mais je veux garder la "goutte" par l'utilisateur aussi simple que possible. (Ces gens ne sont pas alphabétisés linux,

umask semble trop puissant: je ne veux pas définir d'autorisations par défaut pour chaque fichier créé n'importe où par ces utilisateurs - seulement ceux créés dans (ou placés dans) ce répertoire.

Veuillez conseiller ... merci!

Rob
la source

Réponses:

5

Vous pouvez utiliser une ACL (liste de contrôle d'accès) pour définir les autorisations par défaut pour les fichiers d'un répertoire.

De man 5 acl:

Si une ACL par défaut est associée à un répertoire, le paramètre mode des fonctions créant des objets fichier et l'ACL par défaut du répertoire sont utilisés pour déterminer l'ACL du nouvel objet:

  1. Le nouvel objet hérite de l'ACL par défaut du répertoire contenant comme ACL d'accès.

  2. Les entrées ACL d'accès correspondant aux bits d'autorisation de fichier sont modifiées de sorte qu'elles ne contiennent aucune autorisation qui ne figure pas dans les autorisations spécifiées par le paramètre mode.

Pour le configurer (changer d'appareil, de répertoires, etc., en conséquence):

Modifiez votre /etc/fstabfichier et ajoutez l' acloption de montage.

/dev/mapper/star-home /home ext3  defaults,acl 0 2

Remontez ( page de manuel Sambamount.cifs ) votre système de fichiers en redémarrant ou utilisez:

mount -o remount,acl /home

Assurez-vous que vous disposez des utilitaires setfaclet getfacl.

Définissez l'ACL par défaut sur le répertoire (vous devrez peut-être également définir l'ACL sur les fichiers existants):

$ setfacl -m d:user:george:rwx,d:group:sales-g:rwx,d:group:marketing-g:rwx projections

Voir le tutoriel lié pour plus d'informations.

Source: Tutoriel Partie 1 et Partie 2

Référence: Listes de contrôle d'accès POSIX sous Linux

En pause jusqu'à nouvel ordre.
la source
Je ne pense pas que vous devriez ajouter aclune option dans la mountcommande lorsque vous l' ajoutez /etc/fstab. Cela va être redondant et lorsque vous exécutez la mountcommande dans votre réponse, vous obtiendrez une sortie comme celle-ci: /dev/vda1 on / type ext4 (rw,errors=remount-ro,acl,acl)(voir acl,aclà la fin). Veuillez le corriger si je ne me trompe pas.
its_me
1

Je peux proposer une solution de contournement: créez un répertoire "drop" séparé, exécutez-y un minijob distinct qui corrige les autorisations, puis déplace les fichiers dans le répertoire de données de l'application. Vous pouvez utiliser incron pour cela afin qu'il n'y ait pratiquement aucun retard notable.

Peter Eisentraut
la source
1

Je peux penser à quatre méthodes possibles pour ce faire:

  • umask, que vous ne souhaitez pas utiliser
  • encapsuleur de programme, qui définit le umask de cette application, pas l'utilisateur
  • cron, comme décrit @Peter Eisentraut; find $HOME/intake -type f -exec chmod 660 {} \;, différents systèmes ont des améliorations de performances à ce sujet (comme l' -exec+option)
  • les paramètres basés sur les répertoires, qui nécessitent un peu de programmation shell pour le faire, mais fondamentalement, le shell, lors de la définition de l'invite ou de l'appel de cd, changerait l'umask s'il y a un fichier dot dans ce répertoire (ou éventuellement un répertoire ancêtre); pour bash, PROMPT_COMMAND='test -s $PWD/.umask && umask $(cat $PWD/.umask)'";$PROMPT_COMMAND"serait le plus simple.
Arcege
la source