Partager proprement des dossiers sous UNIX
Le 19 novembre 2008 à 01:57.

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
root# 

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 !!) :

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

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.

Commentaires

gronono, le 19 November, 2008 - 03:58

Bonjour Ulhume,

J'ai exactement la problématique. Je n'avais pas encore cherché de solutions. J'ai un accès root donc je passais en root pour modifier les permissions (il faut gaffe aux erreurs).

Donc un grand merci à toi.

figaro , le 19 November, 2008 - 05:17

C'est ce que l'on appelle enfoncer une porte ouverte en découvrant la lune.

Ulhume, le 19 November, 2008 - 08:00

@figaro et cela veut dire quoi exactement ?

Dup , le 19 November, 2008 - 08:09

En quoi tar est-il un problème ? L'option "p" (preserve rights) fonctionne t-elle mal avec le SGID ?

Ulhume, le 19 November, 2008 - 09:22

@Dup t'en connais beaucoup toi des gens qui connaissent l'option -p Wink Dans 99% des cas, un utilisateur va faire un tar xvf et ainsi coller les droits et appartenances contenus dans le tar.

Kagou , le 19 November, 2008 - 09:29

Je te mets sur un défi puisque tu es en plein dedans... Wink Je m'y suis cassé les dents.

Comment utiliser un disque dur externe, formaté en ext3, qui peut servir le plus simplement du monde, comme d'un disque externe de stockage, librement (création/lecture/effacement) accessible par tout le monde, comme s'il était en ntfs/fat32. N'importe qui peut le brancher, lire tous les fichiers, les effacer, les modifier en ajouter d'autres.

ppmt , le 19 November, 2008 - 09:51

Salut,
tu as ecris:

# 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

ce ne serait pas plutot chmod au lieu de chown Wink

Sinon merci. C'est exactement ce que je cherchais. Par contre quand un nouveau fichier est cree il appartient bien au groupe "commun"
mais les droits du groupe sont juste read. J'imagine que c'est le umask qui fait ca
Mais tout les utilisateurs de ce groupe peuvent bien efface le fichier....donc ca me va!

macsim , le 19 November, 2008 - 09:52

Ulhume, tu as oublié les ACL sur le coup Wink et je pense que figaro voulais dire "Moi figaro commentateur anonyme je trouve que ce que tu as posté est déjà connu et que tout le monde le sais alors moi figaro qui n'ai surment pas de blog je vais te dire a toi ce que tu dois penser et comment tu dois écrire tes billets parsque je connais déjà la lune" Wink

Kagou, tu mets 777 sur ton disque nobody:nogroup et tu change le umask du disque pour que tous ce qui est créé sois en 777. t'a essayé ?

Ulhume, le 19 November, 2008 - 10:12

@macsim

Délibérément ignoré pour être exact Wink Ils sont très utiles pour un véritable admin mais je n'ai, dans mon utilisation assez basique d'UNIX, jamais réussi à leur trouver un usage. J'ai même tendance à les virer du kernel lorsque je compile un noyau. Maintenant je changerais sûrement de violon le jour où le vieux fonctionnement POSIX ne me suffira plus, j'ai même failli le faire avant de tomber sur GUID Smiling

Quant à l'ami figaro, tu dois avoir raison, c'est toujours rassurant de sentir que l'on en connait plus que le voisin, sauf que généralement cette assertion est récurrsive, et là cela peut devenir angoissant Wink

macsim , le 19 November, 2008 - 10:27

@Ulhume, oui c'est vrai que les ACL peuvent sembler assez 'inutile' pour une utilisation desktop. Mais les guid sont assez ... limite niveau sécurité car donner a tous les membres d'un groupe la permission d'exécuter quelque chose ça sonne mal dans mes oreilles d'admin Wink avec les ACL ont donne juste le droit a lucette (peut-importe sont groupe) d'exécuter un programme, ou alors on donne les droits d'éxécuter un programme a tous le groupe secretaire sauf lucette Wink enfin bref c'est plus fin je trouve et ça montre au 'admin windows' que l'on peut aussi faire des droits étendus même si généralement droits posix sont suffisant Wink

Ulhume, le 19 November, 2008 - 10:33

@macsim J'aime bien le dernier argument Wink Je suis globalement d'accord avec toi et je ne disais pas que les ACL étaient innutiles pour les Desktop, mais innutiles pour mon usage, à savoir une dizaines d'utilisateurs à tout casser Smiling

Akrew, le 21 November, 2008 - 01:31

tagazok a toi Ulhume !

Vous avez un petit retour d'experience à partager macsim et toi sur la gestion un peu plus complexe d'ACL a partir d'un annuaire de type Ldap par exemple ? Et qu'en est-il des utilisateurs se connectant via NFS ou CIFS ? les setUID et autres setGID s'appliquent-ils aussi aux utilisateurs qui accèdent à l'espace collaboratif via le reseau et a partir de compte ldap plutôt qu'à partir de compte existant localement sur le serveur de fichiers?

Ulhume, le 19 November, 2008 - 10:50

