# Passwd

passwd est une commande disponible sur la plupart des systèmes d'exploitation Unix et de type Unix permettant à un utilisateur de changer son mot de passe. passwd est aussi le nom du fichier qui contenait les mots de passe sur ces mêmes systèmes.
Le nouveau mot de passe entré par l'utilisateur est traité par une fonction de dérivation de clé pour créer une version hachée du nouveau mot de passe. C'est cette version hachée qui est enregistrée par le serveur. Seule la version hachée est conservée ; le mot de passe saisi par l'utilisateur n'est pas sauvegardé pour des raisons de sécurité.
Lorsque l'utilisateur se connecte au serveur, le mot de passe saisi par l'utilisateur pendant le processus de connexion est traité par la même fonction de dérivation de clé et la version hachée résultante est comparée à la version sauvegardée. Si les hachages sont identiques, le mot de passe saisi est considéré comme correct et l'utilisateur est authentifié. En théorie, il est possible que deux mots de passe différents produisent le même hachage. Cependant, les fonctions de hachage cryptographiques utilisées comme fonction de dérivation de clé sont conçues de telle sorte que trouver un mot de passe qui produit le même hachage est très difficile et pratiquement impossible, donc si le hachage produit correspond au mémorisé, l'utilisateur peut être authentifié.
La commande passwd peut être utilisée pour changer les mots de passe des comptes locaux, et sur la plupart des systèmes, elle peut également être utilisée pour changer les mots de passe gérés dans un mécanisme d'authentification distribué tel que NIS, Kerberos ou LDAP.

## Le fichier /etc/passwd

