Activité Gestion des utilisateur·rice·s et des droits sous Linux

Consigne

  1. La durée de l’activité est estimée à environ 180 minutes.
  2. Avant de commencer l’activité :
    • Lire la mise en situation, prendre connaissance des objectifs, du résultat attendu, et des ressources à disposition.
    • Lire une première fois en entier la section Mise en route.
  3. Effectuez le travail décrit dans la section Mise en route et effectuez les tâches demandées dans la section Tâches.

Mise en situation

Vous êtes chargé de mettre en œuvre des mesures techniques pour la protection des données dans un système Linux. Pour cela, vous devez créer un compte pour chaque utilisatrice et utilisateur du système, des groupes représentant les rôles que peuvent avoir ces utilisatrices et utilisateurs. Vous devez ensuite créer des répertoires partagés et configurer les droits d’accès à ces répertoires pour chacun de ces rôles.

Objectifs

À la fin de ce travail, vous devez :

  1. Connaître le principe des permissions POSIX (owner, owner group, other)
  2. Connaître la notion d’ACL (Access Control List) et la manière dont les ACL se distinguent des permissions POSIX.
  3. Connaître les permissions POSIX (r, w, x) et les différentes manières de les représenter (notamment en notation octale).
  4. Connaître la signification de la permission x pour les répertoires (directories).
  5. Connaître la structure d’un compte d’utilisateur·rice sous Linux.
  6. Connaître la manière de chiffrer un mot de passe pour le stocker.
  7. Connaître des moyens de créer un compte d’utilisateur·rice.
  8. Connaître des moyens de modifier un compte d’utilisateur·rice.
  9. Connaître des moyens de supprimer un compte d’utilisateur·rice.
  10. Connaître un moyen de lister les comptes d’utilisateur·rice.
  11. Être capable de décrire de quelle manière sont stockés les comptes d’utilisateur·rice·s par défaut (fichier /etc/passwd)
  12. Être capable de décrire de quelle manière sont stockés les mots de passe des comptes d’utilisateur·rice·s (fichier /etc/shadow)
  13. Connaître les limites des permissions lorsqu’un attaquant dispose d’un accès physique à la machine.
  14. Connaître des moyens de protections des données lorsqu’un attaquant dispose d’un accès physique à la machine (chiffrement des disques).
  15. Connaître les risques, en termes de protection des données, liés au chiffrement des disques.

Résultat attendu

  • Un système Linux configuré selon les instructions.
  • Les réponses aux questions.

Ressources

Matériel :

  • Un serveur Linux (Ubuntu 20.04 LTS) : svr-m122-$NUM.lab.epai-ict.ch. La variable « $NUM » est le numéro de votre réseau tel qu’il apparait dans les informations d’identification que vous avez reçues par courriel.

Mise en route

Un peu de théorie

Authentification

Comme nous l’avons vu, l’authentification est un processus durant lequel un·e utilisateur·rice qui possède un compte dans un système :

  • S’identifie en fournissant un identifiant, généralement le nom du compte.
  • Prouve qu’iel est bien la personne qu’iel prétend être, généralement à l’aide d’un mot de passe.

Sous Linux, le processus d’authentification est initié au démarrage du système par le programme login dans un système en ligne de commande (CLI) ou par un gestionnaire d’affichage comme GDM (GNOME Display Manager), par exemple, dans d’un système avec un environnement de bureau (Desktop Environement). Une demande d’authentification peut également être initiée par certains programmes comme sudo, su lorsque l’on veut exécuter une commande avec une élévation de privilèges, ou encore le démon sshd lorsqu’un·e utilisateur·rice se connecte à distance.

Dans tous les cas, le processus d’authentification est généralement orchestré par le PAM (Pluggable Authentication Modules), mais ce n’est pas nécessairement le cas (par exemple, l’authentification par clé publique en ssh est prise en charge par le sshd). Le PAM est un composant modulaire qui peut être facilement adapté à des besoins spécifiques par l’ajout ou la suppression de modules. De cette manière, l’administrateur·rice d’un système peut, par exemple :

  • utiliser un service d’annuaire pour centralisation de la gestion des utilisateur·rice·s.
  • mettre en œuvre une authentification à deux facteurs (2FA).
  • utiliser un protocole d’authentification réseau comme Kerberos.

Par défaut, le PAM utilise l’authentification par mot de passe. Les données des comptes utilisateur·rice·s et des groupes sont gérées localement dans deux fichiers de texte : /etc/passwd pour les comptes et /etc/group pour les groupes. Les informations relatives aux mots de passe sont conservées dans deux autres fichiers, /etc/shadow pour les comptes et /etc/gshadow pour les groupes.

Chaque ligne du fichier /etc/passwd représente un compte et comprend les informations suivantes : le nom du compte, son identifiant numérique (UID), l’identifiant numérique du groupe principal (GID), le chemin de du répertoire personnel et le shell par défaut. De la même manière, chaque ligne du fichier /etc/group représente un groupe et t comprend les informations suivante : le nom du groupe, son identifiant numérique (GID) et la liste des nos des comptes qui en sont membres.

Chaque compte appartient obligatoirement à un groupe principal et de manière optionnelle, à un ou plusieurs groupes secondaires. La liste des membres d’un groupe contient seulement les membres dont il est un groupe secondaire; le GID du groupe principale est stocké dans le fichier /etc/passwd.

Les fichier /etc/shadow et /etc/gshadow contiennt des *informations sensibles, telles que le mot de passe chiffré, la date de la dernière connexion, la date d’expiration du mot de passe, etc. Chaque ligne associe le nom d’un compte, respectivement le nom d’un groupe, à un mot de passe et aux autres informations. L’accès à ces fichiers est réserver au compte root.

Dans le fichier shadow, les mots de passe sont chiffrés à l’aide d’algorithmes de chiffrement à sens unique, également appelé algorithme de hachage, de qualité cryptographique tels que SHA-256 ou SHA-512. Un tel algorithme transforme un texte de longueur quelconque en un nombre de longueur fixe (typiquement 256 ou 512 bits) appelé empreinte (hash), avec une probabilité de collision très faible. Cela signifie qu’il n’y a presque aucune chance pour que deux textes différents produisent la même empreinte.

Autorisation (permissions)

Si une personne s’est authentifiée avec succès, cela signifie seulement qu’elle dispose d’un compte sur le système. Cela ne signifie pas nécessairement qu’elle autorisée à utiliser librement les ressources et notamment les fichiers qui s’y trouvent.

Sous Linux, les droits des utilisateur·rice·s sont définis à l’aide du système de permission POSIX. Ce système de gestion des accès permet de contrôler qui peut lire, modifier ou exécuter un fichier ou un répertoire.

Pour cela, ce système prévoit pour chaque fichier et chaque répertoire, trois catégories d’utilisateur·rice·s susceptibles d’y accéder et un certain nombre de permissions que l’on peut accorder ou non à chacune de ces catégories.

Les trois catégories sont :

  • Propriétaire (owner user) : par défaut, le compte utilisé pour créer le fichier ou le répertoire.
  • Groupe de propriétaires (owner group) : par défaut, le groupe principal du compte propriétaire.
  • Autre (other) : tous les autres utilisateur·rice·s du système.

Les principales permissions sont aussi au nombre de trois :

  • Lecture (read ou r) : permet de lire le contenu du fichier ou du répertoire.
  • Écriture (write ou w) : permet de modifier le contenu du fichier ou du répertoire.
  • Exécution (execute ou x) : permet d’exécuter le fichier (si le fichier est exécutable) ou, dans le cas d’un répertoire, d’y entrer ou de le traverser. Sans cette permission, le contenu d’un répertoire n’est pas accessible.

Lorsqu’on liste le contenu d’un répertoire avec la commande ls, on peut utiliser l’option -l pour afficher les permissions, ainsi que le compte et le groupe propriétaires.