@ppmt merci, c'est corrigé Smiling Au fait j'ai désactivé ta notification automatique, mon serveur se prenant des demandes de ton système anti-spam...

ppmt , le 19 November, 2008 - 15:07

@Ulhume: oui désolé c'est un des désavantages de boxtrapper. Ton serveru est maintenant dans ma whitelist et ton blog dans mes bookmarks!

Ulhume, le 19 November, 2008 - 11:32

@kagou Tu peux aussi utiliser l'option grpid lors du montage de ta partition ext3 (voir man mount)

archi02 , le 19 November, 2008 - 15:53

+1 pour Kagou ! Je n'ai moi non plus jamais réussi à rendre une partition ext3 partagée (interne dans mon cas) « comme d'un disque externe de stockage, librement (création/lecture/effacement) accessible par tout le monde, comme s'il était en ntfs/fat32. »

Sur ce post, je tente de régler la question, sans résultat satisfaisant. Le lire est instructif pour comprendre où se pose exactement le problème. Petit bonus si vous vous y penchez, un certain "figaro" (le même ?) trouve aussi que cette question revient à enfoncer des portes ouvertes... Wink

Est-ce exactement le propos vu que dans mon cas j'accède à la partition partagée en NFS ? Je sais pas mais il me semble que oui... en tout cas merci pour cette synthèse très bien faite.

Ulhume, le 19 November, 2008 - 16:06

figaro ci, figaro là Wink

Pour NFS ton intro correspond à peu prés au sujet de ce bllet il me semble. J'utilise exactement ce que tu expliques en intro chez moi, j'ai sur un serveur, un dossier accéder par plusieurs utilisateurs qui en prime n'ont pas le même groupe primaire. Et à chaque création de fichier, le groupe du fichier est celui que j'ai fixé. Idem pour les dossiers.

En revanche pour les droits, tu ne peux rien faire via NFS si l'utilisateur se colle un umask go-rwx. Maintenant, en tout cas sous mandriva, l'umask par défaut est o-w, donc vraiment pas un problème. Le nouveau fichier est systématiquement XXX:mon_groupe_fixe et rw-rw-r--

Pour les partitions EXT3, vous avez essayé le coup du grpid, je viens de faire le test et ça fonctionne plutôt bien.

Dab, le 19 November, 2008 - 16:30

chmod o-rwx,gu+rwX /videos /photos -Rc
Que je n'aime pas la syntaxe 'ugo' du chmod, encore qu'elle soit bien pratique en mode 'suppression/ajout' d'un droit unique mais un simple chmod 660 est à mon humble avis plus parlant en représentant ce qu'un 'ls -l' nous retourne.
Sinon pour le coup des divers uid/gid sur le NFS il existe le daemon ugidd qui permet de les "tranduire" entre serveur et clients. J'avais mis ça en place à une époque et ne suis même pas sur que ce soit encore d'actualité.

Ulhume, le 19 November, 2008 - 16:37

@Dab très sincèrement si tu trouves le chiffre de la bête plus parlant, tu as passé trop de temps en salle machine Wink

Rares sont les gens qui parlent l'octal de nos jours mêe si en pratique je suis d'accord avec toi. Mais il aurait fallut que j'ajoute un chapitre complet pour expliquer la conversion.

Dab, le 19 November, 2008 - 16:58

Rhooo ... r=4, w=2, x=1, Sans la calculette et avec les bras attachés dans le dos : la somme est 7 Wink

Ulhume, le 19 November, 2008 - 23:09

@Dab Avoue tout de même que pour débuter, un gu+rw,o-w c'est un peu plus lisible que (4+2)(4+2)(4)=664. En plus comment tu colles le sticky ou le sgid avec cette notation ?

macsim , le 19 November, 2008 - 23:35

Moi je sais Wink gu+rw,g+s,o-w

Ulhume, le 19 November, 2008 - 23:41

@macsim pas tricher !! octale on a dit;-)

macsim , le 20 November, 2008 - 00:06

@Ulhume oh j'avais pas compris l'énoncé chef Wink

chmod 2550 ?

macsim , le 20 November, 2008 - 00:06

ou 2664 si on reste sur votre exemple

archi02 , le 20 November, 2008 - 00:19

'ugo' plus lisible ? non non non ! Wink

Logique oui, peut-être... Sauf que quand tu causes en octal, tu n'imposes aucune opération au lecteur, tu énonces juste un fait. La différence est qu'en mode 'ugo', on te donne les informations pour comprendre, contrairement au mode octal où on te donne directement la solution...

Ulhume, le 20 November, 2008 - 00:19

Ahhhhh bé là j'ai appris un truc, comment ça se décompose ce machin ?

macsim , le 20 November, 2008 - 00:27

Sa se décompose comme ça
setUID u+s = 4000
setGID g+s = 2000
Et le sticky bit o+t = 1000

Content que tu es appris quelque chose Wink

Ulhume, le 20 November, 2008 - 00:34

@archi c'est très précisément ce que j'appelle lisibilité Smiling Ce doit être une déformation de chef de projet mais entre ça :

if(xyz-=++pqr<10)tagazok();

et ça :

