<HTML> <HEAD> <TITLE>Pourquoi utiliser le système de mots de passe Shadow?</TITLE> </HEAD> <BODY> <H1>2. <A NAME="s2"></A>Pourquoi utiliser le système de mots de passe Shadow?</H1> <P> <A HREF="Shadow-Password-HOWTO.html#toc2">Contenu de cette section</A></P> <P>La plupart des distributions Linux actuelles ne contiennent pas le support des mots de passe shadow (La Slackware 2.3, Slackware 3.0 et d'autres distributions assez populaires...). Une des raisons est que le copyright concernant la suite Shadow n'était pas clair sur les droits de distribution. <B>Linux</B> utilise la licence <SF>GNU</SF> (quelques fois référencée sous le nom de <EM>Copyleft</EM>) qui permet à quiconque de le stocker sur n'importe quel support (comme un CD-ROM par exemple) et est responsable des droits pour cela.</P> <P>Le mainteneur actuel de la <EM>Suite Shadow</EM>, <A HREF="mailto:marekm@il7linuxb.ists.pwr.wroc.pl">Marek Michalkiewicz <marekm@il7linuxb.ists.pwr.wroc.pl></A> a reçu les sources de l'auteur originel sour un copyright style BSD permettant la redistribution. Maintenant que le problème de la distribution est résolu, il est probable que les prochaines distributions contiendront les shadow password par défaut. En attendant vous devrez l'installer vous-même.</P> <P>Si vous avez installé votre distribution depuis un CD-ROM, vous pouvez trouver que, dans la mesure où la distribution n'a pas la <EM>suite shadow</EM> d'installée, quelques fichiers dont vous avez besoin pour installer la <EM>suite shadow</EM> peuvent se situer sur le CD-ROM.</P> <P><EM>Cependant, la suite shadow 3.3.1, 3.3.1-2 et shadow-mk possèdent toutes un problème de sécurité avec leur programme de login ainsi qu'avec d'autres programmes possédant le droit <SF>setuid root</SF>. En conséquence, elle ne doivent pas être utilisés plus longtemps.</EM></P> <P>Tous les fichiers nécessaires peuvent être récupérés via ftp anonyme ou via le World Wide Web.</P> <P>Sur un système linux sans l'ensemble Shadow installé, les informations sur l'utilisateur, et en particulier le mot de passe sont stockées dans le fichier <CODE>/etc/passwd</CODE>. Le mot de passe est enregistré dans un format <EM>encrypté</EM>. Si vous demandez à un expert en cryptographie, il (ou elle) vous répondra que le mot de passe n'est pas <EM>encrypté</EM> mais <EM>encodé</EM>. En fait, lors de l'utilisation de crypt(3), le mot de passe est considéré comme la clé pour encoder un texte de valeur nulle. C'est la raison pour laquelle à partir de maintenant, j'utiliserai le terme <EM>encodé</EM>.</P> <P>L'algorithme utilisé pour encoder le mot de passe fonctionne à sens unique, c'est-à-dire qu'il est très difficile à partir du mot de passe encodé de retrouver l'original. Vous trouverez plus d'informations à propos de l'algorithme utilisé dans la section <A HREF="#sec-crypt">sec-crypt</A> les pages de manuel de crypt(3).</P> <P>Lorsqu'un utilisateur définit un mot de passe, il est encodé avec une valeur aléatoire appelée <EM>sel</EM> (Note : <EM>salt</EM> en Anglais). C'est-à-dire qu'un même mot de passe pourrait être enregistré de 4096 façons différentes. La valeur du <EM>sel</EM> est alors enregistrée avec le mot de passe désormais encodé.</P> <P>Lorsqu'un utilisateur se connecte et saisit son mot de passe, le <EM>sel</EM> est tout d'abord retrouvé à partir du mot de passe encodé. Alors, le mot de passe entré est encodé avec le <EM>sel</EM> précédemment retrouvé.</P> <P>Il est, avec des moyens informatiques, difficile (mais pas impossible) de prendre un mot de passe <EM>encodé</EM> aléatoirement et de retrouver le mot de passe original. Quoi qu'il en soit, sur un système ayant de nombreux utilisateurs, il est probable que certains mots de passes soient évidents: un simple mot, un nom, ou une combinaison de mots simples.</P> <P>Mais le pirate de système sait tout cela, et va simplement encoder un dictionnaire de mots de passe usuels en utilisant les 4096 possibilités de <EM>sel</EM>. Il va alors comparer les mots de passe encodés dans le fichier <CODE>/etc/passwd</CODE> par sa propre base de donnée. Quand il aura trouvé une équivalence, il aura le mot de passe d'un compte. Cela s'appelle une <EM>attaque au dictionnaire</EM>, et c'est une des méthodes les plus courantes pour accéder à un système sans autorisation.</P> <P>En y réfléchissant, à un seul mot de passe de 8 caractères correspond 4096 mots de passes encodés de 13 caractères (c'est à dire 4096x13 octets). Donc un dictionnaire de 400 000 mots simples, noms, mots de passes, ou simple variations, tiendrait facilement sur un disque dur de 4Go. Le pirate a juste besoin de les trier et de les comparer.</P> <P>Même sans avoir beaucoup d'espace disque, des utilitaires comme crack(1) peuvent en général casser pas mal de mots de passe sur un système contenant suffisamment d'utilisateurs. (En considérant que les utilisateurs du système sont autorisés à lire leur propre mot de passe).</P> <P>Le fichier <CODE>/etc/passwd</CODE> contient aussi des informations comme l'identificateur de l'utilisateur (UID) et l'identificateur de groupe (GID) qui sont utilisés par de nombreux programmes. C'est pour cela que le fichier passwd <EM>doit</EM> être lisible par tout le monde. Si vous changiez les permissions de <CODE>/etc/passwd</CODE> de telle sorte que plus personne ne puisse le lire, la première chose que vous pourriez constater, c'est que la commande <CODE>ls -l</CODE> affiche désormais le user ID au lieu du nom !</P> <P>Le kit Shadow résout ce problème en déplaçant les mots de passe encodés vers un autre fichier (en général <CODE>/etc/shadow</CODE>). Il n'y a que le root qui a les permissions de lecture et d'écriture sur le fichier <EM>shadow</EM>. Quelques programmes (comme xlock) nécessitent que le groupe <EM>shadow</EM> puisse lire et écrire dans le fichier <CODE>/etc/shadow</CODE>. Il est préférable que les programmes qui ont juste besoin de lire et vérifier le mot de passe soient lancés SGID <EM>shadow</EM> plutôt que SGID root.</P> <P>En déplaçant les mots de passe vers le fichier <CODE>/etc/shadow</CODE>, nous écartons effectivement au pirate la possibilité d'avoir accès aux mots de passe encodés avec lesquels ils auraient pu faire une <EM>attaque au dictionnaire</EM>.</P> <P>De plus, le <EM>kit shadow</EM> propose de nouvelles possibilités intéressantes: <UL> <LI>Un fichier de configuration pour configurer les options de login (<CODE>/etc/login.defs</CODE>),</LI> <LI>Des utilitaires pour ajouter, modifier et effacer des comptes utilisateurs,</LI> <LI>Gestion de la durée des mots de passe,</LI> <LI>Gestion de la durée d'un compte,</LI> <LI>Groupes shadow (optionnels),</LI> <LI>Mots de passe de double longueur (16 caractères),</LI> <LI>Meilleur contrôle sur la sélection du mot de passe d'un utilisateur,</LI> <LI>Mots de passe Dial-up,</LI> <LI>Programmes d'authentification secondaire.</LI> </UL> </P> <P>Installer l'<EM>ensemble shadow</EM>, c'est contribuer à la sécurité de votre système, mais il y a bien d'autre choses à faire pour sécuriser votre système. Il y aura probablement une série de HOWTO discutant de la sécurité et des méthodes de sécurisation.</P> <P>Pour le moment, pour avoir des informations sur la sécurité et linux, incluant les vulnérabilités connues du système, allez voir la: <A HREF="http://bach.cis.temple.edu/linux/linux-security/">Linux Security home page.</A> </P> <P></P> <H2>2.1 <A NAME="ss2.1"></A> Pourquoi ne devriez-vous pas installer le système ShadowPassword</H2> <P>Il y a quelques circonstances et quelques configurations qui font qu'installer la <EM>Suite Shadow</EM> n'est pas une bonne idée: <UL> <LI>La machine ne possède pas de comptes utilisateurs,</LI> <LI>Votre machine fonctionne sur un réseau local et utilise NIS (Network Information Service) pour récupérer ou fournir des noms d'utilisateurs et des mots de passe à d'autres machines sur le réseau (Cela peut actuellement être fait et n'améliore pas la sécurité pour autant),</LI> <LI>Votre machine est utilisée par des serveurs de terminaux afin de vérifier des utilisateurs via NFS (Network File Sytem), NIS, ou quelqu'autre méthode,</LI> <LI>Votre machine utilise d'autres logiciels pour valider les utilisateurs, et il n'y a pas de version disponible, et vous n'avez pas les sources.</LI> </UL> </P> <P></P> <H2>2.2 <A NAME="ss2.2"></A> Format du fichier /etc/passwd</H2> <P>Sur un système ne possédant pas la suite Shadow, voici le format du fichier <CODE>/etc/passwd</CODE> <BLOCKQUOTE><CODE> <PRE> username:passwd:UID:GID:full_name:directory:shell </PRE> </CODE></BLOCKQUOTE> En détail: <DL> <DT><B><CODE>username</CODE></B><DD><P>Le nom de l'utilisateur (login)</P> <DT><B><CODE>passwd</CODE></B><DD><P>Le mot de passe encodé</P> <DT><B><CODE>UID</CODE></B><DD><P>Identificatuer de l'utilisateur: user ID</P> <DT><B><CODE>GID</CODE></B><DD><P>Identificatuer du groupe: group ID</P> <DT><B><CODE>full_name</CODE></B><DD><P>Le nom complet de l'utilisateur (Prénom Nom) - Ce champ est appelé le champ GECOS (General Electric Comprehensive Operating System) et peut éventuellement contenir d'autres informations</P> <DT><B><CODE>directory</CODE></B><DD><P>Répertoire personnel de l'utilisateur</P> <DT><B><CODE>shell</CODE></B><DD><P>Shell par défaut de l'utilisateur</P> </DL> Par exemple: <BLOCKQUOTE><CODE> <PRE> username:Npge08pfz4wuk:503:100:Full Name:/home/username:/bin/sh </PRE> </CODE></BLOCKQUOTE> <CODE>Np</CODE> est le <EM>sel</EM> et <CODE>ge08pfz4wuk</CODE> est le mot de passe <EM>encodé</EM>. Pour le même mot de passe, son équivalent encodé aurait tout aussi bien pu être <CODE>kbeMVnZM0oL7I</CODE>. Il y a 4096 possibilités d'encodage pour le même mot de passe. (Le mot de passe de cet exemple est 'password', un très <EM>mauvais</EM> mot de passe).</P> <P>Une fois l'ensemble shadow installé, voilà à quoi ressemblera votre fichier <CODE>/etc/passwd</CODE>: <BLOCKQUOTE><CODE> <PRE> username:x:503:100:Full Name:/home/username:/bin/sh </PRE> </CODE></BLOCKQUOTE> Un <CODE>x</CODE> est venu remplacer le mot de passe encodé. Mis à part ça, le format du fichier <CODE>/etc/passwd</CODE> reste en fait inchangé. Ceci permet à tous les programmes qui lisent le fichier <CODE>/etc/passwd</CODE> sans avoir besoin d'accéder aux mots de passe de fonctionner correctement.</P> <P>Les mots de passes encodés sont désormais dans le fichier <CODE>/etc/shadow</CODE>.</P> <P></P> <H2>2.3 <A NAME="ss2.3"></A> Format du fichier /etc/shadow</H2> <P>Le fichier <CODE>/etc/shadow</CODE> contient les informations suivantes: <BLOCKQUOTE><CODE> <PRE> username:passwd:last:may:must:warn:expire:disable:reserved </PRE> </CODE></BLOCKQUOTE> En détail: <DL> <DT><B><CODE>username</CODE></B><DD><P>Le Nom de l'Utilisateur</P> <DT><B><CODE>passwd</CODE></B><DD><P>Le mot de passe encodé</P> <DT><B><CODE>last</CODE></B><DD><P>Date de la dernière modification (en nombre de jours depuis le 1er janvier 1970).</P> <DT><B><CODE>may</CODE></B><DD><P>Nombre de jours avant que le mot de passe puisse être modifié</P> <DT><B><CODE>must</CODE></B><DD><P>Nombre de jours avant que le mot de passe doive être modifié</P> <DT><B><CODE>warn</CODE></B><DD><P>Nombre de jours durant lesquels l'utilisateur est prévenu de l'expiration de son mot de passe.</P> <DT><B><CODE>expire</CODE></B><DD><P>Nombre de jours entre l'expiration du mot de passe et la fermeture du compte.</P> <DT><B><CODE>disable</CODE></B><DD><P>Date de la fermeture du compte (en nombre de jours depuis le 1er janvier 1970).</P> <DT><B><CODE>reserved</CODE></B><DD><P>Champ réservé</P> </DL> Donc, l'exemple précedent devrait être: <BLOCKQUOTE><CODE> <PRE> username:Npge08pfz4wuk:9479:0:10000:::: </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <A NAME="sec-crypt"></A> <H2>2.4 <A NAME="ss2.4"></A> Apercu de la fonction crypt(3) </H2> <P>extrait de la page de manuel de crypt(3)</P> <P>"<EM>crypt</EM> est la fonction de cryptage du mot de passe. Elle est basée sur l'algorithme du DES (<EM>Data Encryption Standard</EM>) avec quelques modifications pour éviter les recherches matérielles de la clé.</P> <P>La clé est le mot de passe de l'utilisateur</P> <P>Le <EM>sel</EM> est composé de deux caractères choisis dans l'ensemble <F>a-zA-Z0-9./</F>. cette chaine de caractère est utilisée pour perturber l'algorithme de 4096 différentes façons.</P> <P>En prenant les 7 derniers bits de chaque caractère du mot de passe, on obtient une clé de 56 bits. Cette clé est utilisée pour crypter une chaîne de caractère constante (généralement constituée de zéro). La valeur retournée pointe sur le mot de passe crypté: une série de 13 caractères ASCII imprimables (les deux premiers caractères correspondent au sel). La valeur retournée pointe sur une donnée statique dont le contenu est modifié à chaque appel.</P> <P><B>Attention:</B> Une clé de 56 bits correspond à: 2ˆ56 donc 7.3e16 valeurs possibles. Les recherches exhaustives <B>sont possibles</B> en utilisant des ordinateurs à architecture massivement parallèle. Des logiciels comme <CODE>crack(1)</CODE> travaillent avec des clés qui sont généralement utilisées par les humains. C'est-à-dire que la sélection de mots de passe testés sont des mots simples, mots de passe fréquemment utilisés et des noms. L'utilisation d'un programme <CODE>passwd(1)</CODE> qui recherche des mots de passe trop simple est recommandé.</P> <P>L'algorithme DES lui-même est très limité, ce qui fait qu'envisager l'utilisation de <CODE>crypt(3)</CODE> pour autre chose que de l'authentification de mots de passe n'est pas une bonne idée. Si vous envisagez d'utiliser <CODE>crypt(3)</CODE> pour un projet de cryptographie, ne le faites pas, procurez-vous plutôt un bon livre sur le cryptage de données et une des nombreuses bibliothèques DES."</P> <P>Si vous recherchez un bon livre sur le cryptage de données, je vous recommande: <PRE> "Applied Cryptography: Protocols, Algorithms, and Source Code in C" par Bruce Schneier <schneir@chinet.com> ISBN: 0-471-59756-2 </PRE> </P> <P></P> <P></P> <HR> <P> Chapitre <A HREF="Shadow-Password-HOWTO-3.html">suivant</A>, Chapitre <A HREF="Shadow-Password-HOWTO-1.html">Précédent</A> <P> Table des matières de <A HREF="Shadow-Password-HOWTO.html#toc2">ce chapitre</A>, <A HREF="Shadow-Password-HOWTO.html#toc">Table des matières</A> générale</P> <P> <A HREF="Shadow-Password-HOWTO.html">Début</A> du document, <A HREF="#0"> Début de ce chapitre</A></P> </BODY> </HTML>