24 11 | 2012

Ubuntu/Debian: Partager un dossier entre utilisateurs avec les ACL

Rédigé par Sorrodje

Classé dans : Informatique, Mémos techniques , Trucs et astuces

On a souvent besoin d'organiser un dossier partagé entre utilisateurs et j'ai été confronté plusieurs fois à ce besoin récemment pour organiser des partages entre Apache2 et Tomcat6 voire entre transmission et apache2.

Autant dire que si le systeme de gestion des droits UNIX apporte une sécurité essentielle grâce au cloisonnement des droits d'accès , ça provoque rapidement des difficultés quand on veut déroger à la règle.  Finalement j'avais un peu peur de mettre les mains dans le cambouis ACL mais finalement, si ça reste compliqué à appréhender, c'est relativement facile à mettre en place  et à gérer.

Prenons une aspirine ( ou deux) et on est partis.


La problématique du partage entre utilisateurs.



Prenons l'exemple de deux utilisateurs qui sur le serveur srv1 ont leur propre répertoire dans le /home : sorrodje et toto.

:~# ls -l /home
total 32
drwx------ 2 root root 16384 juil. 9 11:26 lost+found
drwxr-xr-x 2 sorrodje sorrodje 4096 nov. 23 11:13 sorrodje
drwxr-xr-x 2 toto toto 4096 nov. 23 11:12 toto