Le fichier /etc/passwd est une base de données textuelle d'informations sur les utilisateurs qui peuvent se connecter au système.
Le nom du fichier provient de l'une de ses fonctions initiales qui était de contenir les données utilisées pour vérifier les mots de passe des comptes d'utilisateurs. Toutefois, sur les systèmes Unix modernes, les mots de passe sont enregistrés dans un autre fichier et ils y sont enregistrés dans une forme hashée.
Le fichier /etc/passwd possède généralement des autorisations qui lui permettent d'être lu par tous les utilisateurs du système (lisibles dans le monde), bien qu'il ne puisse être modifié que par l'utilisateur root ou par certaines commandes spéciales.
Le fichier /etc/passwd est un fichier texte, chaque enregistrement décrivant un compte d'utilisateur. Chaque enregistrement se compose de sept champs séparés par un deux-points. L'ordre des enregistrements dans le fichier est généralement sans importance.
Voici un exemple d'un enregistrement :
Les champs, de gauche à droite, sont :
* jsmith : le nom de l'utilisateur (login name). C'est la chaîne de caractères que l'utilisateur entre lorsqu'il se connecte au système. Le nom d'utilisateur doit être unique dans le système.
* x : les informations utilisées pour valider le mot de passe d'un utilisateur. Dans la plupart des usages modernes, ce champ contient "x" (ou "*", ou un autre indicateur) et les informations de mot de passe étant stockées dans un fichier de mots de passe séparé. Sur les systèmes Linux, "*" empêche les connexions d'un compte tout en conservant son nom d'utilisateur, alors que "*NP*" indique d'utiliser un serveur NIS pour obtenir le mot de passe. Avant le masquage du mot de passe (c'est-à-dire dans les premières implantations de Unix), ce champ contenait un hachage cryptographique du mot de passe de l'utilisateur (en combinaison avec un sel).
* 1001 : l'identifiant d'utilisateur. Un nombre utilisé par le système d'exploitation à des fins internes. Il n'est pas nécessairement unique.
* 1000 : l'identifiant de groupe. Un nombre qui identifie le groupe principal de l'utilisateur. Tous les fichiers créés par cet utilisateur peuvent être initialement accessibles à ce groupe.
* Joe Smith,Room 1007,(234)555-8910,(234)5550044,email : le champ Gecos. Un commentaire qui décrit la personne ou le compte. Généralement, il s'agit d'un ensemble de valeurs séparées par des virgules, fournissant le nom complet de l'utilisateur et ses coordonnées.
* /home/jsmith : le chemin vers le répertoire personnel de l'utilisateur.
* /bin/sh : le programme qui est lancé chaque fois que l'utilisateur se connecte au système. Pour un utilisateur interactif, il s'agit généralement d'une interface en ligne de commande.

## Le fichier /etc/shadow

Le fichier /etc/shadow est utilisé pour augmenter le niveau de sécurité des mots de passe. Le fichier contient une version hashée des mots de passe et seuls des utilisateurs très privilégiés peuvent y avoir accès. Généralement, ces données sont conservées dans des fichiers appartenant à l'utilisateur root et seulement accessibles par lui.
Les administrateurs système peuvent réduire la probabilité d'attaques par force brute en rendant les mots de passe hachés non accessibles par les utilisateurs non privilégiés. Une façon simple de le faire est de rendre le fichier /etc/passwd accessible uniquement par l'utilisateur root. Cependant, cela restreindrait l'accès à d'autres données du fichier telles que les mappages des noms d'utilisateur vers les identifiants d'utilisateur, ce qui forcerait la reprogrammation de nombreux programmes et utilitaires.
Une meilleure solution est la création d'un fichier shadow pour contenir les hachages des mots de passe séparément des autres données du fichier passwd qui est accessible à un grand nombre d'utilisateurs. Ce fichier est le fichier /etc/shadow sur les systèmes Linux et Unix, ou le fichier /etc/master.passwd sur les systèmes BSD. Ces fichiers ne sont lisibles que par l'utilisateur root. (L'accès aux mots de passe hashés par l'utilisateur root est considéré comme acceptable étant donné que sur les systèmes dotés du modèle traditionnel de sécurité « avec utilisateur tout-puissant », l'utilisateur root pourrait, de toute façon, obtenir l'information d'une autre manière). Pratiquement tous les systèmes d'exploitation récents de type Unix utilisent des mots de passe hachés et cachés dans un fichier shadow.
L'utilisation d'un fichier de mots de passe hachés et cachés ne bloque pas complètement l'accès d'un attaquant aux mots de passe hachés, car certains systèmes d'authentification réseau fonctionnent en transmettant le mot de passe haché sur le réseau (parfois en texte clair, par exemple Telnet), le rendant vulnérable aux interceptions. Les copies de données système, telles que les sauvegardes système écrites sur bande magnétique ou sur disque optique, peuvent également devenir un moyen d'obtenir illégalement des mots de passe hachés. En outre, les fonctions utilisées par les programmes légitimes de vérification des mots de passe doivent être rédigées de manière que les programmes malveillants ne puissent pas effectuer un grand nombre de contrôles d'authentification en une courte période de temps.
Peu importe que le masquage du mot de passe soit implanté sur un système donné, le fichier passwd doit être lisible par tous les utilisateurs pour que certains utilitaires fonctionnent (par exemple, pour que l'utilitaire ls puisse afficher les noms des propriétaires des fichiers d'un dossier). Cela signifie que, si le masquage n'est pas implanté, un attaquant avec accès non privilégié au système peut obtenir la forme hachée du mot de passe de tous les utilisateurs.
Les formes hachées des mots de passe peuvent être utilisées pour monter une attaque par force brute hors ligne, testant les mots de passe possibles contre les mots de passe hachés relativement rapidement sans alerter les dispositifs de sécurité du système conçus pour détecter un nombre anormal de tentatives de connexion infructueuses. Surtout quand le hachage n'est pas salé, il est également possible de rechercher ces mots de passe hachés dans des rainbow tables, des bases de données spécialement conçues pour trouver un mot de passe à partir de sa forme hachée.
Lorsque le masquage du mot de passe est utilisé, le fichier /etc/passwd affiche généralement un caractère tel que «*» ou «x» dans le champ du mot de passe de chaque utilisateur au lieu du mot de passe haché et le fichier /etc/shadow contient habituellement les éléments suivants pour chaque utilisateur :
* le nom de l'utilisateur
* le sel et le mot de passe haché OU une valeur d'exception
** le sel et le mot de passe haché sont dans le format "$id$sel$motdepassehaché", c'est la forme imprimable d'un hachage de mot de passe tel que produit par crypt (C). "$id" est l'algorithme utilisé : sur GNU/Linux, "$1$" signifie MD5, "$2a$" signifie Blowfish, "$2y$" signifie Blowfish (manipulation correcte de caractères 8 bits), "$5$" signifie SHA-256 et "$6$ signifie SHA-512, d'autres versions de Unix (comme NetBSD) peuvent avoir des codes de fonctions de hachage différents. L'étirement de clé est utilisé pour augmenter la difficulté de cassage de mot de passe, en utilisant par défaut 1000 itérations de MD5 modifié, 64 itérations de Blowfish, 5000 itérations de SHA-256 ou SHA-512. Le nombre d'itérations peut changer pour Blowfish, ou pour SHA-256 et SHA-512 en utilisant par exemple "$6$rounds=50000 $".)
** Les significations des valeurs d'exception sont :
*** Chaîne vide - Le compte n'a pas de mot de passe. Signalé par "NP" sur le système d'exploitation Solaris.
*** "!" - Le compte est verrouillé. L'utilisateur ne pourra pas se connecter via l'authentification par mot de passe, mais d'autres méthodes d'authentification (par exemple, la clé SSH) peuvent encore être utilisées.
*** "*LK*" ou "*" - Le compte est verrouillé. L'utilisateur ne pourra pas se connecter via l'authentification par mot de passe, mais d'autres méthodes (par exemple la clé SSH) peuvent encore être autorisées).
*** "!!" - Le mot de passe n'a jamais été défini.
* La date de la dernière modification du mot de passe (exprimé en nombre de jours après le 1er janvier 1970).
* Le nombre de jours avant le que le mot de passe puisse être changé (0 indique qu'il peut être modifié à tout moment).
* Le nombre de jours après lesquels le mot de passe doit être changé (30 indique qu'après 30 jours l'utilisateur sera forcé de changer son mot de passe ; 99999 indique que l'utilisateur n'est jamais obligé de changer son mot de passe).
* Le nombre de jours durant lesquels l'utilisateur sera informé de l'expiration prochaine de son mot de passe s'il se connecte au système.
* Le nombre de jours avant la désactivation d'un compte avec mot de passe expiré.
* La date de la désactivation d'un compte (exprimé en nombre de jours après le 1er janvier 1970).
* Un champ réservé pour une éventuelle utilisation future.