Fichier /etc/shadow : à quoi sert ce fichier sous Linux ?
Sommaire
I. Présentation
Dans ce tutoriel, je vous propose de découvrir le fichier /etc/shadow qui est présent sur les différentes distributions Linux, notamment Debian, Ubuntu, Kali Linux, Rocky Linux, etc.... Et j'en passe. Ce fichier indispensable au bon fonctionnement du système est associé à l'authentification, tout comme le fichier "/etc/passwd". Comme de nombreux fichiers sous Linux, il se présente sous la forme d'un fichier texte où chaque ligne contient différentes valeurs, en rapport avec les mots de passe des utilisateurs du système. Partons à la découverte de ce fichier très intéressant...
II. Fichier /etc/shadow : comment interpréter chaque ligne ?
Tout d'abord, il faut savoir que ce fichier a l'utilisateur "root" et le groupe "shadow" comme propriétaires et qu'il dispose des permissions "640". Sur votre système, vous pouvez vérifier que c'est bien le cas avec cette commande :
ls -l /etc/shadow
Ces droits montrent que c'est un fichier sensible. Dans ce fichier, vous allez retrouver une ligne par utilisateur, c'est-à-dire que chaque utilisateur du système aura le droit à une ligne dans ce fichier. En-tête de liste, nous retrouvons l'utilisateur "root" correspondant au super-utilisateur de ce système. À la suite, il y a quelques utilisateurs liés au système et ensuite viennent s'ajouter les comptes de vos utilisateurs et les comptes liés à certains paquets. Par exemple, nous pouvons avoir une ligne pour le compte "www-data" créé par Apache lors de l'installation de ce paquet, et une ligne pour l'utilisateur "flo" correspondant à mon utilisateur créé lors de l'installation du système. Quand un utilisateur est créé avec la commande "useradd" (ou "adduser"), une ligne est ajoutée dans ce fichier. Pour visualiser le contenu de ce fichier, vous devez être connecté en "root" ou bénéficier d'une délégation via sudo :
sudo cat /etc/shadow
Ensuite, pour chaque ligne, il y a un total de neuf champs, toujours dans le même ordre et chaque avec une signification particulière. Chaque champ est séparé par le symbole ":" afin de faciliter la lecture, et quand il y a deux ":" qui s'enchaînent, cela veut dire que la valeur est vide. On obtient l'écriture suivante :
<champ 1>:<champ 2>:<champ 3>:<champ 4>:<champ 5>:<champ 6>:<champ 7>:<champ 8>:<champ 9>
La dernière ligne ne termine pas par ":". C'est bien beau ces différentes valeurs, mais ça correspond à quoi ? Voici un résumé, dans l'ordre, du champ 1 au champ 9.
- Identifiant de l'utilisateur : il s'agit de l'identifiant du compte utilisateur, indiqué lors de la création. Autrement dit, c'est l'identifiant que vous utilisez pour vous connecter avec ce compte.
- Mot de passe chiffré : le mot de passe de ce compte utilisateur, chiffré avec un algorithme (plusieurs possibilités), en respectant le format "$type$salt$hash", c'est-à-dire un numéro correspondant à l'algorithme utilisé, les informations de salage et le hash du mot de passe. Ce champ peut aussi avoir un astérisque ou un point d'exclamation comme valeur, dans ce cas, l'authentification par mot de passe est refusée par ce compte (il doit utiliser une autre méthode).
- Nombre de jours depuis le dernier changement de mot de passe : il s'agit du nombre de jours écoulés depuis la dernière modification de mots de passe, en prenant comme date de référence le 1er janvier 1970. Si la valeur est à 0, cela veut dire que l'utilisateur devra changer son mot de passe lors de la prochaine connexion. Une valeur vide signifie que les fonctions de gestion de l'ancienneté du mot de passe sont désactivées.
- Âge minimum du mot de passe : combien de jours l'utilisateur doit-il garder son mot de passe avant de pouvoir le changer ? Si vous avez un "0", alors l'utilisateur peut le changer dès qu'il le souhaite.
- Âge maximum du mot de passe : combien de jours le mot de passe est-il valide ? Ensuite, l'utilisateur doit changer le mot de passe à la prochaine connexion. Par défaut, cette valeur est fixée à 99999, comme vous pourrez sûrement le constater.
- Avertissement : combien de jours avant que le mot de passe expire faut-il prévenir l'utilisateur qu'il va devoir changer son mot de passe ?
- Période d'inactivité : une fois le mot de passe expiré, combien de jours faut-il compter avant que le compte soit désactivé si le mot de passe n'est pas changé dans les temps ? Cette option est vide la plupart du temps.
- Date d'expiration : quand le compte a-t-il été désactivé ? Cette valeur est exprimée en nombre de jours, à partir du 1er janvier 1970.
- Pas encore utilisé : il n'y a pas de valeur après le dernier ":" car ce dernier n'est champ n'a pas d'utilité à ce jour, mais cela viendra peut-être...
III. Exemple d'un fichier /etc/shadow
Regardons dans la pratique, ce que peut donner un fichier /etc/shadow avec cet exemple sur une machine Debian :
Par exemple, voici la ligne de l'utilisateur "it-connect" :
it-connect:$y$j9T$NL8Y.................:18960:0:99999:7:::
Cette ligne me permet de savoir qu'il y a un utilisateur avec l'identifiant "it-connect", qu'il peut changer son mot de passe dès qu'il le souhaite (0), et qu'il peut garder un mot de passe pendant 99999 jours sans le changer. La période d'avertissement est configurée sur les 7 derniers jours avant que le mot de passe expire, et les autres valeurs sont vides.
Je sais aussi, en lisant cette ligne, que cela l'utilisateur a changé son mot de passe pour la dernière fois le lundi 29 novembre 2021. Comment ? Et bien, si l'on prend le 1er janvier 1970 comme référence et que l'on ajoute 18960 jours, on obtient cette date. On peut faire le calcul de différentes façons... Par exemple avec PowerShell :
$date = Get-Date -Year 1970 -Month 01 -Day 01 -Hour 00 -Minute 00
$date.AddDays(18960)
Il y aussi une autre manière de faire, via la commande "passwd" :
passwd -S it-connect
Désormais, si je modifie le mot de passe de cet utilisateur avec passwd :
passwd it-connect
Je peux voir ensuite que dans le fichier /etc/shadow, le nombre de jour est passé de 18960 à 19156, et le mot de passe chiffré est différent également. La valeur utilise toujours le 01/01/1970 comme point de référence.
it-connect:$y$j9T$zJHz.................:19156:0:99999:7:::
Cet exemple montre que l'on peut interagir avec le fichier "/etc/shadow" au travers de la commande passwd lorsque l'on change un mot de passe. Par ailleurs, lorsque l'on utilise la commande "chage" on va jouer sur les paramètres concernant l'âge du mot de passe. Tout cela pour dire que c'est déconseillé de modifier manuellement ce fichier, mais qu'il vaut mieux utiliser les différentes commandes adéquates.
Désormais, vous en savez plus sur le fichier /etc/shadow, un incontournable sur les machines Linux, que ce soit un serveur ou un poste de travail.
Le format du mot de passe ne serait-il pas plutôt « $type$salt$hash » ?
Exact, faute de frappe, merci 🙂
Tu aurais pas oublier un retour à la phrase « Ce champ peut aussi avoir un astérisque ou un point d’exclamation comme valeur, dans ce cas, l’authentification par mot de passe est refusée par ce compte (il doit utiliser une autre méthode). «
Historiquement, le fichier /etc/passwd contenait toutes les données de l’utilisateur, y compris le condensat du mot de passe, il n’y avait pas de fichier /etc/shadow.
Cependant, on a découvert qu’une attaque par dictionnaire pouvait être effectuée sur le fichier /etc/passwd, pour découvrir les mots de passe (s’ils figurent dans le dictionnaire).
Les concepteurs de SunOS 4, dans les années 1980, ont donc décidé de retirer les mots de passe de /etc/passwd. Le reste du fichier a été conservé, car il est utilisé par de nombreux programmes, par exemple ls, ident, finger. Les mots de passe ont été déplacés dans /etc/shadow, qui n’est désormais accessible que par le compte root.
Le fichier /etc/passwd comporte désormais un x dans le champ du mot de passe.
Le fichier /etc/shadow ne partage que le premier champ, celui qui fait office de clé et de nom d’utilisateur.
Les autres champs du fichier /etc/shadow servent à gérer le cycle de vie des mots de passe.
Merci pour l’article !