1
2
3
4
-rwxr-x--x 1 admin admin    0 mai    6 14:57 create_database
drwxrwxr-x 2 admin admin 4096 mai    6 15:01 projects
-rw-rw---- 1 admin admin    0 mai    6 14:57 rapport.md
-rw-rw-r-- 1 admin admin    0 mai    6 14:56 readme.txt
Fig. 1 – Exemple de contenu d'un répertoire

Le nom du compte et celui du groupe propriétaire apparaissent, dans cet ordre, séparés par une espace. Par exemple, dans le cas des fichiers de la figure 1, le propriétaire est le compte admin et le groupe propriétaire est le groupe principal du compte admin, qui s’appelle également admin.

Les permissions apparaissent sous la forme d’une chaine composée de trois groupes de trois caractères. Le premier groupe représente les permissions du ou de la propriétaire, le deuxième, les permissions du groupe propriétaire et le dernier, les permissions des autres utilisateur·rice·s. Le caractère qui se trouve à gauche des permissions indique s’il s’agit d’un fichier - ou d’un répertoire d.

Le premier caractère de chaque groupe représente la permission de lecture, le second, la permission d’écriture, et le troisième, la permission d’exécution. Le caractère est une lettre (r w ou x) si la permission est accordée, et un tiret (-) dans le cas contraire.

Fig. 2 – Permissions POSIX

Considérons, par exemple, les permissions du fichier create_database :

  • rwx indiquent que le compte admin peut lire, modifier et exécuter le fichier.
  • r-x indiquent que les membres du groupe admin peuvent lire et exécuter le fichier, mais qu’iels ne peuvent pas le modifier.
  • --x indiquent que les autres utiliseur·rice·s peuvent exécuter le fichier, mais qu’iels ne peuvent ni le lire ni le modifier.

Par défaut, le contrôle d’accès d’un système Linux est discrétionnaire (Discretionary Access Control ou DAC). Cela signifie que le ou la propriétaire d’un fichier ou d’un répertoire peut, à sa discrétion (c’est-à-dire selon sa volonté), modifier les permissions et le groupe propriétaire de ce fichier ou de ce répertoire. Toutefois, le transfert de propriété d’un fichier ou d’un répertoire à un·e autre utilisateur·rice requiert l’utilisation du compte root. Les privilèges étendus de ce compte permettent de modifier les permissions, le propriétaire, et le groupe propriétaire de n’importe quel fichier ou répertoire du système.

Tâches

Effectuez les tâches décrites ci-après. Chacune des tâches se termine par une petite série de questions. Rassemblez ces questions et leurs réponses dans un document, afin que l’on puisse en discuter durant la mise en commun.

Ouvrir une session ssh