Nos deux utilisateurs ont chacun leur espace qui leur appartient et où ils sont maître à bord. Toto ne peut pas aller écrire chez Sorrodje et inversement (droits par défaut 755 ou drwxr-xr-x où donc seul l'utilisateur peut créer ou modifier ses fichiers dans ses répertoires.)

Imaginons qu'on veuille leur ouvrir un espace partagé où l'un comme l'autre peuvent créer/modifier/supprimer des éléments qui doivent rester modifiables/supprimables par les deux.

:~# mkdir /home/partage
:~# ls -l /home
total 36
drwx------ 2 root root 16384 juil. 9 11:26 lost+found
drwxr-xr-x 2 root root 4096 nov. 23 11:31 partage
drwxr-xr-x 2 sorrodje sorrodje 4096 nov. 23 11:13 sorrodje
drwxr-xr-x 2 toto toto 4096 nov. 23 11:12 toto

Par défaut, le dossier créé par root appartient donc à root et au groupe root.

Imaginons créer un groupe avec les utilisateurs sorrodje et  toto, groupe qui aurait tous les droits sur le dossier partage:

On crée le groupe partage, et on y rattache les deux utilisateurs :

:~# addgroup partage
Ajout du groupe « partage » (GID 1004)...
Fait.
:~# adduser sorrodje partage
Ajout de l'utilisateur « sorrodje » au groupe « partage »...
Adding user sorrodje to group partage
Fait.
:~# adduser toto partage
Ajout de l'utilisateur « toto » au groupe « partage »...
Adding user toto to group partage
Fait.

On change le groupe du dossier /home/partage et on donne les droits complets au groupe  partage sur le dossier /home/partage:

:/home/pierre-olivier# chmod 775 /home/partage
pierre-olivier# chown root:partage /home/partage
:/home/:/home/pierre-olivier# ls -l /home
total 36
drwx------ 2 root root 16384 juil. 9 11:26 lost+found
drwxrwxr-x 2 root partage 4096 nov. 23 11:42 partage
drwxr-xr-x 2 sorrodje sorrodje 4096 nov. 23 11:13 sorrodje
drwxr-xr-x 2 toto toto 4096 nov. 23 11:12 toto

 et on se dit que c'est tout bon...


Un petit test, grâce aux super pouvoirs de root on endosse alternativement l'identité de sorrodje et toto pour que chacun crée un fichier dans notre joli répertoire partagé tout neuf.

:~# cd /home/partage
:/home/partage# su sorrodje
:/home/partage$ touch sorrodje.txt
:/home/partage$ exit
exit
:/home/partage# su toto
:/home/partage$ touch toto.txt
:/home/partage$ exit
exit
:/home/partage# ls -l
total 0
-rw-rw-r-- 1 sorrodje sorrodje 0 nov. 23 11:42 sorrodje.txt
-rw-rw-r-- 1 toto toto 0 nov. 23 11:42 toto.txt


et on s'aperçoit qu'avec notre répertoire partagé, notre groupe et les droits associés, on n'a répondu que partiellement à notre problème. Nos deux utilisateurs peuvent en effet créer leurs propres éléments mais ces éléments héritent des propriétés et des droits par défaut de tous les fichiers créés par tout utilisateur (hors root)  et non pas des droits qu'on souhaite appliquer à notre dossier de partage. 

En bref sorrodje et toto ne créent pas des fichiers qui appartiennent au groupe "partage" ...

En conséquence les fichiers en question sont lisibles par tous mais pas modifiables/supprimables par qui que ce soit d'autre (hors root toujours qui peut toujours tout faire) . Notre partage est donc limité. Mais pourquoi tant de haine?


L'ennemi, le traître... le Umask


Les droits et propriétés par défaut des fichiers créés par les utilisateurs est défini par le umask ( voir le man de pam_umask)  et Ce umask des utilisateurs est défini dans le fichiers /etc/login.defs ( et non plus dans /etc/profile ! ) dont voici la partie qui nous concerne :

# Login configuration initializations:
#
# ERASECHAR Terminal ERASE character ('\010' = backspace).
# KILLCHAR Terminal KILL character ('\025' = CTRL/U).
# UMASK Default "umask" value.
#
# The ERASECHAR and KILLCHAR are used only on System V machines.
#
# UMASK is the default umask value for pam_umask and is used by
# useradd and newusers to set the mode of the new home directories.
# 022 is the "historical" value in Debian for UMASK
# 027, or even 077, could be considered better for privacy
# There is no One True Answer here : each sysadmin must make up his/her
# mind.
#
# If USERGROUPS_ENAB is set to "yes", that will modify this UMASK default value
# for private user groups, i. e. the uid is the same as gid, and username is
# the same as the primary group name: for these, the user permissions will be
# used as group permissions, e. g. 022 will become 002.
#
# Prefix these values with "0" to get octal, "0x" to get hexadecimal.
#
ERASECHAR 0177
KILLCHAR 025
UMASK 022
 

La valeur 022 signfie que par défaut tout fichier crée par un utilisateur lambda est lisible/inscriptible par l'utilisateur et lisible uniquement pour son groupe et le reste du monde ... et encore on est sous Debian/Ubuntu sinon c'est encore plus restrictif et les utilisateurs ne peuvent même pas voir et lires les fichiers des autres.

On peut changer ça et faire en sorte que les fichiers créés par les utilsateurs soient lisibles ET modifiables par tous mais ç'est tout de même ouvrir grande les portes dans un gestion des droits qui contribue pour beaucoup à la sécurité de nos systèmes.
On ne veut pas donner tous les droits à tout le monde mais juste tous les droits de lecture/écriture à certains utilisateurs pour un dossier donné.

Et ben ça c'est possible via l'utilisation des Access Control List ou ACL qui vont nous permettre de déterminer des droits particuliers user par user  et dossier par dossier.


Installation et activation des ACL


On installe le paquet indispensable (en mode Debian-like et donc via apt-get)

#apt-get install acl

puis il faut passer l'option qui va bien aux partitions. Pour cela il faut modifier le /etc/fstab pour ajouter la mention acl dans les options de montage pour la ou les partitions où l'on souhaite activer cette fonctionnalité.

#nano /etc/fstab

ici par exemple si on active les ACL pour la partition /home, voici la ligne du /etc/fstab correspondante:

# /home was on /dev/vda7 during installation
UUID=92871db8-6f7e-4ab1-803d-ab4ee97ab8e0 /home           ext4    acl,defaults        0       2

Un reboot permet de faire prendre en compte les modifications si un simple umount/mount n'est pas possible si la partition considérée ne peut pas être démontée à chaud.

On est prêt à mettre en place ce qu'on veut.


Configuration des droits ACL d'un dossier


Partons d'une situation ou on crée en tant que root notre répertoire de partage. On est toujours dans le /home pour l'exemple mais on pourrait être partout ailleurs.

:/home# mkdir partage
:/home# ls -l
total 36
drwx------ 2 root root 16384 juil. 9 11:26 lost+found
drwxr-xr-x 2 root root 4096 nov. 23 16:37 partage
drwxr-xr-x 2 sorrodje sorrodje 4096 nov. 23 11:13 sorrodje
drwxr-xr-x 2 toto toto 4096 nov. 23 11:12 toto


On a donc préalablement installé le paquet ACL et activé l'option via le /etc/fstab

On consulte l'état des droits via la commande

# getfacl partage

et ça donne le résultat suivant:

:/home# getfacl partage
# file: partage
# owner: root
# group: root
user::rwx
group::r-x
other::r-x


ce qui nous dit qu'aucun droit particulier n'a été paramétré, ce qu'on va maintenant commencer à faire avec la commande setfacl:

:/home# setfacl -m u:sorrodje:rw partage

Cette commande stipule qu'on modifie (-m) les droits lecture/écriture (rw)  du répertoire "partage" pour le user (u) sorrodje . On vérifie que la modification est prise en compte avec la commande getfacl ( et l'option --o pour ne pas afficher l'en tête qui ne nous apporte rien)


:/home# getfacl --o partage
user::rwx
user:sorrodje:rw-
group::r-x
mask::rwx
other::r-x

On voit  l'apparition des droits spécifiques à l'utilisateur Sorrodje en lecture/écriture comme souhaité et aussi une valeur "mask" . Cette valeur est ( si j'ai tout bien compris) créé automatiquement à niveau de plus grand dénominateur commun des droits group et user afin de ne pas masquer impacter les droits de chacun. A noter que du coup, une consultation des droits globaux habituelle via ls -l montre un changement :

:/home# ls -l
total 36
drwx------ 2 root root 16384 juil. 9 11:26 lost+found
drwxrwxr-x+ 2 root root 4096 nov. 23 16:59 partage
drwxr-xr-x 2 sorrodje sorrodje 4096 nov. 23 11:13 sorrodje
drwxr-xr-x 2 toto toto 4096 nov. 23 11:12 toto


On voit qu'un + s'est ajouté montrant la présence d'un paramétrage ACL et que les droits du groupe est passé en rwx comme notre mask ci dessus.

On teste comme précédemment en utilisant un de nos users normaux:

:/home# su sorrodje
:/home$ cd partage
bash: cd: partage: Permission non accordée 


amarch' pas...

Il faut en fait donner des droits rwx via setfacl pour qu'un user ait accès à notre dossier:

on revient en root via

:/home$ exit

et on modifie les paramétrages ACL :

:/home# setfacl -m user:sorrodje:rwx partage

Et on reteste:

:/home# su sorrodje
:/home$ cd partage
:/home/partage$ touch sorrodje.txt
:/home/partage$ ls -l
total 0
-rw-rw-r-- 1 sorrodje sorrodje 0 nov. 23 17:15 sorrodje.txt

amarch' mieux mais pas tout à fait quand même puisque vous aurez noté que si notre bon sorrodje a des droits d'écriture dans un dossier où il n'a normalement pas accès via les droits généraux , le fichier ainsi crée n'hérite pas des droits ACL et reste donc non modifiable par un autre user... On est reparti pour un tour :

:/home/partage$ exit
exit
:/home# setfacl -m d:user:sorrodje:rwx partage
:/home# getfacl partage
# file: partage
# owner: root
# group: root
user::rwx
user:sorrodje:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:sorrodje:rwx
default:group::r-x
default:mask::rwx
default:other::r-x


On ajouté ce coup ci des droits par défaut qui permettent au nouveau fichiers créés de récupérer aussi des droits ACL! La preuve par l'exemple :

:/home# su sorrodje
:/home$ cd partage
:/home/partage$ touch sorrodje.txt
:/home/partage$ getfacl sorrodje.txt
# file: sorrodje.txt
# owner: sorrodje
# group: sorrodje
user::rw-
user:sorrodje:rwx #effective:rw-
user:toto:rwx #effective:rw-
group::r-x #effective:r--
mask::rw-
other::r--

On s'aperçoit d'ailleurs que le mask du fichier est rw- et pas rwx et que si les droits ACL du répertoire "partage" sont à rwx pour l'utilisateur sorrodje , les droits effectifs ( #effective ) sont bien à rw par défaut.

Si on répète l'ensemble de la manip pour l'utilisateur toto :

:/home# setfacl -m u:toto:rwx partage
:/home# setfacl -m d:u:toto:rwx partage

Pour paramétrer les droits ACL de toto pour le répertoire "partage".

Puis test :

:/home# su toto
:/home$ cd partage
:/home/partage$ ls
sorrodje.txt
:/home/partage$ touch toto.txt
:/home/partage$ getfacl *
# file: sorrodje.txt
# owner: sorrodje
# group: sorrodje
user::rw-
user:sorrodje:rwx #effective:rw-
user:toto:rwx #effective:rw-
group::r-x #effective:r--
mask::rw-
other::r--

# file: toto.txt
# owner: toto
# group: toto
user::rw-
user:sorrodje:rwx #effective:rw-
user:toto:rwx #effective:rw-
group::r-x #effective:r--
mask::rw-
other::r--


Sorrodje on bien les même droits que le créateur soit toto ou sorrodje.. on touche donc au but et on a bien un répertoire partagé complètement par toto et sorrodje.


Sachant que depuis le départ on a un groupe "partage" avec toto et sorrodje on aurait aussi pu paramétrer les ACL pour l'ensemble du groupe :

:/home# setfacl -m g:partage:rwx partage
:/home# setfacl -m d:g:partage:rwx partage
:/home# getfacl partage
# file: partage
# owner: root
# group: root
user::rwx
group::r-x
group:partage:rwx
mask::rwx
other::r-x
default:user::rwx
default:group::r-x
default:group:partage:rwx
default:mask::rwx
default:other::r-x


Un test rapide montre qu'ainsi aussi les utilisateurs du groupe partage donc sorrodje et toto ont bien leur répertoire partagé où ils peuvent écrire/lire/modifier supprimer tous les fichiers créés.


Voilà , vous pouvez arrêter l'aspirine et vous payer une bonne bière après cette tranche de prise de casque ;) 

Je ne vous cache pas que la compréhension et la retranscription de ce que j'ai (pas tout bien d'ailleurs) compris m'a coûté du jus de cerveau...


Ma source principale : POSIX Access Control Lists on Linux  

Mots clés : debian, ubuntu, ACL

4 commentaires

vendredi 01 novembre 2013 à 00:17 voxpopuli a dit : #1

merci ;)
Petite astuce lors de la modification de "/etc/fstab" voila la commande pour récupérer les UUID des disques:

ls -l /dev/disk/by-uuid/

lundi 11 novembre 2013 à 17:09 Sorrodje a dit : #2

@voxpopuli : Un petit blkid en mode root ou via sudo, ça le fait bien aussi pour obtenir les UUID des disques. ;-)

mercredi 15 janvier 2014 à 10:37 gringo675 a dit : #3

merci :), super article.
Ajouté dans mes favoris ca resservira toujours :)

jeudi 15 mai 2014 à 16:40 francois a dit : #4

Bonjour

Merci beaucoup pour cette article !
Cela fonctionne très bien pour les fichiers, mais pas pour les dossiers crées par les différents utilisateurs. On ne peut pas les renommer ou effacer les dossiers que les autres utilisateurs. Par contre lorsque l'on veut effacer le dossier, tous les fichiers à l’intérieur sont effacés.

Merci d'avance

Écrire un commentaire

Quelle est la dernière lettre du mot wsdz ? : 

Archives

Contrat Creative Commons
Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Partage à l'Identique 2.0 France
.