Artisan Numérique

/système/stockage/ Partager proprement des dossiers sous *NIX

Dés que l'on veut partager un dossier sous UNIX, se pose le problème des droits. Car autant il est simple de coller tout le monde dans un groupe, autant cela se complique lorsque les utilisateurs créent leurs propres fichiers, qui par défaut leur appartiennent, et qui du coup ne sont plus modifiables par les autres. Ce petit tutoriel permet de se sortir de cette situation par une technique que je viens découvrir et qui est d'une telle simplicité que cela prouve une fois de plus qu'avec UNIX, on a jamais fini d'apprendre.

Les bases de droit UNIX

Les droits sous unix dans leur version POSIX sont relativement simples. Un utilisateur est défini par un identifiant et un groupe. Le nom de ce groupe est généralement le même que le nom de l'identifiant. Ainsi lorsque l'on crée un nouvel utilisateur par la commande adduser gaston, est automatiquement fabriqué l'identifiant gaston ET son groupe gaston. L'idée sous-jacente de ce groupe un peu spécial, est que seul l'utilisateur y appartient et personne d'autre.

La commande addgroup permet quant à elle d'ajouter de nouveaux groupes qui ne sont à l'origine liés à aucun utilisateur. Après il est possible d'ajouter arbitrairement un utilisateur à un de ces groupe avec la commande usermod. Un utilisateur est donc le seul à appartenir au groupe qui porte le nom de son identifiant, mais peut appartenir à plein d'autres groupes.

Chaque ressource (fichier ou un dossier) est décrit par un groupe, un identifiant et trois niveaux de droits. Chacun de ces trois niveaux correspond à une des conditions suivantes appliquée à l'utilisateur qui tente d'accéder à la ressource :

  1. u ou user - Son identifiant est celui de la ressource.
  2. g ou group - Il appartient au groupe de la ressource.
  3. o ou other - Il n'est ni du bon groupe, ni du bon identifiant.

A chacun de ses niveaux correspond une série d'autorisation : droit de lecture (r), droit d'écriture (w) et droit d'exécution (x). Sachant qu'exécuter un dossier consiste sous Unix à pouvoir rentrer dedans... Ainsi lorsqu'un utilisateur accède à une ressource, UNIX cherche la première condition vérifiée, regarde les droits qui correspondent et les applique. La commande pour changer les droits sur une ressource est chmod. Par exemple chmod gu+rw,o-rw, donne un accès lecture (r) et écriture (w) pour la condition (1) et (2), et aucun droit pour la condition (3).

Lorsqu'un utilisateur fabrique un fichier, ce dernier lui appartient, c'est à dire que le groupe et l'identifiant du fichier sont ceux de l'utilisateur (d'où l'intérêt du groupe privé). Les droits du fichier sont généralement de type rw pour groupe et propriétaire, et r seulement pour les autres. Ces droits par défaut peuvent cependant être changés par la commande umask qui permet d'enlever des droits aux fichiers créés. Par exemple umask go-w fera que tous les prochains fichiers n'auront plus le droit d'écriture que sur o (le propriétaire). L'umask par défaut est donc o-w.

Pour une information plus poussée sur les droits unix, je vous conseille de lire l'excellent article sur wikipedia.

Première approche du partage

Par "partage", il faut entendre ici "système de fichier". Il n'est absolument pas question de NFS, CIFS ou autre appareillage du même acabits. L'idée de départ du besoin est la suivante :

  • Sur une machine j'ai des utilisateurs, disons gaston, josette et robert
  • J'ai des dossiers qui sont chacun partagés par un ensemble différent d'utilisateurs. Le dossier /photos est partagé par josette et gaston, mais /vidéos l'est par gaston et robert.
  • Je veux que lorsqu'un utilisateur crée une ressource (dossier ou fichier) dans un dossier (ou sous-dossier), les autres utilisateurs ayant accès à ce dossier puisse modifier cette ressource.

Simple n'est-ce pas ? On se dit dans une première approche qu'il suffit :

  1. De créer autant de groupes que de dossier.
  2. De changer les droits de chaque dossier (de manière récursive) de sorte à les donner au groupe en écriture.
  3. D'ajouter dans ce groupe chaque utilisateur ayant accès au dossier.

Ce qui nous donne :

création des utilisateurs
adduser gaston
adduser josette
adduser robert

création des deux groups
addgroup acces-photos
addgroup acces-videos

changement des droits sur les dossiers : lecture/écriture/traversée pour groupe et utilisateur, rien pour les Autres.
chown o-rwx,gu+rwX /vidéos /photos -Rc
Le mode d'accès de `/vidéos/nos_vacances.avi' a été modifié à 0660 (rw-rw----).

changement du group d'appartenance
chown :acces-videos /vidéos -Rc
chown :acces-photos /photos -Rc

ajout des utilisateurs aux différents groups
usermod -a -G acces-videos,acces-photos gaston
usermod -a -G acces-videos josette
usermod -a -G acces-photos robert

A partir de là tout va bien ou presque, car les ennuis commencent lorsqu'un utilisateur commence à créer un fichier dans un partage. Comme nous l'avons vu plus haut, ce nouveau fichier héritera de l'identifiant et du group de l'utilisateur qui l'aura crée. La conséquence, à cause de l'umask par défaut, est l'impossibilité d'être modifiée par qui que ce soit, vu que tout le monde est other dans ce cas de figure.

Droit SGID et SUID

Les droits SUID et SGID s'appliquent généralement aux exécutables en donnant à l'utilisateur qui les lancent les mêmes droit que l'utilisateur (SGID) ou le groupe (SGID) auquel l'exécutable appartient. Ainsi sur une commande appartenant à root, un chmod u+s permettrait à n'importe qui de la lancer AVEC les droits root...

Dans le cas qui nous intéresse, SGID a une propriété un peu moins connue. En effet lorsque cette fois c'est un dossier qui dispose du droit SGID, tous les dossiers et tous les fichiers qui seront créé immédiatement en dessous auront le même groupe que lui. Plus intéressant encore, tout dossier créé aura en plus le SGID de positionné.

Ainsi notre problème se règle très simplement en positionnant au départ le SGID sur tous les dossiers (et seulement les dossiers !!) :

rootfind /vidéos -type d -exec chmod g+s {} \;
rootfind /photos -type d -exec chmod g+s {} \;

Ensuite, SGID étant positionné, tous les prochains fichiers créés ici auront le bon groupe et tous les nouveaux dossier le SGID.

Conclusion

L'avantage de cette approche est que la majorité des applications qui vont accéder au système de fichier vont respecter ces droits. Maintenant ce n'est pas l'absolue panacée car le fichier ou le dossier continue d'appartenir à l'utilisateur qui l'a créé, et rien ne l'empêche d'aller modifier les droits, y compris le SGID. Il y a aussi certaines applications comme tar qui vont modifier ces droits et l'on risque alors à nouveau l'incohérence. Mais cette méthode règle une grande partie des problèmes et une petite tâche CRON peut venir finir le travail.