Les droits avancés sur Linux (ACL)

Droits Linux
Droits de dossiers Renaud PERRAI

La gestion des droits sur un dossier ou un fichier avec Linux peut facilement devenir un calvaire. Entre donner des droits à tout le monde sans restriction ou n'en donner à personne, il existe une multitude de possibilité. En plus des doits classiques, il existe une gestion des droits avancés appelé ACL pour Access Control Lists. Sur un serveur, il est important d'ajuster les droits au plus près des besoins pour éviter les trous de sécurité.

Les droits classiques

Sous Linux, comme sur les autres systèmes d'exploitation, les droits sur un fichier ou un dossier se gèrent de manière simple. De manière basique, il y a un utilisateur propriétaire et un groupe propriétaire. Ils ont tous les droits sur l'élément et on peut gérer les droits de tous les autres utilisateurs (lecture, écriture, exécution).

Lors du listage des droits des fichiers dans un terminal, il y a plusieurs informations qui sont fournies :

ls -l
-rwxr-xr-x 1 utilisateur groupe taille date heure fichier

Pour lire, il faut séparer le premier bloc en 4 éléments :

  • Le premier caractère définit s'il s'agit d'un fichier (-) ou d'un répertoire (d) ;
  • Les 3 caractères suivants définissent les droits du propriétaire : lecture (r), écriture (w), exécution (x) ;
  • Les 3 caractères suivants définissent les droits du groupe propriétaire : lecture (r), écriture (w), exécution (x) ;
  • Les 3 derniers caractères définissent les droits de tous les autres : lecture (r), écriture (w), exécution (x) ;

Pour faire simple dans le cas présenté, l'utilisateur a tous les droits sur le fichier, le groupe a le droit de lecture et d'exécution et tout le monde a le droit de lecture et d'exécution. Il s'agit d'un fichier exécutable (script, logiciel ou autre).

Pourquoi avoir besoin de plus ?

Dans mon cas, j'ai besoin d'ajouter des droits à un utilisateur FTP sur un répertoire particulier de mon serveur Web. Je pourrais ajouter cet utilisateur au groupe propriétaire du serveur Web, mais cela va lui donner tous les droits sur tous les répertoires. Je pourrais aussi créer un nouveau groupe propriétaire uniquement pour le répertoire en question et y mettre mon utilisateur FTP et celui du serveur Web, mais c'est très long et pas facile à gérer dans le temps.

La solution la plus brutale serait de donner un droit en écriture à tous les utilisateurs du système, mais ça provoque un gros trou de sécurité sur le serveur. J'ai déjà vu cette solution utilisée sur des serveurs de production et ça me fait peur pour la sécurité informatique du serveur en question.

La solution la plus simple et la plus rapide est de donner à mon utilisateur FTP des droits propres sur ce répertoire. Comme ça, il sera le seul à avoir ces droits et ce sera simple à gérer dans le temps. Si cet utilisateur devrait être supprimé ou suspendu, ses droits ne seraient plus accessibles.

Les droits ACL

Les droits ACL se superposent aux droits classiques, c'est à dire qu'ils viennent en plus de ces droits, ils ne les remplacent pas. Si un utilisateur ne fait pas partie du groupe propriétaire ou n'est pas propriétaire d'un fichier, il rentre dans le troisième paquet de droits (voir dans le premier chapitre). Avec des droits ACL, on peut lui donner des droits uniques pour ce fichier en particulier.

On va considérer que le fichier toto.txt est créé par l'utilisateur Renaud et que son groupe est Administrateur. L'utilisateur FTP fait partie du groupe user_ftp et doit accéder à ce fichier pour le bon fonctionnement d'un site Internet.

ls -l toto.txt
-rw-rw---- 1 Renaud Administrateur 10 01 oct 2020 12:21 toto.txt

En lisant attentivement les droits ci-dessus, l'utilisateur Renaud et le groupe Administrateur ont le droit de lire et de modifier le fichier. Le fichier n'est pas exécutable, pour faire simple ce n'est pas un programme, ça règle des problèmes de sécurité. Tous les autres utilisateurs et groupes n'ont aucun droit sur le fichier. Donc mon utilisateur FTP et son groupe user_ftp ne peuvent pas accéder à ce fichier et son contenu. Pour régler ce problème, on va lui attribuer des droits spéciaux.

# setfacl permet de définir un ACL sur un dossier ou fichier
# L'option -m modifie ou ajoute un ACL
# u définie l'utilisateur et les droits à ajouter
setfacl -m u:FTP:rw toto.txt

Et voilà, l'utilisateur FTP a maintenant les droits sur le fichier toto.txt et seulement lui. Cette méthode est rapide et facile à mettre en place. Pour voir les droits ACL d'un fichier, il faut procéder comme suit :

getfacl toto.txt
# file : toto.txt
# owner : Renaud
# group : Administrateur
user::rw-
user:FTP:rw-
group::rw-
....

Quelques commandes pratiques

# Supprimer les ACL
setfacl -b toto.txt
# Supprimer les droits ACL d'un utilisateur
setfacl -x u:toi toto.txt
# Ajouter des droits ACL sur un dossier et son contenu
setfacl -Rm u:toi:rw ./test/
# Ajouter des droits ACL pour un groupe
setfacl -m g:user_ftp:rw toto.txt

Il existe aussi les masques par défaut et l'héritage, mais je ne m'en sers pas jusqu'à présent, donc je ne préfère pas écrire de bêtises sur le sujet.