Droits spéciaux

De wiki jackbot
Aller à la navigation Aller à la recherche

Une des fonctionnalités intéressante sur les systèmes GNU/linux est la gestion des droits utilisateurs. Elle peut se faire de manière fine et surtout apporter une gestion insoupçonnée.

Les droits en général

Lorsqu'on affiche le contenu d'un dossier avec la commande ls -l

drwxr-xr-x 2 tata groupe_tata 6 Jan 14 07:09 dossier_tata
drwxr-xr-x 2 toto groupe_toto 6 Jan 14 07:09 dossier_toto

On voit que les utilisateurs sont "tata" et, "toto". Commençons avec ceci :

drwx

La lettre 'd' signifie que la ligne concerne un dossier. Le premier triplet de lettres "rwx" correspond aux droits utilisateurs, donc "tata" et "toto". Dans ce cas l'utilisateur à le droit de lire (r pour read), écrire (w pour write) et d'exécuter (x pour execute).

Le triplet suivant :

r-x

Concerne les droits de groupe, c'est à dire "groupe_tata" et "groupe_toto". Les utilisateurs appartenant à ces groupes ont le droit de lire et d'exécuter, mais pas d'écrire.

Le dernier triplet concerne tous les autres utilisateurs.

Vous comprenez donc que la gestion des droits peut être très fine, on peut créer des utilisateurs, leur donner des droits sur certains fichiers/dossiers, les associer à certains groupes qui leur attribueront d'autres droits sur d'autres fichiers/dossiers, ainsi que définir des droits par défaut pour tous les autres utilisateurs.

Droits spéciaux

Là ça va commencer à être vraiment intéressant ! Reprenons notre exemple avec les utilisateurs "tata" et "toto". Imaginons que ces deux utilisateurs doivent collaborer et utiliser les mêmes fichiers.

La mauvaise solution

Ce qu'on voit de temps en temps sur internet est le fameux

chmod 777 fichier

... Comment dire ... C'est la solution brutale, sans aucune subtilité. Pire cette solution permet à n'importe qui d'accéder à ce fichier, ce qui n'est pas forcément une bonne chose. C'est donc une solution à éviter à tout prix !!

La solution élégante

Il existe une solution beaucoup plus élégante, mais elle nécessite un peu de mise en place, commençons pas créer un nouveau groupe "commun" :

groupadd commun

Puis de créer un dossier commun, de l'associer au groupe "commun" et de donner les droits au groupe :

# mkdir dossier_commun
# chown :commun dossier_commun/
# chmod 770 dossier_commun/
# ls -l
total 0
drwxrwx--- 2 root commun      6 Jan 14 07:34 dossier_commun
drwxr-xr-x 2 tata groupe_tata 6 Jan 14 07:09 dossier_tata
drwxr-xr-x 2 toto groupe_toto 6 Jan 14 07:09 dossier_toto

D'ajouter les utilisateurs "tata" et "toto" au groupe "commun"

# usermod -aG commun tata
# usermod -aG commun toto

Jusque là rien de nouveau et pour l'instant les utilisateurs ne pourront pas collaborer correctement car si tata crée un fichier dans le dossier commun, voilà ce qu'il se passera :

$ cd /home/dossier_commun
$ touch test
$ ls -l
total 0
-rw-rw-r-- 1 tata tata 0 Jan 14 07:45 test

On voit que le fichier "test" appartient bien à "tata", que cet utilisateur peut lire et écrire dans ce fichier, mais que les autres utilisateurs ne pourront que le lire. Impossible donc pour "toto" de faire une modification de ce fichier "test" ...

C'est maintenant qu'arrive l'astuce, il s'agit d'utiliser setgid, voici ce qu'en dit Wikipedia

Le fonctionnement de Setgid sur un répertoire est très différent de celui sur les exécutables : si cette propriété est appliquée à un répertoire, tout fichier ou sous-répertoire créé dans ce répertoire parent appartiendra au groupe de celui-ci et non au groupe de l'utilisateur qui crée l'élément. 

On active donc le setgid pour le répertoire "commun" avec la commande :

chmod g+s dossier_commun/
# ls -l
total 0
drwxrws--- 2 root commun      18 Jan 14 07:45 dossier_commun
drwxr-xr-x 2 tata groupe_tata  6 Jan 14 07:09 dossier_tata
drwxr-xr-x 2 toto groupe_toto  6 Jan 14 07:09 dossier_toto

Pour les plus attentifs d'entre vous, vous aurez remarqué que le deuxième triplet de "dossier_commun" n'est plus "rwx", mais "rws". Ce qui nous prouve que le setgid est actif. Maintenant si "tata" crée un nouveau fichier dans ce dossier voici ce qu'il se passe :

$ touch test_2
$ ls -l
total 0
-rw-rw-r-- 1 tata tata   0 Jan 14 07:45 test
-rw-rw-r-- 1 tata commun 0 Jan 14 07:59 test_2

Le fichier "test_2" appartient automatiquement au groupe "commun" et comme l'utilisateur "toto" fait également partit de ce groupe, alors il aura les droit "rw-" sur ce fichier. Il pourra donc lire et modifier ce fichier.

Cette solution permet donc d'autoriser la collaboration uniquement avec les utilisateurs appartenant à un groupe déterminé, tout en limitant les droits des utilisateurs qui ne font pas partit de ce groupe.