Pour vous connecter à votre machine Linux (svr-m122-##.lab.epai-ict.ch), commencez par chercher le numéro de votre réseau et votre mot de passe dans les informations de connexion que vous avez reçue. Notez-les de manière à les avoir sous la main !

Ouvrez ensuite une fenêtre de terminal (sans privilèges) et tapez la commande ci-après en remplaçant les caractères ## par le numéro de votre réseau :

1
ssh admin@svr-m122-##.lab.epai-ict.ch

Lorsque vous y êtes invitez, tapez votre mot de passe. Si tout c’est bien passé vous devriez voir l’invite de commande (prompt) de votre machine Linux :

1
admin@svr-m122-32:~$

Créer et modifier un compte d’utilisateur·rice de manière interactive

Dans cette section, vous allez être amené à créer, modifier et supprimer des comtpes d’utilisateur·rice·s et des groupes.

L’une des manière d’ajouter un compte d’utitilateur·rice locale est d’utiliser l’utilitaire interactif adduser. Essayons de créer un compte pour Ada Lovelace avec le nom lovelacea avec la commande suivante :

1
adduser lovelacea

Le système nous informe que nous devons avoir les privilèges root pour ajouter un compte d’utilisateur·rice ou un groupe :

1
adduser: Only root may add a user or group to the system.

Pour obtenir ces privilèges, nous pouvons utiliser la commande sudo. Cette commande permet de lancer la commande passée en paramètre avec les privilèges root :

1
sudo adduser lovelacea

Cette fois, la commande vous informe qu’elle a ajouté le compte et un groupe du même nom, créé le répertoire personnel /home/lovelacea, et initialisé le répertoire personnel en copiant le contenu de /etc/skel, puis vous invite à saisir un mot de passe et à le confirmer :

1
2
3
4
5
6
7
Adding user `lovelacea' ...
Adding new group `lovelacea' (1003) ...
Adding new user `lovelacea' (1002) with group `lovelacea' ...
Creating home directory `/home/lovelacea' ...
Copying files from `/etc/skel' ...
New password: 
Retype new password:

Si le mot de passe et la confirmation ne coïncident pas, vous êtes invité à réessayer. Si vous choisissez de ne pas le faire, la création du compte se poursuit sans mot de passe. Il sera toujours possible de définir plus tard un mot de passe avec la commande passwd. Nous y reviendrons.

1
2
3
4
Sorry, passwords do not match.
passwd: Authentication token manipulation error
passwd: password unchanged
Try again? [y/N] 

Après avoir saisi et confirmé le mot de passe, vous êtes invité à saisir un certain nombre d’informations optionnelles telles qu’un nom complet, un no de salle, un no de téléphone, etc. Si nous choisissons de renseigner ces champs, il est important de n’utiliser que les lettres sans accent, des chiffres et des espaces.

Pour notre exemple, nous pouvons saisir “Augusta Ada King comtesse de Lovelace” pour le champ Full Name, et “1815” pour le champ Room Number. Pour les autres champs, on accepte la valeur proposée entre crochets (ici des chaînes vides) en pressant la touche Entrée, puis on confirme que les informations saisies sont correctes. En pressant la touche y ou la touche Entrée (dans les crochets, la lettre en majuscule est la valeur par défaut).

1
2
3
4
5
6
7
8
Changing the user information for lovelacea
Enter the new value, or press ENTER for the default
	Full Name []: Augusta Ada King comtesse de Lovelace
	Room Number []: 1815
	Work Phone []: 
	Home Phone []: 
	Other []: 
Is the information correct? [Y/n] 

Si elle s’est exécutée avec succès, la commande a produit les effets suivants :

  • Ajout d’un enregistrement dans le fichier /etc/group pour le groupe lovelacea.
  • Ajout d’un enregistrement dans le fichier /etc/gshadow pour le mot de passe du groupe lovelacea (par défaut de mot de passe).
  • Ajout d’un enregistrement dans le fichier /etc/passwd pour le compte lovelacea.
  • Ajout d’un enregistrement dans le fichier /etc/shadow pour le mot de passe du compte lovelacea.
  • Création d’un répertoire lovelacea dans le répertoire /home
  • Transfert de la propriété du répertoire /home/lovelacea au compte lovelacea et au groupe lovelacea
  • Modification des permission du répertoire lovelacea (rwxr-x--- ou 750)

Voyons d’abord à quoi ressemble le compte dans le fichier /etc/passwd. Pour cela, tapez la commande suivante :

1
tail -n 4 /etc/passwd

Cette commande affiche les quatre dernières ligne du fichier /etc/passwd et devrait produire le résultat suivant :

1
2
3
4
admin:x:1000:1000::/home/admin:/bin/bash
mysql:x:114:119:MySQL Server,,,:/nonexistent:/bin/false
ansible:x:1001:1001::/home/ansible:/bin/bash
lovelacea:x:1002:1002:Augusta Ada King comtesse de Lovelace,1815,,:/home/lovelacea:/bin/bash

Chaque ligne est un enregistrement dont les champs séparés par des deux-points sont :

  • Nom du compte
  • Mot de passe (un x indique que le mot de passe se trouve dans le fichier /etc/shadow)
  • UID du compte
  • GID du groupe principal
  • Commentaire (champ GECOS)
  • Répertoire personnel
  • Shell par défaut

On peut voir que le champ commentaire est vide pour les comptes admin et ansible, mais qu’il est subdivisé en plusieurs champs séparés par des virgules (comma ,) pour les comptes mysql et lovelacea. Ces champs correspondent aux champs Full Name, Room Number, etc. que nous avons vus plus haut et suivent un vieux standard d’industrie appelé GECOS.

On peut modifier ces valeurs avec la commande chfn (change fullname).Pour modifier les informations d’un autre compte, il est nécessaire de disposer des privilèges du compte root. Sans ces privilèges, nous ne pouvons modifier seulement les informations de son propre compte et, par mesure de sécurité, la commande nous demande notre mot de passe avant de nous permettre d’effectuer nos changements.

Comme nous l’avons vu, nous pouvons obtenir ces privilèges avec la commande sudo. Tapez la commande suivante pour modifier les informations du compte lovelacea :

1
sudo chfn lovelacea

On retrouve alors la même séquence de questions que lors de la création du compte, mais les valeurs par défaut sont cette fois les valeurs actuelles :

1
2
3
4
5
6
7
8
Changing the user information for lovelacea
Enter the new value, or press ENTER for the default
	Full Name [Augusta Ada King comtesse de Lovelace]: 
	Room Number [1815]: 
	Work Phone []: 
	Home Phone []: 
	Other []: 
Is the information correct? [Y/n] 

Pour changer le mot de passe, on utilise la commande passwd. Pour modifier le mot de passe d’un autre compte, nous devons bien évidement avoir les privilèges du compte root*. Sans ces privilège, nous ne pouvons changer que notre propre mot de passe, et la commande nous demande d’abord de nous authentifier en saissant notre mot de passe actuel.

Tapez la commande suivante pour modifier le mot de passe du compte lovelacea :

1
sudo passwd lovelacea

Utilisez maintenant la commande suivante pour afficher le contenu du fichier /etc/shadow :

1
sudo tail -n 4 /etc/shadow

Le résultat devrait être comparable au contenu de la figure suivante :

1
2
3
4
admin:$6$m122$l3Ev4lvChWNEaIVKOo5TLSyfT1qSga64BZjoahVGT1h2fkrdzwZCJRYlFRqUVgqXRaP8nGbIo1HGgOaD/1jlC.:19705:0:99999:7:::
mysql:!:19705:0:99999:7:::
ansible:!:19705:0:99999:7:::
lovelacea:$y$j9T$0fr7rVsgEU87RpWxZoh6e1$2HX.3f8ye.oElKK0IPXmevbte9BY2p4gzBeBcBl6ol/:19850:0:99999:7:::

À vous de jouer

Avant de poursuivre, répondez au question suivantes :

  1. Quel est le nom de l’utilitaire en ligne de commande qui permet de créer, de manière interactive, un compte d’utilisateur·rice ?

  2. Quel est le nom de la commande qui permet de changer, de manière interactive, son propre mot de passe ou le mot de passe d’un autre.

  3. Que contient le fichier /etc/passwd ?

  4. Que contient le fichier /etc/group ?

  5. Que contient le fichier /etc/shadow ?

  6. Expliquer pourquoi l’accès au fichier /etc/shadow n’est autorisé qu’au compte root ?

  7. Expliquez en quelques mots ce qu’est l’empreinte d’un mot de passe, et la manière dont cette empreinte est produite.

  8. Si l’on observe l’empreinte de mot de passe du compte admin et celle du mot de passe du compte lovelace, on s’aperçoit que le début n’est pas le même : $6$ pour l’un et $y$ pour l’autre. Expliquez cette différence.

Créer et supprimer des comptes d’utilisateur·rice·s

Les commande de la sections précédente sont interactives. Elles nécessite une interaction avec l’utilisateur·rice pour obtenir des informations, parmi lesquelles un mot de passe qui ne peux pas être passé par la ligne de commande.

Pour créer, modifier ou supprimer des comptes de manière non interactive, par exemple pour automatiser des processus d’onboarding et d’offboarding, on doit utiliser les commandes de bas niveau : useradd, usermod et userdel. Les utilitaires interactifs comme adduser sont généralement des scripts basés sur ces commandes.

Commençons par supprimer le compte de l’utilisatrice Ada Lovelace. Supprimer un compte consiste à :

  • supprimer les entrée relative à ce compte dans les fichier /etc/passwd et /etc/shadow,
  • supprimer les entrées relatives au groupe principal de même nom (s’il existe) dans les fichier /etc/group et /etc/gshadow,
  • et enfin, supprimer le répertoire personnel.

La commande userdel permet d’effectuer toutes ces opérations en une seule fois. Par défaut, elle ne supprime que les entrées relatives au compte et au groupe principal dans les différents fichiers, mais conserve le répertoire personnel. Pour supprimer le répertoire personnel d’un compte avec cette commande, on peut utiliser l’option -r.

Lancez la commande ci-dessous pour supprimer le compte lovelacea ainsi que son répertoire personnel.

1
sudo userdel -r lovelacea

La commande renvoie un message d’information dans la sortie d’erreur standard (stderr) pour nous informer qu’elle n’a pas trouvé le mail spool du compte lovelacea. Ce message est informatif et peut être ignoré.

Assurez-vous que les entrées relatives à ce compte ont effectivement été supprimées dans les différents fichiers (/etc/passwd, /etc/group, etc.), et que c’est également le cas pour le répertoire personnel du compte (/home/lovelacea).

Lorsque c’est fait, nous pouvons créer un nouveau compte pour Ada Lovelace, cette fois en utilisant la commande useradd. Lancez la commande suivante pour créer le compte et le groupe principal du même nom, définir le champ Full Name et créer le répertoire personnel :

1
sudo useradd -c "Augusta Ada Lovelace,,," -m -s /bin/bash alovelace

Comme prévu, la commande s’exécute sans rien demander. L’option -c permet de spécifier le champ gecos (gecos field). L’option -m indique que la commande doit créer le répertoire personnel (attention : l’option -M indique que la commande ne doit pas créer le répertoire personnel). Enfin l’option -s permet de spécifier le shell par défaut.

Attention : Si l’on ne spécifie pas le shell avec l’option -s, le shell par défaut est généralement /bin/sh et non /bin/bash. Le shell /bin/sh est le shell par défaut du système d’exploitation. Cela peut être Bash (par exemple sous macOS), mais ce n’est pas nécessairement le cas. Sous Debian et Ubuntu, le shell par défaut du system est Dash (Debian Almquist shell). N’hésiter à expérimenter !

Assurez-vous que les enregistrement correspondant au compte lovelacea ont bien été créé dans les différents fichiers et que le répertoire personnel a bien été créé. Avant de poursuivre, attardons-nous sur l’entrée du compte dans le fichier /etc/shadow.

1
lovelacea:!:19855:0:99999:7:::

On remarque qu’il n’y a pas d’empreinte de mot de passe, et qu’à la place, il y a un point d’exclamation (!). Ce point d’exclamation indique au système que le compte est verrouillé (locked). Tant qu’il est verrouillé, l’authentification par mot de passe est impossible, même s’il reste possible d’ouvrir une session pour ce compte par d’autres moyens (commande sudo, ssh avec une clé publique, etc.).

Pour déverrouiller le compte, nous devons définir un mot de passe. C’est précisément ce que nous permet de faire l’option -p de la commande usermod. Toutefois, elle exige un mot de passe chiffré (encrypted password). Il nous faut donc un moyen de chiffrer notre mot de passe initial.

Il en existe plusieurs et l’un d’entre eux est d’utiliser la commande mkpasswd (make password) que nous avons justement sur notre système. Lancez la commande ci-dessous pour chiffrer le mot de passe epai123.

1
mkpasswd -m yescrypt 'epai123'

La commande devrait produire un résultat semblable au contenu de la figure ci-dessous, mais pas exactement le même, car le mot de passe est chiffré avec un sel généré aléatoirement.

1
$y$jFT$NAY/SN15T/v7N4C9T11ba.$UkRluCftR7uwMaiDLdDlOh0rDNaqp7F6NFIIZf3igv/

Pour définir le mot de passe du compte lovelacea, nous pouvons supprimer le compte avec userdel et le recréer avec useradd en spécifiant l’option -p. Toutefois, une meilleure option est de modifier le compte avec la commande usermod. Cette commande dispose également de l’option -p pour modifier le mot de passe du compte. Pour cela, lancez la commande suivante :

1
sudo usermod -p '$y$jFT$NAY/SN15T/v7N4C9T11ba.$UkRluCftR7uwMaiDLdDlOh0rDNaqp7F6NFIIZf3igv/' lovelacea

Commençons par nous assurer que le compte a maintenant un mot de passe. Pour cela, affichez le contenu du fichier /etc/shadow et vérifier que dans l’entrée du compte, le point d’exclamation a bien été remplacé par le mot de passe chiffré que vous avez passé avec l’option -p.

Assurons-nous ensuite que le mot de passe a correctement été défini. Pour cela, lancez la commande suivante et lorsque vous y êtes invité, saisissez le nom du compte lovelacea et le mot de passe epai123.

1
sudo login

La commande login permet d’ouvrir une nouvelle session interactive. Si fonctionne correctement, vous devriez voir apparaître le message de bienvenu de Ubuntu et l’invite de commande (prompt) avec le nom de compte lovelacea. Si c’est bien le cas, vous pouvez terminer la session avec la commande exit.

Pour créer ou modifier le mot de passe d’un compte de manière non interactive, nous devons passer le résultat de la commande mkpasswd à la commande useradd ou usermod. Pour cela, on utilise la substitution de commande. Lancer la commande suivante pour modifier le mot de passe du compte lovelacea.

1
sudo usermod -p $(mkpasswd -m yescrypt 'Epai123') lovelacea

Vérifiez que le mot de passe a bien été modifié en ouvrant une session avec la commande login et si la session peut être ouverte, mettez-y fin avec la commande exit. Supprimez le compte lovelacea en vous assurant qu’il n’en reste rien.

À vous de jouer

Avant de poursuivre, créez les comptes suivants avec epai123 comme mot de passe initial :

  • alovelace (Augusta Ada Lovelace)
  • ghopper (Grace Hopper)
  • mhamilton (Margareth Hamilton)
  • rperlman (Radia Perlman)
  • skare (Susan Kare)

Vous devez maintenant vérifier que ces comptes ont bien été créés et que le mot de passe initial est correct. Expliquez, en quelques mots, la manière dont vous faites cela.

Créer et supprimer des groupes

Les commandes groupadd et groupdel permettent de créer et de supprimer des groupes d’utilisateur·rice·s.

Commençons par créer un groupe. Lancez la commande suivante pour créer le groupe developers

1
sudo groupadd developers

On peut vérifier que le groupe a bien été créé en affichant les dernières lignes du fichier /etc/group avec la commande suivante :

1
tail -n 4 /etc/group

La commande devrait produire un résltat semblable au contenu de la figure ci-dessous.

1
2
3
4
mysql:x:119:
ansible:x:1001:
alovelace:x:1002:
developers:x:1003:

Un groupe peut être supprimé avec la commande groupdel, à condition que s’il ne soit pas le groupe principal d’aucun compte. Lancez la commande suivante pour supprimer le groupe developers.

1
sudo groupdel developers

Affichez une nouvelle fois le contenu du fichier /etc/group et assurez-vous que le groupe developers ne s’y trouve plus.

Voyons maintenant ce qu’il se passe si l’on essaie de supprimer un groupe et que celui-ci est le groupe principal d’un utilisateur. Pour cela, essayez de supprimer le groupe alovelace avec la commande suivante :

1
sudo groupdel alovelace

La commande produit le résultat ci-dessous qui vous informe que le groupe principal du compte alovelace ne peut pas être supprimé.

1
groupdel: cannot remove the primary group of user 'alovelace'

Affichez une fois encore le contenu du fichier /etc/group et assurez-vous que le groupe alovelace s’y trouve toujours et n’a effectivement pas été supprimé.

À vous de jouer

Avant de poursuivre, utilisez la commande groupadd pour créer les quatre groupes suivants :

  • design
  • development
  • network
  • management

Assurez-vous que les groupes ont bien été créés dans le fichier /etc/group. Expliquez en quelques mots la manière dont vous vous y prenez.

Gérer les groupes d’un compte d’utilisateur·rice

Ajoutons maintenant le compte alovelace dans le groupe development. Pour cela, lancez la commande suivante :

1
sudo usermod -aG development alovelace

L’option -a indiquent que le ou les noms des groupes spécifiés après l’option -G sont ajoutés à la liste des groupes secondaires du compte. Si l’on utilise l’option -G sans l’option -a, la liste des groupes secondaires du compte est remplacée par la liste des noms de groupes spécifiés après l’option -G.

Voyons cela avec un exemple. Commençons par afficher les groupes auxquels appartient le compte alovelace. Pour cela, lancez la commande suivante :

1
sudo groups alovelace

La commande devrait afficher le résultat suivant :

1
alovelace : alovelace development

Le nom qui apparait avant les deux-points est le nom du compte (ici alovelace). Après les deux-points, on trouve une liste de noms de groupes. Le premier (alovelace) est celui du groupe principal du compte. Les noms suivants sont ceux des groupes secondaires auxquels il appartient.

Voyons d’abord ce qui se passe si l’on utilise un nouvelle fois l’option -G avec l’option -a. Lancez la commande ci-dessous pour ajouter les groupes design et network à la liste des groupes du compte alovelace, puis affichez cette liste avec la commande groups comme précédemment.

1
sudo usermod -a -G "design,network" alovelace

La commande groups produit le résultat ci-dessous. Le groupe designers a bien été ajouté au groupes existents.

1
alovelace : alovelace development design network

Voyons maintenant l’effet de l’option -G sans l’option -a. Pour cela lancez la commande ci-après et affichez une nouvelle fois la liste des groupes du compte.

1
sudo usermod -G management alovelace

La commande groups produit le résultat ci-dessous. Cette fois, la liste des groupes qui suit l’option -G a bien remplacé la liste des groupes du compte.

1
alovelace : alovelace management

On remarque que dans tous les cas, le compte principal reste inchangé. Lancez la commande suivante pour remplacer le groupe principal du compte alovelace par le groupe development :

1
sudo usermod -g development alovelace

La commande groups devrait produire le résultat ci-dessous. La liste des groupe secondaire est restée inchangée, mais le groupe principal est maintenant development :

1
alovelace : development management

Remarque : la commande useradd dispose également des option -G et -g qui permettent de spécifier le groupe principal et la liste des groupes secondaires du compte lors de sa création.

À vous de jouer

Changer le groupe principal du compte alovelace par le groupe alovelace à revenir dans l’état précédent.

Avant de poursuivre, assurez-vous que le compte est bien resté membre du groupe management et que son groupe principal est alovelace.

Gérer les membres d’un groupe

Les commandes useradd et usermod permettent de définir le ou les groupes secondaires (supplemental group) auxquels un compte appartient, et ce sont les seules commandes permettant de définir le groupe principal (primary group). Toutefois, pour gérer les membres d’un groupe, la commande gpasswd offre plus de souplesse.

L’option -a (add) et -d (delete) permet d’ajouter, respectivement, de retirer un compte d’un groupe. Pour en observer l’effet, utiliser la commande gourps pour afficher la liste des groupes des comptes ghopper et alovelace, lancez les commandes ci-dessous, et afficher une nouvelle fois la liste des groupes.

1
2
3
4
5
# Ajoute le compte ghopper au groupe development
sudo gpasswd -a ghopper development

# Retirer le compte alovelace du group management
sudo gpasswd -d alovelace management

La commande gpasswd permet également de déléguer l’administration du groupe à un·e utilisateur·rice. Pour cela, on utilise la commande avec l’option -A (Admin) suivi du nom d’un compte. Lancez la commande suivante pour déléguer l’administration du groupe development au compte admin.

1
sudo gpasswd -A admin development

Vous pouvez maintenant utiliser votre compte admin pour ajouter et retirer des membre du group development sans utiliser la commande sudo. Pour vous en convaincre, utilisez la commande gpasswd avec l’option -a pour ajouter les comptes suivants dans ce groupe : ghopper, mhamilton, rperlman, skare, en plus de alovelace qui s’y trouve déjà.

Affichez le contenu du fichier /etc/group pour vous assurer que la liste des membres du groupe comprend ces quatre comptes en plus du compte alovelace.

La commande gpasswd permet également de définir la liste des membres d’un groupe en utilisant l’option -M. Cette commande remplace la liste des membres du groupe dans le fichier /etc/group. Par exemple, lancez la commande ci-dessous pour définir que seuls les comptes alovelace, ghopper, et mhamilton font partie du groupe development.

1
sudo gpasswd -M "alovelace,ghopper,mhamilton" development

Affichez le contenu du fichier /etc/group pour vous assurer que la liste des membres du groupe development ne contient plus ni le compte de Radia Perlman ni celui de Susan Kare.

À vous de jouer

Lorsque c’est fait, utilisez la commande gpasswd d’une manière ou d’une autre pour configurer les groupes de la manière suivante :

  • development : alovelace, ghopper, mhamilton
  • design : skare
  • network : rperlman
  • management : ghopper, mhamilton

Avant de poursuivre, affichez le contenu du fichier /etc/group et/ou la commande groups pour vous assurer que votre configuration est conforme.

Créer une structure de répertoire

Maintenant que nous avons des comptes d’utilisateur·rice et des groupes, nous pouvons aborder la gestion des permission. Mais avant cela, nous avons besoin d’une structure de répertoire sur laquelle travailler.

Pour créer cette structure, assurez-vous d’être connecté à votre serveur avec le compte admin, puis lancez les commandes ci-après pour créer une structure de répertoire ainsi que quelques fichiers dans le répertoire personnel du compte. Veuillez noter que l’on effectue ces opérations sans la commande sudo.

1
2
3
4
mkdir -v -p \
    ~/projects/m294/hangman-frontend \
    ~/projects/m295/hangman-backend \
    ~/projects/m320/hangman-oo

La commande mkdir permet de créer un ou plusieurs répertoires dont le chemin est passé en paramètre. L’option -p indique à la commande qu’elle doit créer les répertoires parents s’ils n’existent pas déjà. Sans l’option -p la commande échoue si les répertoires projects, m294, m295 et m320 n’ont pas été préalablement créés. Enfin, l’option -v indique à la commande qu’elle doit afficher un message d’information pour chaque répertoire créé. Dans notre cas, elle devrait produire la sortie suivante :

1
2
3
4
5
6
7
mkdir: created directory '/home/admin/projects'
mkdir: created directory '/home/admin/projects/m294'
mkdir: created directory '/home/admin/projects/m294/hangman-frontend'
mkdir: created directory '/home/admin/projects/m295'
mkdir: created directory '/home/admin/projects/m295/hangman-backend'
mkdir: created directory '/home/admin/projects/m320'
mkdir: created directory '/home/admin/projects/m320/hangman-oo'

Lancez ensuite les commandes suivantes pour créer des fichiers :

1
2
3
4
5
6
touch \
    ~/projects/m294/hangman-frontend/README.md \
    ~/projects/m295/hangman-backend/README.md \
    ~/projects/m320/hangman-oo/README.md \
    ~/projects/m295/hangman-backend/create_database \
    ~/projects/m320/hangman-oo/hangman

La commande touch permet de mettre à jour les différentes dates associées à un fichier (création, accès, modifcation, etc.). Par défaut, elle met à jour la date d’accès si le fichier existe, et crée un fichier vide si ce n’est pas le cas.

On peut utiliser la commande ls avec l’option -R pour afficher cette structure de répertoire de manière récursive, et l’option -l pour afficher le nom du compte propriétaire, celui du groupe propriétaire et les permissions.

1
ls -R -l ~/projects

La commande devrait produire la sortie suivante :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/home/admin/projects:
total 12
drwxrwxr-x 3 admin admin 4096 mai   13 16:15 m294
drwxrwxr-x 3 admin admin 4096 mai   13 16:15 m295
drwxrwxr-x 3 admin admin 4096 mai   13 16:15 m320

/home/admin/projects/m294:
total 4
drwxrwxr-x 2 admin admin 4096 mai   13 16:18 hangman-frontend

/home/admin/projects/m294/hangman-frontend:
total 0
-rw-rw-r-- 1 admin admin 0 mai   13 16:18 README.md

/home/admin/projects/m295:
total 4
drwxrwxr-x 2 admin admin 4096 mai   13 16:18 hangman-backend

/home/admin/projects/m295/hangman-backend:
total 0
-rw-rw-r-- 1 admin admin 0 mai   13 16:18 create_database
-rw-rw-r-- 1 admin admin 0 mai   13 16:18 README.md

/home/admin/projects/m320:
total 4
drwxrwxr-x 2 admin admin 4096 mai   13 16:18 hangman-oo

/home/admin/projects/m320/hangman-oo:
total 0
-rw-rw-r-- 1 admin admin 0 mai   13 16:18 hangman
-rw-rw-r-- 1 admin admin 0 mai   13 16:18 README.md

Nous aurons encore besoin de répertoire pour stocker les données partagées entre les membres de nos différents groupe. Pour cela lancez la commande suivante pour créer ces répertoire dans le répertoire /home

Changer d’utilisateur

Dans la suite de notre activité, nous allons devoir effectuer des tâches en utilisant différents comptes.

Pour faire cela, une première possibilité est d’ouvrir plusieurs sessions ssh simultanées. Une autre possibilité est d’utiliser la commande sudo.

Nous avons déjà utiliser la commande root pour exécuter une commande en tant que root. Toutefois, avec l’option -u, il est possible d’exécuter une commande en tant que n’importe quel·le utilisateur·rice. L’option -i, quant à elle, permet d’ouvrir une session interactive avec le compte root, ou le compte spécifiée avec l’option -u.

Exécuter une commande en tant que root

Intéressons-nous d’abord à l’option -u. Pour cela, commencez par lancer la commande ci-dessous :

1
ls -al /home/alovelace

Comme vous vous êtes connecté en tant qu’admin (un compte sans privilège particulier), vous n’avez pas la permission de lister le contenu du répertoire personnel d’un autre compte. La commande vous en informe avec le message suivant :

1
ls: cannot open directory '/home/alovelace': Permission denied

Lancez maintenant la même commande avec la commande sudo :

1
sudo ls -al /home/alovelace

Cette fois, la commande s’exécute évidemment avec succès, puisque vous l’exécutez en tant que root et que vous avez donc tous les privilèges de ce compte.

Exécuter une commande en tant qu’un·e autre utilisateur·rice

Utiliser les privilège du compte root lorsque cela n’est pas nécessaire est contraire au principe de moindre privilège (least privilege) — un principe essentiel en matière de sécurité — qui nous enjoins à travailler avec le moins de privilège que possible.

Or pour lister le contenu du répertoire personnel du compte alovelace, il nous suffit d’avoir les privilèges de ce compte. L’option -u nous permet précisément de faire cela. Lancez la commande pour exécuter la commande en tant que alovelace :

1
sudo -u alovelace ls -al /home/alovelace

Assurons-nous que cette commande ne nous donne effectivement que les privilège de alovelace. Pour cela, lancez la commande suivante :

1
sudo -u alovelace ls -al /home/admin

La commande nous informe que nous n’avons pas la permission d’ouvrir le répertoire /home/admin, ce qui est correcte puisque alovelace est un compte sans privilège et qu’il n’a donc pas la permission de lister le contenu du répertoire personnel d’un autre utilisateur.

Ouvrir une session interactive en tant qu’un·e autre utilisateur·rice

Voyons à présent l’option -i de la commande sudo. Utilisée conjointement avec l’option -u, cette option permet d’ouvrir une session interactive en tant que n’importe quel autre compte.

Par exemple, lancez la commande suivante pour ouvrir une session interactive pour le compte alovelace :

1
sudo -u alovelace -i

Le nom de l’utilisateur dans l’invite de commande devrait avoir changé et être passé de admin à alovelace. Vous pouvez maintenant travailler exactement comme si vous vous étiez connecté en ssh avec le compte alovelace.

Avant de poursuivre, assurez-vous que la session est bien ouverte pour le compte alovelace en lançant les commandes whoami et pwd pour obtenir le nom du compte avec lequel vous travaillez, et le chemin du répertoire du travail, puis utilisez la commande exit pour interrompre cette session et revenir à votre session admin.

Gérer les permissions

Gérer les permission d’un fichier

Comme nous l’avons vu, dans le contexte des autorisations sous Linux, on distingue trois catégories de sujets (personnes, utilisateur·rice·s) :

  • Propriétaire (owner)
  • Membres du groupe propriétaire (owner group)
  • Tous les autres (other)

Définir les droits d’accès pour une ressource (p. ex. un fichier ou un répertoire) consiste à indiquer quelles sont les permissions (lecture, écriture, exécution/accès ou r, w, x) pour chacune de ces catégories.

Lorsqu’un sujet effectue une demande d’accès à cette ressource, le système applique les permissions les plus spécifiques :

  • Si le sujet est propriétaire de la ressource, le système applique les permissions de la catégorie « propriétaire » et ignore toutes autre.
  • Si le sujet appartient au groupe propriétaire et qu’il n’est pas propriétaire, alors le système applique les permissions de la catégorie « membre du groupe propriétaire » et ignore toutes les autres.
  • Si le sujet n’est ni propriétaire ni membre du groupe propriétaire, le système applique les permissions de la catégorie « autre » et ignore toutes les autres permissions.

Du point de vue des permissions, un sujet ne peut appartenir qu’à une seule des trois catégories. Voyons cela à l’aide d’exemples.

Permissions du compte propriétaire

Pour commencer, modifions les permissions du fichier ~/projects/m320/hangman-oo/README.md avec la commande chmod. Le compte propriétaire doit avoir toutes les permissions, les membres du groupe propriétaire et les autres, aucune : rwx------ ou 700 en notation octale (voir encadré). Pour cela, lancez la commande suivante :

1
chmod 700 ~/projects/m295/hangman-backend/create_database

Assurons-nous que la commande a bien fonctionné en affichant les permissions du fichier à l’aide de la commande ls avec l’option -l.

1
ls -l ~/projects/m295/hangman-backend/create_database

La commande devrait produire la sortie suivante :

1
-rwx------ 1 admin admin 0 mai   13 23:28 /home/ admin/projects/m320/hangman-oo/README.md

Comme le compte admin est propriétaire du fichier, nous devrions effectivement avoir tous droits. Assurons-nous que c’est bien le cas. Pour cela, commençons par essayer d’écrire (w) quelque chose dans le fichier en lançant la commande suivante :

1
2
3
4
cat << EOF > ~/projects/m295/hangman-backend/create_database
#! /bin/bash
echo "Bonjour tout le monde"
EOF

Si la commande s’est exécutée sans erreur, nous avons effectivement le droit d’écrire dans ce fichier. Essayons maintenant de lire (r) son contenu. Pour cela, lancez la commande suivante :

1
cat ~/projects/m295/hangman-backend/create_database

Vous devriez voir apparaître le texte ci-dessous, ce qui indique que nous avons effectivement le droit de lire dans ce fichier. (Notez qu’au passage, vous avez appris comment à écrire un texte de plusieurs lignes dans un fichier avec la commande cat et un heredoc en Bash.)

1
2
#! /bin/bash
echo "Bonjour tout le monde"

Comme nous reconnaisson le shebang d’un script Bash sur la première ligne de ce fichier, nous pouvons nous également nous assurer que nous avons le droit de l’exécuter en lançant la commande ci-après.

1
~/projects/m295/hangman-backend/create_database

La commande devrait produire la sortie suivante :

1
Bonjour tout le monde

Permissions du groupe propriétaire

Maintenant que nous avons pu constater que le compte propriétaire dispose effectivement des droits que nous lui avons accordé, voyons ce qui se passe si l’on accorde cette fois ces droits uniquement au groupe propriétaire (---rwx--- ou 070). Pour cela, lancez la commande suivante :

1
chmod 070 ~/projects/m295/hangman-backend/create_database

Assurons que les permissions ont bien été définie avec la commande ls comme précédemment.

1
ls -l ~/projects/m295/hangman-backend/create_database
1
----rwx--- 1  admin  admin 0 mai   13 23:28 /home/ admin/projects/m295/hangman-backend/create_database

Si l’on essaye d’accéder à ce fichier d’une manière ou d’une autre avec le compte admin, le système nous informe invariablement que nous n’y sommes pas autorisé·e·s, quand bien même le compte admin appartient au groupe admin et que ce groupe à tous les droits. Nous voyons ici que si le compte est le compte propriétaire, les permissions des autres catégories sont ignorées.

Pour vous en convaincre, essayez d’afficher le contenu du fichier avec la commande cat, de l’exécuter ou même de le modifier avec un éditeur de texte.

Voyons maintenant ce qui se passe si nous tentons d’y accéder avec un compte membre du groupe propriétaire. Pour cela, ajoutons le compte alovelace dans le groupe admin, comme nous avons déjà appris à le faire :

1
sudo gpasswd -a alovelace admin

Assurons-vous que le compte alovelace appartient bien au groupe admin avec la commande groups.

1
sudo groups alovelace
1
alovelace : alovelace admin

Lancez maintenant la commande ci-dessous pour lire le contenu du fichier en tant que alovelace.

1
sudo -u alovelace cat /home/admin/projects/m295/hangman-backend/create_database
1
2
#! /bin/bash
echo "Bonjour tout le monde"

Si nous retirons le compte alovelace du goupe admin et que nous tentons d’exécuter à nouveau la commande précédente, le système nous informe que nous n’en avons pas l’autorisation.

Avant de poursuivre, modidifiez les permission du fichier pour donner, cette fois, tous les droits aux « autres » et aucun droits au compte pripriétaire et aucun droit aux membres du groupe propriétaire (*------rwx ou 007), puis lancez une nouvelle fois la commande précédente pour tenter d’afficher le contenu du fichier. Que se passe-t-il ?

Gérer les permissions des répertoires

Si votre système est correctement configuré, le système ne permet pas au compte alovelace de lire le contenu du fichier /home/admin/projects/m295/hangman-backend/create_database. Pourtant, les permissions du fichier indiquent que les comptes appartenant à la catégorie « autres » (ni propriétaire ni membre du groupe propriétaire) disposent de tous les droits (rwx), et le compte alovelace appartient effectivement à cette catégorie. Pourquoi donc le système nous interdit-il l’accès à ce fichier ?

Pour comprendre ce qui se passe, nous devons nous intéresser à la signification de la permission x pour un répertoire.

Nous savons déjà que la permission x pour un fichier donne le droit d’exécuter ce fichier (pour autant bien sûr que ce fichier soit exécutable). Mais pour un répertoire, cette permission donne le droit d’y entrer :

  • soit pour lister son contenu des fichiers et des répertoires si l’on a le droit de lire r,
  • soit pour ajouter ou supprimer des fichiers si l’on a le droit d’écrire w,
  • soit pour le traverser (en fermant les yeux, en ne touchant à rien) afin de nous rendre dans un sous-répertoire si l’on n’a aucun autre droit.

Attardons-nous sur le dernier point. Pour cela, utilisez la commande chmod comme ci-dessous pour ôter (-) les permissions r et w et ajouter (+)a permission x au compte propriétaire, symbolisé par la lettre u comme user — le groupe propriétaire est symbolisé par un g comme group, et la catégorie « autres », par un *o comme other. Cette syntaxe permet de changer les permissions de l’une des trois catégories d’utilisateur·rice·s, sans toucher aux autres.

1
chmod u-rw+x ~/projects

Affichez les permissions du répertoire à l’aide de la commande ls avec l’ option -l que vous connaissez déjà, et l’option -d qui permet d’afficher le répertoire lui-même plutôt que son contenu, et assurez-vous que permissions du répertoire ~/projects sont bien --xrwxr-x (le d indique seulement qu’il s’agit d’un répertoire).

1
ls -l -d ~/projects
1
d--xrwxr-x 5 admin admin 4096 mai   13 16:15 projects 

Si nous tentons à présent de lister le contenu du répertoire avec la commande ci-après, le système nous informe que nous n’en avons pas la permission.

1
ls -l ~/projects
1
ls: cannot open directory '/home/admin/projects/': Permission denied

Nous obtenons le même effet, si nous tentons d’y ajouter un ficher avec la commande ci-dessous.

1
echo "coucou" > ~/projects/nouveau-fichier.txt
1
-bash: /home/admin/projects/nouveau-fichier.txt: Permission denied

En revanche, nous avons parfaitement le droit de lister le contenu du répertoire ~/projects/m295, puisque qu’en tant que compte propriétaire nous avons la permission de lecture sur ce répertoire, et que nous avons le droit de traverser le répertoire ~projects.

1
ls -l ~/projects/m295
1
drwxrwxr-x 2 admin admin 4096 mai   13 16:18 hangman-backend

En puisque nous disposons également de la permission d’écriture sur le répertoire ~/projects/m295, nous pouvons même y ajouter un fichier ou un répertoire.

1
2
echo "Salut c't'équipe" > ~/projects/m295/nouveau-fichier.txt
cat ~/projects/m295/nouveau-fichier.txt
1
Salut c't'équipe

À vous de jouer

Avant de poursuivre, attribuez les permission rwxrwxr-x au répertoire ~/projets et assurez-vous que votre commande à bien eu l’effet escompté.

Revenons maintenant au problème qui nous a conduit ici : pourquoi le compte alovelace qui appartient à la catégorie « autres », n’a-t-il pas la permission d’accéder au fichier /home/admin/projects/m295/hangman-backend/create_database, alors que les permission de ce fichier sont ------rwx ?

Pour comprendre d’où vien le problème, lancez la commande ci-dessous pour afficher les répertoires personnels des comptes de votre machine.

1
sudo ls -l /home

Que remarquez-vous ? Que doit-on faire pour permettre au compte alovelace d’afficher le contenu du fichier /home/admin/projects/m295/hangman-backend/create_database ?

Utiliser des répertoire partagés

Dans un système multi-utilisateur, il peut être utile de disposer de répertoires partagés. Ils facilitent non seulement le travail collaboratif, mais permettent également de centraliser les données importantes pour en simplifier la gestion. Cette centralisation aide notamment à l’application de politiques de sécurité adéquates, à l’optimisation des ressources de stockage, à un suivi et un audit efficaces, ainsi qu’à la sauvegarde régulière de ces données.

Il n’est pas évident de savoir où créer des répertoires partagés sous Linux. On peut penser au répertoire /var, mais il est en principe réservé aux données des fichiers sous le contrôle des différents services du système. Pour stocker des documents produits par les utilisateur·rice·s du système, le répertoire /home est une bien meilleure option.

Commençons par créer un répertoire pour les membres du group development. Pour cela, utiliser la commande mkdir pour créer le répertoire /home/development, puis affichez les permission de ce répertoire avec la commande ls -ld.

Vous devriez obtenir le résultat suivant :

1
drwxr-xr-x 2 root root 4096 mai   15 09:22 /home/development

Modifiez les permissions du répertoire de manière à produire le résultat suivant :

1
drwxrwx--- 2 root root 4096 mai   15 09:22 /home/development

À vous de jouer

Avant de poursuivre, procédez de la même manière pour créez les répertoire design, network, et management.

Changer le propriétaire d’un fichier ou d’un répertoire

Dans cette configuration, seuls le compte root et les membres du groupe root ont accès à ces répertoires. Voyons comment en donner l’accès à tous les membres du groupe development.

Comme nous l’avons vu, les permissions POSIX d’un fichier ou d’un répertoire sont associées non pas à des comptes ou des groupes particuliers, mais à des catégories de comptes : compte propriétaire, membre du groupe propriétaire, autre. Et comme nous l’avons également vu, ces permissions sont des métadonnées du fichier ou du répertoire dont la structure exacte est définie par le système de fichier. Elles ne sont pas parties du fichier ou du répertoire, mais y sont attachées et stockées dans le même dispositif de stockage (disque, SSD, etc.).

Les permissions accordées au compte propriétaire s’appliquent à tout compte qui en devient le propriétaire, quel qu’il soit. Il en va de même pour les permissions accordées aux membres du groupe propriétaire, quel que soit le groupe. Il est donc possible de modifier le compte ou le groupe propriétaire indépendamment des permissions accordées aux catégories de compte « compte propriétaire » et « membre du groupe propriétaire ». La commande chown (change owner) et chg permet précisément de faire cela.

Modifions le groupe propriétaire du répertoire development de manière à permettre aux membres du groupe development d’y accéder. Pour cela, lancez la commande suivante :

1
sudo chgrp development /home/development
1
drwxrwx--- 2 root development 4096 mai   15 12:39 development

Modifions encore le groupe propriétaire du répertoire management, mais cette fois en utilisant la commande chown. Cette commande permet de changer le compte propriétaire, le groupe propriétaire, ou les deux à la fois.

La commande ci-dessous change le compte propriétaire (root) par le compte admin. Utilisez la commande ls -l -d /home/management pour visualiser l’effet.

1
sudo chown admin /home/management
1
drwxrwx--- 2 admin root 4096 mai   15 14:06 /home/management

La commande ci-dessous change le groupe propriétaire (root) par le groupe design.

1
sudo chown :design /home/management
1
drwxrwx--- 2 admin design 4096 mai   15 14:06 /home/management

Enfin, la commande ci-dessous change à la fois le compte propriétaire et le groupe propriétaire, par le compte root et le groupe management.

1
sudo chown root:management /home/management
1
drwxrwx--- 2 root management 4096 mai   15 14:06 /home/management

Le compte propriétaire et le groupe propriétaire sont des métadonnées attachées au fichier, au même titre que les permissions. Dans ces métadonnées, le compte et le groupe propriétaire ne sont pas référencés par leur nom, mais par leur identifiant numérique : le UID (User ID) pour un compte et le GID (Group ID) pour un groupe. De cette manière, le système d’autorisation ne dépend pas de la manière dont les comptes et les groupes sont stockés dans le système, et même d’une instance particulière du système d’exploitation, pour appliquer les permissions. Ces identifiants numériques (UID et GID) correspondent à la manière dont les utilisateur·rice·s et les groupes sont identifiés dans les processus.

Pour afficher les identifiants numériques du propriétaire et du groupe propriétaire, on peut utiliser la commande ls avec l’option -n (les UID et GID de votre système ne sont peut-être pas identiques).

1
ls -nl /home
1
2
3
4
5
drwxr-x--- 5 1000 1000 4096 mai   14 09:58 admin
drwxr-x--- 2 1003 1006 4096 mai   12 23:13 alovelace
drwxr-x--- 5 1001 1001 4096 mai   14 08:34 ansible
drwxrwx--- 2    0 1007 4096 mai   15 12:39 development
...

En outre, la commande stat permet d’afficher l’ensemble des métadonnées d’un fichier ou d’un répertoire. Par exemple, pour voir les métadonnées du répertoire /home/development, lancez la commande suivante :

1
stat /home/development
1
2
3
4
5
6
7
8
  File: /home/development/
  Size: 4096      	Blocks: 8          IO Block: 4096   directory
Device: fd00h/64768d	Inode: 393350      Links: 3
Access: (2770/drwxrws---)  Uid: (    0/    root)   Gid: ( 1007/development)
Access: 2024-05-15 19:13:56.930814697 +0200
Modify: 2024-05-15 19:13:54.050796475 +0200
Change: 2024-05-15 19:13:54.050796475 +0200
 Birth: 2024-05-15 09:22:54.385342377 +0200

C’est un peu comme une étiquette que le système de fichier (ici ext4) maintient pour chaque fichier. On peut remarquer qu’il y a quatre dates. La première indique le dernier accès au fichier, la deuxième, la dernière fois qu’il a été modifié, la troisième indique le dernier changement de l’étiquette elle-même, enfin la dernière est la date de création. Les informations contenues dans une étiquette peuvent varier d’un système de fichier à l’autre.

Remarque : Un·e utilisateur·rice sans privilèges root ne peut utiliser la commande chgrp chown que sur un fichier dont il ou elle est propriétaire, et uniquement pour changer le groupe propriétaire par un groupe dont il ou elle est membre. Il est nécessaire d’avoir les privilèges root pour changer le propriétaire d’un fichier. En revanche, si un·e utilisateur·rice fait une copie d’un fichier, son compte devient le compte propriétaire de la copie.

À vous de jouer

Avant de poursuivre, assurez-vous que :

  • Les membres du groupe development ont accès au répertoire /home/development et pas au repertoire /home/management.
  • Les membres du groupe management ont accès au répertoire /home/management et pas au repertoire /home/development.
  • Les membres des groupe development et management ont effectivement un accès en lecture et en écriture à leur répertoire respectif.

Pour effectuer ces vérifications, ouvrez des sessions interactives pour ces utilisateurs (par exemple, avec l’option -i de la commande sudo), ou lancez des commandes en prenant l’identité de l’un ou l’autre de ces comptes. Pour vérifier le droit d’accès en écriture, créez, modifiez et supprimez un fichier avec chaque compte.

Si quelque chose ne fonctionne pas correctement, revenez en arrière et assurez-vous que vos comptes et vos groupes sont bien configurés.

Enfin, lorsque tout fonctionne, créez un fichier dans le répertoire développement avec le compte alovelace, puis essayez de le modifier ou de le supprimer avec le compte ghopper. Que remarquez-vous ? Comment pouvez résoudre ce problème ?

Changer le propriétaire d’un fichier ou d’un répertoire

Lorsqu’une utilisatrice membre du groupe development crée un fichier dans le répertoire partagé, le compte et le groupe propriétaire de ce fichier sont son compte et son groupe principal. Par exemple, si alovelace créez un fichier, le compte et le groupe propriétaire sont alovelace et alovelace. Les autres membres du groupe development n’y ont pas accès en écriture et n’y ont accès en lecture que parce qu’ils ou elles entrent dans la catégorie « autres ».

Il existe plusieurs manières de résoudre ce problème. La première, qui n’est certainement pas la plus pratique, consiste à demander aux membres du groupe de changer manuellement le groupe propriétaire des fichiers qu’il ou elle crée, à l’aide de la commande chgrp.

Une deuxième solution consiste à changer provisoirement le groupe principal de son compte avec la commande newgrp suivie de n’importe quel groupe auquel appartient le compte. Pour cela, ouvrez une session interactive avec le compte alovelace et lancez la commande suivante :

1
newgrp development

Après l’exécution de cette commande, le groupe development devient le groupe propriétaire de tous les fichiers et répertoires créés avec ce compte, jusqu’à la fin de la session. Bien que cette méthode soit plus pratique que le changement manuel du groupe propriétaire, il est préférable de mettre en place des politiques de sécurité qui ne requièrent pas la participation active des utilisateurs.

Enfin, une troisième solution, qui ne repose pas sur la participation des utilisateurs, consiste à utiliser la permission spéciale SetGID sur le répertoire partagé. Lorsqu’elle est attribuée, cette permission assure que tous les fichiers et sous-répertoires créés à l’intérieur de ce répertoire héritent automatiquement du groupe propriétaire de celui-ci. Les sous-répertoires héritent également de la permission SetGID. Pour attribuer cette permission au répertoire development, terminez la session du compte alovelace (si nécessaire), et exécutez la commande suivante :

1
sudo chmod g+s /home/development

À vous de jouer

Avant de poursuivre, attribuez la permission SetGUI à tous les répertoire partagés et assurez-vous que cela fonctionne.

Ajuster les permissions par défaut

Sous Ubuntu 22.04, les permisions par défaut d’un nouveau fichier sont rw-rw-r-- (664), et celles d’un répertoire sont rwxrwxr-x (775). Cela correspond aux permission par défaut : rw-rw-rw (666) pour les fichiers et rwxrwxrwx (777) pour les répertoires, auxquels on retire les permissions spécifiées dans le umask. Par défaut la valeur du umask est -------w- (002).

Par défaut, les comptes d’utilisateur·rice·s de catégorie de compte « autre » ont la permission de lire tous les fichiers que nous créons. Cela ne signifie pas nécessairement qu’ils y ont accès, car tant que les documents se trouvent dans un répertoire personnel ou dans l’un des répertoires partagés que nous avons créés, ces comptes n’ont pas la permission d’entrer dans le répertoire ni de le traverser. Cette permission constitue pourtant un risque, car si un document est copié dans un répertoire public, alors celui-ci sera lisible par tous.

Pour résoudre ce problème, nous pouvons demander aux utilisateurs de modifier le umask à l’aide de la commande umask. Pour observer l’effet de cette commande, commencez par lancer la commande umask sans argument pour afficher le masque de votre session. Créez un nouveau fichier, notez ses permissions et modifiez le masque de votre session en lançant la commande suivante :

1
umask 0007

Affichez une nouvelle fois le masque de votre session avec la commande umask sans argument pour vous assurer que vous l’avez bien modifié. Créez un second fichier et notez ses permissions. Pour ce nouveau fichier, contrairement au fichier précédent, il ne devrait y avoir aucune permission pour la catégorie « autre ».

Encore une fois, lorsque c’est possible, il est préférable de ne pas avoir à demander la participation des utilisateur·rice·s pour appliquer une politique de sécurité. Heureusement, il existe différents moyens de modifier le umask de manière automatique. L’un d’entre eux consiste à modifier la valeur de l’attribut UMASK dans le fichier /etc/login.defs.

À vous de jouer

Utilisez un éditeur de texte (vi ou nano) pour ouvrir le fichier /etc/login.defs. Dans ce fichier, cherchez l’attribut UMASK. Sa valeur devrait être 022. Changez cette valeur en 027. Si vous voulez comprendre pourquoi 027 et pas 007, vous pouvez lire le commentaire au-dessus de l’attribut dans le fichier.

Lorsque c’est fait, ouvrez une nouvelle session pour l’un ou l’autre des comptes, créez un nouveau fichier et assurez-vous que les permissions sont correctes.

Conclusion

Lors de cette activité, vous avez appris à gérer les comptes d’utilisateur·rice et les groupes d’un système Linux. Vous avez notamment eu l’occasion de :

  • créer, modifier, et supprimer des comptes d’utilisateur·rice·s avec les commandes useradd, usermod et userdel,
  • chiffrer des mots de passe à l’aide de la commande mkpasswd,
  • créer, modifier, et supprimer des groupes avec les commandes groupadd, groupmod et groupdel,
  • gérer les membres d’un groupe avec la commande gpasswd.

Vous avez également pu étudier la structure de la base de données des utilisateurs et des groupes, et vous familiariser avec le contenu des fichiers qui la constituent : /etc/passwd, /etc/shadow, /etc/group et /etc/gshadow.

Vous avez également appris comment fonctionnent les permissions POSIX. Pour cela, vous avez été amené à lire et à modifier les permissions de fichier et de répertoire avec les commandes ls -l et chmod, ainsi qu’à lire et à modifier leur compte et leur groupe propriétaire à l’aide des commandes chgrp et chown. Et vous avez eu l’occasion d’utiliser la commande stat qui permet d’afficher les métadonnées d’un fichier ou d’un répertoire.

Enfin, vous avez pu automatiser l’application de politique de sécurité en utilisant notamment la permission spéciale SetUID sur un répertoire, et en modifiant le umask par défaut du système.

Il reste de nombreux aspects de l’authentification et des autorisations sous Linux à explorer, comme l’utilisation de modules PAM pour centraliser la gestion des comptes ou prendre en charge de l’authentification multifactorielle, l’implémentation des ACL POSIX pour des contrôles d’accès plus fins, ou encore le contrôle d’accès obligatoire (MAC) avec SELinux ou AppArmor. Certains de ces sujets seront abordés de manière plus ou moins formelle durant le reste de votre formation, à l’école ou en entreprise.