pqr++;
xyz-=pqr;
if ( xyz < 10 ) {
  tagazok();
}

Je serait plus tranquille avec le seconde pour le mettre entre toutes les mains, même si je râlerais encore sur l'absence de commentaire Smiling

Ulhume, le 20 November, 2008 - 00:42

@macsim c'est noté, à l'occaz je mettrais à jour le billet avec un tableau de conversion.

Ulhume, le 21 November, 2008 - 01:52

@Akrew tagazok à toi aussi, tu devrais être couché à cette heure çi Wink

LDAP, autant que je le sache, permet de remonter les utilisateurs et leurs groupes, comme nis & co. Je n'ai pas entendu parler de stockage de droit particulier via ldap genre "a le droit d'accéder à la ressource bidulo en écriture".

Pour ce qui est des sgid/suid, ils fonctionnent sur le FS sous-jacent. Lorsque ce FS est accéder via Samba par exemple, il fonctionne de la même manière que lorsqu'il est accédé en local sauf configuration contradictoire dans Samba. Pour NFS c'est strictement le même comportement qu'en local.

En somme le compte LDAP, de ce que j'en connais, n'intervient pas directement dans le processus et ne fait que fournir uid et gid's de l'utilisateur. Et Samba et NFS fonctionne bien avec SGID/SUID. Et pour les tests que j'ai pu faire sur les ACL EXT3, c'est là aussi la même chose, en tout cas en NFS car il me semble que Samba a son propre comportement à ce sujet mais là c'est un truc de windowsien, je connais pas bien.

En espérant avoir répondu à ta question sans trop de conneries Smiling

Akrew, le 21 November, 2008 - 03:18

@Ulhume pure perte de temps que le sommeil quand on plonge dans la bidouille informatique Smiling

Avec ce Post, tu me confortes dans mes "a priori".Je n'ai en effet pas connaissance non plus d'une quelconque definition de permissions d'acces a certaines ressources via un ldap. mais seulement de la notion d'appartenance d'un utilisateur a tel ou tel groupe.
C'est juste que j'ai peut-être mal formulé ma question qui n'est pas si simple à expliquer qu'il n'y parait.Wink Tongue

Pour être plus précis, je m'interroge car si on peut definir l'uid et les gid's d'un utilisateur via un ldap, il est aussi possible d'integrer le ldap au system d'authentification Unix via pam.
A partir de là je me dis (sans doute legitimement ?) : Eh ben si on peut faire ça pour authentifier un utilisateur et récupérer les groupes auxquel il appartient (via un openldap par exemple), alors il doit-être possible de vérifier les permissions via des ACL (même si les groupes autorisés n'existent pas localement sur le système mais seulement dans l'annuaire ldap) ?

Si quelqu'un a déja tenté ce type de bidouille, alors je pense qu'un retour d'experience sur la question (problèmes rencontrés, performances, scalabilité ...etc...) serait bien accueilli Wink
Il est egalement possible avec les ACL de permettre aux sous-dossier et fichier créés d'hériter des ACL du dossier parent avec l'attribut "d:" de la commande

setfacl -m d:u:akrew:rwX /mnt/removable/music
Ulhume, le 21 November, 2008 - 02:59

A priori cela ne pose aucun problème dans la mesure où un acl (comme une appartenance classique d'ailleurs) peut porter sur un UID/GID non présent en local. LDAP peut donc remonter pour un utilisateur des GID qui matcherons avec ceux sur le système de fichier (ACL ou autre).

Si c'est bien ce que tu veux dire, les performances sont les mêmes qu'en local car tu auras évidement pris soin de mettre un cache local à ton serveur LDAP pour éviter de faire une requête à chaque vérification. C'est aussi valable hors ACL d'ailleurs. Idem pour la dimensionnabilité, le charge étant globalement plus sur le moteur d'ACL que sur le LDAP lu-même.

Maintenant, si Buldorak passe par ce thread, c'est lui le grand manitou du LDAP ici, pas moi Smiling

PS: L'état dans lequel tu seras demain matin n'est de toute façon plus mon problème ;pppp

Akrew, le 21 November, 2008 - 03:21

@Ulhume j'ai bien fait de poser la question ! tu viens de m'apprendre l'existence du cache local pour le serveur LDAP Wink Tongue et je vais même pouvoir flooder avec bienveillance Buldorak pour lui extorquer quelques infos sur ldap tirés de sa besace à gris-gris informatique Wink

sinon ce lien sur les ACL n'est pas mal : http://www.lea-linux.org/cached/index/Gestion_des_ACL.html
j'aurai tendance à dire que ça complète pas mal ton billet sur la mise en place de système de fichiers à des fins de partage de documents.
Akala dodo .... bon .... Bonne nuit !

Poster un nouveau commentaire

Le contenu de ce champ est gardé secret et ne sera pas montré publiquement.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • To highlight piece of code, just surround them with <code type="language"> Your code &tl;/code>>. Language can be java,c++,bash,etc... Everything Geshi support.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Textual smileys will be replaced with graphical ones.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.

Plus d'informations sur les options de formatage

Connexion utilisateur
Les derniers bavardages...