<!doctype linuxdoc system>

<!-- Ce document est le Shadow Password HOWTO, merci d'adresser tout
    commentaire ou suggestion a l'auteur: mhjack@tscnet.com 
    Vous pouvez bien sur envoyer des commentaires aux traducteurs:
    david@anrtt.mipnet.fr ainsi qu'a moi meme a genibel@emi.u-bordeaux.fr-->


<article>

<!-- Title information -->

<title>Linux Shadow Password HOWTO, Version française
<author>Michael H. Jackson, <tt>mhjack@tscnet.com</tt>
<newline><em> Traduction française : Igor Genibel
(Igor.Genibel@emi.u-bordeaux.fr) </em>.
<date>v1.3, 3 Avril 1996

<abstract>
Ce document décrit comment obtenir, installer et configurer l'ensemble
<em>Shadow Password</em> sous Linux. Il prend aussi
en compte l'adaptation des autres logiciels et démons réseau
accédant habituellement aux mots de passe des utilisateurs.
Bien qu'ils ne fassent pas parti du paquetage, ces programmes ne
fonctionnerons plus correctement après son installation.
Ce document contient en plus un exemple de code pour mettre
à jour vos applications pour qu'elles supportent le système de mots
de passe cachés. Des réponses à des questions
fréquemment posées sont fournies en fin de document.
</abstract>

<!-- Table of contents -->
<toc>

<!-- Begin the document -->


<!-- Introduction -->
<sect><heading>Introduction
<p>
Ceci est le Shadow password HOWTO pour linux. Ce document décrit
comment configurer votre système linux pour utiliser le système des
mots de passe cachés. Quelques exemples d'utilisation concernant
certaines caractéristiques de la <em/suite Shadow/ (Note: ce terme
n'est volontairement pas traduit afin de ne pas alourdir la
compréhension du document) sont aussi
inclus.
<p>
Lorsque vous installerez le paquetage des mots de passe cachés
et lorsque vous vous servirez des utilitaires, vous devrez être
logé <sf/root/. Lorsque vous installerez le paquetage, vous
devrez effectuer certains changements sur des utlitaires
systèmes, il est donc très fortement recommendé
de faire des copies de sauvegarde de programmes indiqués. Je
vous recommande aussi de lire et de comprendre toutes les instructions
avant de commencer.


<!-- Note du Traducteur -->
<sect1>Note du traducteur
<p>
Tout au long du document vous constaterez très certainement que je
n'ai pas traduit le terme "Shadow Password". La raison est simple:
le traduction de ce terme n'est pas élégante. Je pense qu'une simple
explication (voir l'introduction) de celui-ci vaut beaucoup mieux
qu'une "françisation" douteuse.

<!-- Changement par rapport aux versions precedentes -->
<sect1>Changements par rapport aux versions précédentes
<p>
Ajouts:
<itemize>
<item>	<tt>
        Ajout de la sous-section Pourquoi vous ne devriez pas
	installer le système Shadow Password
	</tt>
<item>	<tt>
        Ajout de la sous-section Mise à jour du programme
	xdm
	</tt>
<item>	<tt>
        Ajout de la section Comment faire que les
	caractéristiques de la suite Shadow fonctionnent
	</tt>
<item>	<tt>
        Ajout de la section contenant les questions les plus
	fréquemment posées
	</tt>
</itemize>
Corrections/Mise à jour:
<itemize>
<item>	<tt>
        Correction des références html sur Sunsite
	</tt>
<item>	<tt>
        Correction dans la section sur wu-ftp pour ajouter
	-lshadow dans le Makefile
	</tt>
<item>	<tt>
        Correction de quelques fautes de frappes et de langage
	</tt>
<item>	<tt>
        Chagement dans la section sur wu-ftp pour supporter le
	format ELF
	</tt>
<item>	<tt>
        Mise à jour pour mettre en évidence les problèmes de 
	sécurite de certains programmes de login
	</tt>
<item>	<tt>
        Mise à jour pour recommander la Suite Linux Shadow
	par Marek Michalkiewicz
	</tt>
</itemize>


<!-- Nouvelles versions de ce document -->
<sect1>Nouvelles versions de ce document:
<p>
La dernière version de ce document pourra toujours être
récupérée via FTP 
anonyme sur:
<itemize>
<item>Version Originale:
<bf>sunsite.unc.edu</bf>
<verb>/pub/Linux/docs/HOWTO/SHADOW-HOWTO</verb>
ou:
<verb>/pub/Linux/docs/HOWTO/other-formats/SHADOW-HOWTO{-html.tar,ps,dvi}.gz</verb>
<item>Version Francaise:
<bf>ftp.lip6.fr</bf>
<verb>/pub/linux/french/docs/HOWTO/Shadow-Password-HOWTO*</verb>
</itemize>
Ou bien par le World Wide Web: <url url="http://sunsite.unc.edu/mdw/linux.html"
name="Linux Documentation Project Web Server">, à la page:
<url url="http://sunsite.unc.edu/linux/HOWTO/Shadow-Password-HOWTO.html" name="SHADOW-HOWTO">
sinon directement par moi, <tt>&lt;mhjack@tscnet.com&gt;</tt>. Il sera
aussi posté dans le newsgroup: <tt>comp.os.linux.answers</tt>

Ce document est maintenant stocké en portant le nom Shadow-AAJJMM.

<!-- Commentaires et suggestions -->
<sect1>Commentaires ou suggestions.
<p>
Merci de m'envoyer tout commentaire, mise à jour ou suggestion:
<htmlurl url="mailto:mhjack@tscnet.com" 
name="Michael H. Jackson &lt;mhjack@tscnet.com&gt;">.
Plus vite je reçois vos commentaires, plus vite je mets à
jour ce document. Si vous avez des problèmes, merci de m'écrire directement,
je suis très rarement à jour avec les newsgroups.

<!-- Pourquoi utiliser le systeme de mots de passe Shadow -->
<sect>Pourquoi utiliser le système de mots de passe Shadow?
<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. <bf/Linux/ utilise la licence <sf/GNU/ (quelques
fois référencée sous le nom de <em/Copyleft/) 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>
Le mainteneur actuel de la <em/Suite Shadow/, 
<htmlurl url="mailto:marekm@il7linuxb.ists.pwr.wroc.pl" name="Marek
Michalkiewicz &lt;marekm@il7linuxb.ists.pwr.wroc.pl&gt;"> 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>
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/ d'installée, quelques fichiers
dont vous avez besoin pour installer la <em/suite shadow/ peuvent se
situer sur le CD-ROM.
<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/. En conséquence, elle
ne doivent pas être utilisés plus longtemps.</em>
<p>
Tous les fichiers nécessaires peuvent être
récupérés via ftp anonyme ou via le World Wide
Web.
<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
<tt>/etc/passwd</tt>. 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>
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 <ref id="sec-crypt"> les pages de manuel de crypt(3).
<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>
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>
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>
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 <tt>/etc/passwd</tt> 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>
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>
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>
Le fichier <tt>/etc/passwd</tt> 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 <tt>/etc/passwd</tt> de telle sorte que plus personne ne puisse le
lire, la première chose que vous pourriez constater, c'est que
la commande <tt>ls -l</tt> affiche désormais le user ID au 
lieu du nom !
<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 <tt>/etc/shadow</tt>). 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 <tt>/etc/shadow</tt>. 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&ocirc;t que SGID root.
<p>
En déplaçant les mots de passe vers le fichier <tt>/etc/shadow</tt>, 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>
De plus, le <em>kit shadow</em> propose de nouvelles possibilités intéressantes:
<itemize>
<item>Un fichier de configuration pour configurer les options de login (<tt>/etc/login.defs</tt>),
<item>Des utilitaires pour ajouter, modifier et effacer des comptes utilisateurs,
<item>Gestion de la durée des mots de passe,
<item>Gestion de la durée d'un compte,
<item>Groupes shadow (optionnels),
<item>Mots de passe de double longueur (16 caractères),
<item>Meilleur contr&ocirc;le sur la sélection du mot de passe d'un utilisateur,
<item>Mots de passe Dial-up,
<item>Programmes d'authentification secondaire.
</itemize>
<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>
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:
<url url="http://bach.cis.temple.edu/linux/linux-security/" 
name="Linux Security home page.">

<!-- Pourquoi ne devriez vous pas utiliser le systeme Shadow -->
<sect1>Pourquoi ne devriez-vous pas installer le système Shadow
Password
<p>
Il y a quelques circonstances et quelques configurations qui font
qu'installer la <em/Suite Shadow/ n'est pas une bonne idée:
<itemize>
<item>La machine ne possède pas de comptes utilisateurs,
<item>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),
<item>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,
<item>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.
</itemize>

<!-- Format du fichier /etc/passwd -->
<sect1>Format du fichier /etc/passwd
<p>
Sur un système ne possédant pas la suite Shadow, voici le format du
fichier <tt>/etc/passwd</tt> 
<tscreen><verb>username:passwd:UID:GID:full_name:directory:shell</verb></tscreen>
En détail:
<descrip>
<tag/<tt>username</tt></tag> Le nom de l'utilisateur (login)
<tag/<tt>passwd</tt></tag> Le mot de passe encodé
<tag/<tt>UID</tt></tag> Identificatuer de l'utilisateur: user ID
<tag/<tt>GID</tt></tag> Identificatuer du groupe: group ID
<tag/<tt>full_name</tt></tag> 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
<tag/<tt>directory</tt></tag> Répertoire personnel de l'utilisateur
<tag/<tt>shell</tt></tag> Shell par défaut de l'utilisateur
</descrip>
Par exemple:
<tscreen><verb>username:Npge08pfz4wuk:503:100:Full Name:/home/username:/bin/sh</verb></tscreen>
<tt>Np</tt> est le <em>sel</em> et <tt>ge08pfz4wuk</tt> est le mot de passe
<em>encodé</em>. Pour le même mot de passe, son équivalent encodé aurait
tout aussi bien pu être <tt>kbeMVnZM0oL7I</tt>. 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>
Une fois l'ensemble shadow installé, voilà à quoi ressemblera votre fichier
<tt>/etc/passwd</tt>:
<tscreen><verb>username:x:503:100:Full Name:/home/username:/bin/sh</verb></tscreen>
Un <tt>x</tt> est venu remplacer le mot de passe encodé. Mis à part ça,
le format du fichier <tt>/etc/passwd</tt> reste en fait inchangé. Ceci
permet à tous les programmes qui lisent le fichier <tt>/etc/passwd</tt>
sans avoir besoin d'accéder aux mots de passe de fonctionner correctement.
<p>
Les mots de passes encodés sont désormais dans le fichier <tt>/etc/shadow</tt>.

<!-- Format du fichier shadow -->
<sect1>Format du fichier /etc/shadow
<p>
Le fichier <tt>/etc/shadow</tt> contient les informations suivantes:
<tscreen><verb>username:passwd:last:may:must:warn:expire:disable:reserved</verb></tscreen>
En détail:
<descrip>
<tag/<tt>username</tt></tag> Le Nom de l'Utilisateur
<tag/<tt>passwd</tt></tag> Le mot de passe encodé
<tag/<tt>last</tt></tag> Date de la dernière modification (en nombre de
jours depuis le 1er janvier 1970).
<tag/<tt>may</tt></tag> Nombre de jours avant que le mot de passe puisse
être modifié
<tag/<tt>must</tt></tag> Nombre de jours avant que le mot de passe doive
être modifié
<tag/<tt>warn</tt></tag> Nombre de jours durant lesquels l'utilisateur est
prévenu de l'expiration de son mot de passe.
<tag/<tt>expire</tt></tag> Nombre de jours entre l'expiration du mot de
passe et la fermeture du compte.
<tag/<tt>disable</tt></tag> Date de la fermeture du compte (en nombre de
jours depuis le 1er janvier 1970).
<tag/<tt>reserved</tt></tag> Champ réservé
</descrip>
Donc, l'exemple précedent devrait être:
<tscreen><verb>username:Npge08pfz4wuk:9479:0:10000::::</verb></tscreen>

<!-- Apercu de la fonction crypt -->
<sect1>Apercu de la fonction crypt(3) <label id="sec-crypt">
<p>
extrait de la page de manuel de crypt(3)
<p>
&dquot;<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>
La clé est le mot de passe de l'utilisateur
<p>
Le <em>sel</em> est composé de deux caractères choisis dans l'ensemble [a-zA-Z0-9./].
cette chaine de caractère est utilisée pour perturber l'algorithme
de 4096 différentes façons.
<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>
<bf>Attention:</bf> Une clé de 56 bits correspond à: 2^56 donc 7.3e16 valeurs
possibles. Les recherches exhaustives <bf>sont possibles</bf> en utilisant des
ordinateurs à architecture massivement parallèle. Des logiciels comme
<tt>crack(1)</tt> 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
<tt>passwd(1)</tt> qui recherche des mots de passe trop simple est recommandé.
<p>
L'algorithme DES lui-même est très limité, ce qui fait qu'envisager
l'utilisation de <tt>crypt(3)</tt> pour autre chose que de l'authentification de
mots de passe n'est pas une bonne idée.
Si vous envisagez d'utiliser <tt>crypt(3)</tt> 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.&dquot;
<p>
Si vous recherchez un bon livre sur le cryptage de données, je vous
recommande:
<verb>
	"Applied Cryptography: Protocols, Algorithms, and Source Code in C"
	par Bruce Schneier <schneir@chinet.com>
	ISBN: 0-471-59756-2
</verb>


<!-- Se procurer le paquetage shadow -->
<sect>Se procurer le paquetage Shadow.
<!-- Historique du paquetage shadow -->
<sect1>Historique du paquetage Shadow pour Linux?
<p>
<em/N'UTILISEZ PAS LES PAQUETAGES DECRITS DANS CETTE SECTION, ILS
CONTIENNENT DES PROBLEMES DE SECURITE/
<p>
Le paquetage Shadow original a été écrit par <tt>John F. Haugh II</tt>.
<p>
De nombreuses versions peuvent être utilisées sur un système Linux:
<itemize>
<item><tt>shadow-3.3.1</tt> est l'original
<item><tt>shadow-3.3.1-2</tt> est le patch spécifique à Linux fait par 
<tt><htmlurl url="mailto:flla@stud.uni-sb.de" name="Florian La Roche (flla@stud.uni-sb.de)"></tt>
et contient quelques améliorations.
<item>
<htmlurl url="ftp://sunsite.unc.edu/pub/Linux/system/Admin/shadow-mk1.tar.gz"
name="shadow-mk"> est le paquetage spécifique à Linux.
</itemize>
<p>
Le paquetage <tt>shadow-mk</tt> est en fait constitué du paquetage
<tt>shadow-3.3.1</tt> distribué par <tt>John F. Haugh II</tt> patché avec
<tt>shadow-3.3.1-2</tt> avec en plus: 
<itemize>
<item>des  corrections par <tt><htmlurl 
url="mailto:magnus@texas.net" name="Mohan Kokal &lt;magnus@texas.net&gt;"></tt>
rendant l'installation bien plus évidente, 
<item>un patch par <tt>Joseph R.M. Zbiciak</tt>
pour <tt>login1.c</tt> (login.secure) qui élimine les trous de sécurité -f, -h de
/bin/login et quelques autres patches divers.
</itemize>
<p>
Le paquetage <tt>shadow-mk</tt> était
précédemment recommandé, mais il doit être
remplacé à cause d'un trou de sécurité du
programme <tt/login/.
<p>
Il y a des <em/trous de sécurit&eacute/ dans les versions
3.3.1, 3.3.1-2 et shadow-mk qui sont dûs au programme
<tt/login/. Le bogue <tt/login/ implique de ne pas vérifier la
longueur du nom de login. Cela entraîne un surpassement de la
zone tampon qui provoque un crash ou pire encore. Il est dit que ce
surpassement de zone tampon pourrait permettre à quiconque
ayant un compte sur le système d'utiliser ce bogue ainsi que
des bibliothèques partagées pour gagner un accès
<sf/root/. Je ne pourrais pas vous dire exactement comment cela est
possible mais de nombreux systèmes Linux sont affectés.
Mais les systèmes possédants ces <em/paquetages Shadow/,
ainsi que la plupart des distributions pre-ELF <em/sans/ le
<em/paquetage Shadow/ sont vulnérables !
<p>
Pour de plus amples informations sur cette publication ainsi que
d'autres publications concernant les problèmes de
sécurité de Linux, consultez la <em/Linux
Security Home Page (Shared Libraries and login Program Vulnerability)/
à <htmlurl
url="http://bach.cis.temple.edu/linux/linux-security/Linux-Security-Faq/Linux-telnetd.html"
name="&lt;http://bach.cis.temple.edu/linux/linux-security/Linux-Security-Faq/Linux-telnetd.html&gt;">

<!-- Ou trouver la suite shadow -->
<sect1>Où trouver la Suite Shadow
<p>
La seule suite recommandée est en béta test, donc les
dernières versions sont utilisables en environnement de
production et ne contiennent pas de programme <sf/login/
vulnérable.
<p>
Le paquetage utilise la convention de notation suivante :
<verb>
         shadow-AAMMJJ.tar.gz
</verb>
où <tt/AAMMJJ/ est la date de publication de la suite.
<p>
Cette version sera éventuellement la version 3.3.3 lorsqu'elle
sera publiée après le béta test; et est maintenue
par <htmlurl url="mailto:marekm@il7linuxb.ists.pwr.wroc.pl" name="Marek
Michalkiewicz &lt;marekm@il7linuxb.ists.pwr.wroc.pl&gt;">. Elle est
disponible sous la forme : <em/shadow-current.tar.gz/ à
l'adresse <htmlurl
url="ftp://il7linuxb.ists.pwr.wroc.pl/pub/linux/shadow/shadow-current.tar.gz"
name="&lt;ftp://il7linuxb.ists.pwr.wroc.pl/pub/linux/shadow/shadow-current.tar.gz&gt;">.
<p>
Les miroirs suivants sont aussi disponibles :
<itemize>
<item>ftp://ftp.icm.edu.pl/pub/Linux/shadow/shdow-current.tar.gz
<item>ftp://iguana.hut.fi/pub/linux/shadow/shadow-current.tar.gz
<item>ftp://ftp.cin.net/usr/ggallag/shadow/shadow-current.tar.gz
<item>ftp://ftp.netural.com/pub/linux/shadow/shadow-current.tar.gz
</itemize>
<p>
Vous devez utiliser la version actuelle disponible.
<p>
Vous NE devez PAS utiliser une version plus ancienne que la version
<tt/shadow-960129/ du fait qu'elles possèdent le
problème de sécurité décrit plus avant.
<p>
Lorsque ce document fait référence à la <em/Suite
Shadow/, je ferais référence à ce paquetage. Il
est donc supposé que vous utilisez ce paquetage.
<p>
Pour information, j'ai utilisé le paquetage
<tt/shadow-960129/ pour faire les instructions d'installation.
<p>
Si vous utilisiez précédemment le paquetage
<tt/shadow-mk/, vous devriez mettre à jour cette version et
reconstruire tout ce que vous avez originellement compilé.

<!-- Ce qui est inclus dans le paquetage shadow -->
<sect1>Ce qui est inclus dans le paquetage Shadow
<p>
La paquetage shadow contient les programmes de remplacement pour:
<p>
<tt>su, login, passwd, newgrp, chfn, chsh, et id</tt>
<p>
Mais il contient aussi des nouveaux programmes:
<p>
<tt>chage, newusers, dpasswd, gpasswd, useradd, userdel, usermod,
 groupadd, groupdel, groupmod, groups, pwck, grpck, lastlog, pwconv,
 et pwunconv</tt>
<p>
De plus, la bibliothèque: <tt>libshadow.a</tt> est incluse pour permettre de
compiler les programmes nécessitant un accès en lecture/écritures aux
mots de passe.
<p>
Les pages de manuel sont aussi incluses.
<p>
Il y a aussi un programme de configuration pour le program <tt/login/
intallé sous le nom de <tt>/etc/login.defs</tt>.


<!-- Compiler les programmes -->
<sect>Compiler les programmes.
<!-- Extraire l'archive -->
<sect1>Extraire l'archive
<p>
La première étape après avoir
récupéré les paquetage est l'extraction 
de l'archive. C'est une archive de format tar et compressée avec gzip.
Donc tout d'abord déplacez la vers <tt>/usr/src</tt>, et tapez:
<tscreen><verb>tar -xzvf shadow-current.tar.gz</verb></tscreen>
<p>
Ceci extraira l'ensemble dans le répertoire: <tt>/usr/src/shadow-AAMMJJ</tt>
<p>
<!-- Configurer le fichier config.h -->
<sect1>Configurer le fichier config.h
<p>
La première chose à faire est d'écraser les
fichiers <tt/Makefile/ et <tt/config.h/:
<tscreen><verb>
cd /usr/src/shadow-AAMMJJ
cp Makefile.linux Makefile
cp config.h.linux config.h
</verb></tscreen>
<p>
Jetez un coup d'oeil au fichier <tt>config.h</tt>.
Ce fichier contient les définitions pour quelques options de configuration.
Si vous utilisez le paquetage shadow <em>recommandé</em>, je
vous recommande de dévalider le support de groupes <tt/shadow/;
pour la première fois.
<p>
Par défaut les mots de passe pour les groupes caché
sont validés. Pour les dévalider, éditez le
fichier <tt/config.h/, et remplacez <tt/#define SHADOWGRP/ en
<tt/#undef SHADOWGRP/. Je recommande de commencer sans les groupes
cachés, mais si vous souhaitez réellement des mots de
passe pour les groupes ainsi que des administrateurs de groupes vous
pourrez ultérieurement valider l'option et recompiler le
tout. Si vous la laissez validée, vous devez créer le
fichier <tt>/etc/gshadow</tt>.
<p>
Valider l'option gérant les longs mots de passe n'est pas recommandée.
<p>
<em>Ne PAS changer</em> le champ: <tt>#undef AUTOSHADOW</tt>
<p>
L'option <tt>AUTOSHADOW</tt> était prévue pour que les programmes non
adaptés aux mots de passe shadow puissent toujours
fonctionner. Cela paraît intéressant en théorie
mais ne fonctionne pas correctement. Si vous validez cette option, et
qu'un programme focntionne avec les droits de <tt/root/, il se peut
qu'il utilise la fonction  <tt>getpwnam()</tt> avec les droits
<tt/root/, et, plus tard, qu'il écrive la donnée
modifiée dans le fichier <tt>/etc/passwd</tt>. Il ne
possèdera donc plus les propriétés <em/shadow
passwords/. <em/chfn/ et <em/chsh/ sont de tels programmes (Vous
pouvez passer outre en échangeant l'uid réel 
et effectif avant d'appeler <tt/getpwnam()/ car <tt/root/ peut
utiliser <em/chfn/ et <em/chsh/ aussi).
<p>
Le même avertissement est aussi valable si vous compilez la
<tt/libc/. Il y a une option <tt/SHADOW_COMPAT/ qui fait la même
chose. Elle ne <em/doit PAS être/ utilisée! Si vous
commencez &agrave remettre des mots de passe encodés dans le
fichier <tt>/etc/passwd</tt>, cela pose un problème.
<p>
Si vous utilisez une <tt/libc/ de versions inférieure à
4.6.27, vous devriez faire un ou deux changements dans le fichier
<tt/config.h/ ainsi que dans le <tt/Makefile/. En ce qui concerne le
fichier <tt/config.h/, éditez le et remplacez:
<tscreen><verb>#define HAVE_BASENAME</verb></tscreen> par
<tscreen><verb>#undef HAVE_BASENAME</verb></tscreen>
Dans le fichier <tt/Makefile/, remplacez:
<tscreen><verb>
SOBJS = smain.o env.o entry.o susetup.o shell.o \
        sub.o mail.o motd.o sulog.o age.o tz.o hushed.o

SSRCS = smain.c enc.c entry.c setup.c shell.c \
        pwent.c sub.c mail.c motd.c sulog.c shadow.c age.c pwpack.c rad64.c \
        tz.c hushed.c
</verb></tscreen> par
<tscreen><verb>
SOBJS = smain.o env.o entry.o susetup.o shell.o \
        sub.o mail.o motd.o sulog.o age.o tz.o hushed.o basename.o

SSRCS = smain.c enc.c entry.c setup.c shell.c \
        pwent.c sub.c mail.c motd.c sulog.c shadow.c age.c pwpack.c rad64.c \
        tz.c hushed.c basename.c
</verb></tscreen>
Ce changement ajoute le code contenu dans <tt/basename.c/ qui est
contenu dans la <tt/libc 4.6.27/ ou plus.

<!-- Faire une copie de suavegarde de vos programmes originaux -->
<sect1>Faire une copie de sauvegarde de vos programmes originaux.
<p>
Faites une copie de sauvegarde des fichiers qui vont être remplacés par le kit
shadow. Sur un système Slackware 3.0:
<itemize>
<item>/bin/su
<item>/bin/login
<item>/usr/bin/passwd
<item>/usr/bin/newgrp
<item>/usr/bin/chfn
<item>/usr/bin/chsh
<item>/bin/id
</itemize>
<p>
Le paquetage béta possède une cible <em/save/ dans le
<tt/Makefile/, mais elle est commentée car les
différentes distributions placent ces programmes à
différents endroits.
<p>
Vous devriez aussi faire une copie de sauvegarde du fichier
<tt>/etc/passwd</tt>, mais faites attention à le nommer
différemment de façon à ne pas écraser l'original.

<!-- Lancer make -->
<sect1>Lancer make
<p>
<em/Vous avez besoin d'être <sf/root/ pour la plupart de
l'installation/
<p>
Lancez make pour compiler les exécutables du paquetage.
<tscreen><verb>make all</verb></tscreen>
Vous pourrez voir les avertissements suivants: <tt/rcsid defined but
not used/. Ce n'est rien, il survient seulement parce que l'auteur
utilise un paquetage de contrôle de version.

<!-- Installer -->
<sect>Installer

<!-- Ayez une diskette boot a portee de main -->
<sect1>Ayez une disquette de boot à portée de main
<p>
Si la mise à jour se déroulait mal, il serait utile d'avoir une disquette
de boot. Si vous avez l'ensemble des deux disquettes boot/root que vous avez
utilisées lors de l'installation de votre système, elles feront probablement
l'affaire. Dans le cas contraire, vous devrez en générer: jetez un coup
d'oeil au <url url="http://sunsite.unc.edu/mdw/HOWTO/Bootdisk-HOWTO.html"
name="Bootdisk-HOWTO"> (version francaise: <url
url="ftp://ftp.ibp.fr/pub/linux/french/docs/HOWTO/Bootdisk-HOWTO"
name="Bootdisk-HOWTO">) qui vous décrira la marche à suivre.

<!-- Supprimer les pages de maunel en double -->
<sect1>Supprimer les pages de manuel en double
<p>
Vous devriez aussi déplacer les pages de manuels qui vont
être remplacées. Même si vous avez le courage
d'installer le kit Shadow sans 
procéder à un quelconque sauvegarde, 
vous aurez à supprimer vos anciennes pages: elles ne sont pas écrasées
car - dans la plupart des cas - elles sont enregistrées dans un format
compressé.
<p>
Vous pouvez utiliser une combinaison de la commande <tt>man -aW</tt> et de la
commande <tt>locate</tt> pour localiser les pages à effacer. Il est généralement
plus aisé de retrouver les anciennes pages avant de lancer <tt>make
intall</tt>.
<p>
Si vous utilisez la distribution Slackware 3.0, alors les pages de manuel
que vous devez supprimer sont:
<itemize>
<item>/usr/man/man1/chfn.1.gz
<item>/usr/man/man1/chsh.1.gz
<item>/usr/man/man1/id.1.gz
<item>/usr/man/man1/login.1.gz
<item>/usr/man/man1/passwd.1.gz
<item>/usr/man/man1/su.1.gz
<item>/usr/man/man5/passwd.5.gz
</itemize>
<p>
Regardez dans les sous répertoires <tt>/var/man/cat[1-9]</tt>
Il est possible qu'il y ait des pages de manuel du même nom qui devront
être effacées.

<!-- Lancer make install -->
<sect1>Lancer make install
<p>
C'est désormais le moment de taper: (faites ceci en tant que root).
<tscreen><verb>make install</verb></tscreen>
<p>
Ceci installera les nouveaux programmes, remplacera les anciens, définira
les permissions de fichiers, et installera les pages de manuel.
<p>
Make install prend en compte l'installation des fichiers <tt/include/ pour les
mettre au bon endroit dans <tt>/usr/include/shadow</tt>. 
<p>
Si vous utilisez le paquetage béta, vous devez copier à
la main le fichier <tt/login.defs/ dans les répertoires
<tt>/etc/</tt> et être s&ucirc;r que seul <sf/root/ peut le
modifier.
<tscreen><verb>
cp login.defs /etc
chmod 700 /etc/login.defs
</verb></tscreen>
Ce fichier est le fichier de configuration pour le programme
<em/login/. Vous devriez regarder et faire des changements dans ce
fichier pour votre propre système. C'est là que vous
décidez sur quel <tt/terminal/ <sf/root/ peut se connecter, ainsi
que d'autres paramètres de sécurité (comme l'expiration  par défaut des
mots de passe).

<!-- Lancer pwconv -->
<sect1>Lancer pwconv
<p>
La prochaine étape consiste à lancer <tt>pwconv</tt>. Ceci doit être fait en tant que
<sf/root/, et à partir du répertoire <tt>/etc</tt> :
<tscreen><verb>cd /etc
/usr/sbin/pwconv</verb></tscreen>
<p>
<tt>pwconv</tt> lit les données du fichier <tt>/etc/passwd</tt> et les sépare en deux fichiers:
<tt>/etc/npasswd</tt> et <tt>/etc/nshadow</tt>.
<p>
Un programme <tt>pwunconv</tt> permet de faire la démarche inverse: à partir du
fichier <tt>/etc/passwd</tt> et <tt>/etc/shadow</tt>, il génère un unique
<tt>/etc/passwd.</tt>

<sect1>Renommer npasswd et nshadow
<p>
Après avoir lancé <tt>pwconv</tt>, vous avez normalement créé deux fichiers:
<tt>/etc/npasswd</tt> et <tt>/etc/nshadow</tt>. Ses fichiers doivent être
respectivement renommés en <tt>/etc/passwd</tt> et <tt>/etc/shadow</tt>.
Faites aussi une copie de votre fichier <tt>/etc/passwd</tt>
original, mais faites attention que seul le <sf/root/ puisse y avoir l'accès.
Nous le déplacerons dans le répertoire personnel de root:
<tscreen><verb>cd /etc
cp passwd ~passwd
chmod 600 ~passwd
mv npasswd passwd
mv nshadow shadow</verb></tscreen>
<p>
Vérifiez aussi que les permissions et les propriétaires des fichiers soient
corrects. Si vous utilisez <em>X-windows</em>, le programme <tt>xlock</tt> doit
pouvoir lire directement le fichier <tt>/etc/shadow</tt> (mais pas y écrire).
La meilleure solution consiste à configurer le fichier <tt>shadow</tt> en
utilisateur <tt>root</tt> et groupe <tt>shadow</tt>. Avant toute chose vérifiez que le groupe
<tt>shadow</tt> existe bien (regardez dans le fichier <tt>/etc/group</tt>).
Actuellement, il ne devrait y avoir aucun utilisateur appartenant à ce groupe.
<tscreen><verb>chown root.root passwd
chown root.shadow shadow
chmod 0644 passwd
chmod 0640 shadow</verb></tscreen>
<p>
Votre système est désormais équipé de mots
de passe shadow. Déplacez-vous 
vers une autre console virtuelle et vérifier si vous pouvez vous loguer.
<p>
Si vous ne pouvez pas vous loguer c'est que la mise à jour s'est mal
déroulée !
Pour revenir à un système de mot de passes non shadow, entrez ce qui suit:
<tscreen><verb>cd /etc
cp ~passwd passwd
chmod 644 passwd
cd /usr/src/shadow-mk
make restore</verb></tscreen>
<p>
Ceci restaurera le fichier <tt>passwd</tt> original,  et restaurera tous 
les fichiers précédemment sauvegardés.

<!-- Les autres programmes a mettre a jour -->
<sect>Les autres programmes à mettre à jour
<p>
Le paquetage shadow contient la plupart des programmes de remplacement
aux programmes accédant aux mots de passe. Mais toutefois, il reste
quelques programmes présents en général sur la plupart des systèmes qui
nécessitent une mise à jour pour fonctionner correctement.
<p>
Si vous utilisez une <em/Distribution Debian/ (et même si vous
n'en utilisez pas), vous pouvez obtenir les sources des programmes
que vous avez besoin de recompiler à : <htmlurl
url="ftp://ftp.debian/org/debian/stable/source/"
name="&lt;ftp://ftp.debian/org/debian/stable/source/&gt;">
<p>
La but de cette section concerne la mise à jour des programmes:
<tt>adduser</tt>, <tt>wu_ftpd</tt>, <tt>ftpd</tt>, <tt>pop3d</tt>,
<tt>xlock</tt> <tt>xdm</tt> et <tt>sudo</tt>
<p>
Reportez vous à la section <ref id="sec-prog"> pour vous aider à mettre
à jour les programmes qui 
nécessitent l'accès aux mots de passes (sans que le programme soit
SUID root ou SGID shadow).

<sect1>le programme Adduser (Slackware)
<p>
Les distributions Slackware (et probablement d'autres) contiennent
un programme interactif <tt>/bin/adduser</tt> permettant d'ajouter
facilement des utilisateurs. Une version Shadow de ce programme peut
être trouvée sur:
<htmlurl
url="ftp://sunsite.unc.edu/pub/Linux/system/Admin/accounts/adduser.shadow-1.4.tgz"
name="ftp://sunsite.unc.edu/pub/Linux/
system/Admin/accounts/adduser.shadow-1.4.tar.gz">.
<p>
Je vous encourage à utiliser les programmes qui sont fournis
par le paquetage shadow (<tt/useradd, usermod/ et <tt/userdel/)
à la place de <tt/adduser/. Ils nécessitent un peu de
temps pour savoir s'en servir, mais l'effort est d'autant plus grand
que ces programmes effectuent un blocage de fichier sur
<tt>/etc/passwd</tt> et <tt>/etc/shadow</tt>, ce que ne fait pas
<tt/adduser/
<p>
Lisez la section <ref id="sec-fonction"> pour de plus amples informations.
<p>
L'installation est aisée:
<tscreen><verb>tar -xzvf adduser.shadow-1.4.tar.gz
cd adduser.shadow.1.4
make adduser
chmod 700 adduser
make install
</verb></tscreen>

<!-- Le serveur wu_ftpd -->
<sect1>Le serveur wu_ftpd
<p>
La plupart des distributions Linux incluent le serveur <tt>wu_ftpd</tt>. Si votre
distribution n'est pas ``native shadow'', votre serveur <tt>wu_ftpd</tt> n'est pas
compilé pour le support shadow. <tt>wu_ftpd</tt> est
lancé à partir de <tt>inetd/tcpd</tt> 
en tant que processus <sf>root</sf>. Si vous utilisez un ancien démon <tt>wu_ftpd</tt>,
vous devrez de toute façon le mettre à jour car les vieilles versions
ont un bug, le compte root pouvait être compromis (pour plus d'informations, consultez la page
web: <url url="http://bach.cis.temple.edu/linux/linux-security/Linux-
Security-FAQ/Linux-wu.ftpd-2.4-Update.html">).
<p>
Heureusement, la seule démarche à faire est de récupérer les sources et de
les compiler avec l'option shadow.
<p>
Le serveur <tt>wu_ftpd</tt> peut être récupéré sur Sunsite: <url
url="ftp://sunsite.unc.edu/pub/Linux/system/Network/file-transfer/wu-ftpd-2.4-fixed.tar.gz"
name="wu-ftp-2.4-fixed.tar.gz">
<p>
Une fois l'archive récupérée, placez là dans <tt>/usr/src</tt> et tapez:
<tscreen><verb>cd /usr/src
tar -xzvf wu-ftpd-2.4-fixed.tar.gz
cd wu-ftpd-2.4-fixed
cp ./src/config/config.lnx.shadow ./src/config/config.lnx
</verb></tscreen>
éditer alors le fichier <tt>./src/makefiles/Makefile.lnx</tt>
et changez la ligne:
<tscreen><verb>LIBES     = -lbsd -support</verb></tscreen>
par 
<tscreen><verb>LIBES     = -lbsd -support -lshadow</verb></tscreen>
Maintenant vous êtes près à lancer le script de
compilation installer le résultat:
<tscreen><verb>
cd /usr/src/wu-ftpd-2.4-fixed
/usr/src/wu-ftpd-2.4-fixed/build lnx
cp /usr/sbin/wu-ftpd /usr/src/wu-ftpd.old
cp ./bin/ftpd /usr/sbin/wu-ftpd
</verb></tscreen>
<p>
Sur mon système basé sur une Slackware 3.0 j'ai du faire ces modifications
avant de lancer build:
<tt>build</tt>:
<tscreen><verb>cd /usr/include/netinet
ln -s in_systm.h in_system.h
cd -</verb></tscreen>
<p>
Des problèmes ont été rapportés lors de la
compilation de ce paquetage sous des systèmes ELF, mais la
béta version de la prochaine publication fonctionne bien. Elle
peut être trouvé à: <htmlurl
url="ftp://tscnet.com/pub/linux/network/ftp/wu-ftpd-2.4.2-beta-20.tar.gz"
name="wu-ftp-2.4.2-beta-10.tar.gz
&lt;ftp://tscnet.com/pub/linux/network/ftp/wu-ftpd-2.4.2-beta-20.tar.gz&gt;">
<p>
Une fois que vous avez récupéré le serveur,
placez-le dans le répertoire <tt>/usr/src/</tt> et tapez:
<tscreen><verb>
cd /usr/src
tar -xzvf wu-ftpd-2.4.2-beta-10.tar.gz
cd wu-ftpd-beta-10
cd ./src/config
</verb></tscreen>
éditez alors le fichier config.lnx et remplacez:
<tscreen><verb>#undef SHADOW_PASSWORD</verb></tscreen>
par
<tscreen><verb>#define SHADOW_PASSWORD</verb></tscreen>
Allez alors dans le répertoire des <tt/Makefiles/
<tscreen><verb>cd ../Makefiles</verb></tscreen>
et éditez le fichier <tt/Makefile.lnx/. Modifiez alors:
<tscreen><verb>LIBES = -lsupport -lbsd # -lshadow</verb></tscreen>
par
<tscreen><verb>LIBES = -lsupport -lbsd -lshadow</verb></tscreen>
Il ne reste plus qu'à compiler le programme et l'installer:
<tscreen><verb>cd ..
build lnx
cp /usr/sbin/wu-ftpd /usr/sbin/wu-ftpd.old
cp ./bin/ftpd /usr/sbin/wu-ftpd</verb></tscreen>
<p>
Notez que vous devrez contrôler le fichier
<tt>/etc/inetd.conf</tt> afin d'être sûr que votre
serveur <tt/wu-ftpd/ soit réellement présent. Il a
été rapporté que certaines distributions placent
les serveurs démons à d'autres endroits, et donc,
wu-ftpd en particulier pourrait être nommé différemment.


<!-- ftpd standard -->
<sect1>ftpd standard
<p>
Si vous utilisez le serveur <tt>ftpd standard</tt>, tout d'abord,
je vous recommande de passer au serveur <tt>wu_ftpd</tt>, mis à part
les bugs cités précédemment, il est considéré comme plus sécurisé.
<p>
Si vous insistez et voulez garder la version standard - ou bien vous avez besoin
du support NIS - le fichier est sur Sunsite:
<url url="ftp://sunsite.unc.edu/pub/Linux/system/Network/file-transfer/ftpd-shadow-nis.tgz"
name="ftpd-shadow-nis.tgz">

<!-- pop3d (Post Office Protocol 3) -->
<sect1>pop3d (Post Office Protocol 3)
<p>
Si vous utilisez le 3eme <em>Post Office Protocol</em> (POP3), vous devrez
recompiler le programme <tt>pop3d</tt>. <tt>pop3d</tt> est normalement lancé
par <tt>inet2/tcpd</tt> dans un process <tt>root</tt>.
<p>
Il y a deux versions disponibles sur Sunsite:
<url url="ftp://sunsite.unc.edu/pub/Linux/system/Mail/pop/
pop3d-1.00.4.linux.shadow.tar.gz"
name="pop3d-1.00.4.linux.shadow.tar.gz">
et 
<url url="ftp://sunsite.unc.edu/pub/Linux/system/Mail/pop/
pop3d+shadow+elf.tar.gz"
name="pop3d+shadow+elf.tar.gz">
<p>
Les deux versions sont très simples à installer.

<!-- xlock -->
<sect1>xlock
<p>
Si vous utilisez <tt>X-window</tt> et que vous ne mettez pas à jour
<tt>xlock</tt>, vous devrez utiliser <tt>CTRL-ALT-Fx</tt> pour vous déplacer
sur un autre terminal, vous loguer et tuer le process <tt>xlock</tt> (ou utiliser
CTRL-ALT-BS pour tuer le serveur X). Mais par chance, la mise à jour d'
<tt>xlock</tt> n'est vraiment pas compliquée.
<p>
Si vous utilisez XFree86 Versions 3.x.x,  c'est probablement
<tt>xlockmore</tt> qui est installé (c'est un superbe économiseur
d'écran et un système de lock).
Ce paquetage supporte <em>shadow</em> après recompilation. Si vous utilisez une
vieille version <tt>xlock</tt>, je vous recommande celle-ci.
<p>
<tt>xlockmore-3.7.tgz</tt> disponible sur Sunsite:
<url url="ftp://sunsite.unc.edu/pub/Linux/X11/xutils/screen-savers/
xlockmore-3.7.tgz">
<p>
En gros, voilà comment procéder:
<p>
Récupérez <tt>xlockmore-3.7.tgz</tt> et copiez-le dans <tt>/usr/src</tt>,
décompressez-le: 
<tscreen><verb>tar -xzvf xlockmore-3.7.tgz</verb></tscreen>
<p>
Editez le fichier: <tt>/usr/X11R6/lib/X11/config/linux.cf</tt>, et changez
la ligne:
<tscreen><verb>#define HasShadowPasswd    NO
</verb></tscreen>
en
<tscreen><verb>
#define HasShadowPasswd    YES</verb></tscreen>
<p>
Alors, construisez les exécutables:
<tscreen><verb>cd /usr/src/xlockmore
xmkmf
make depend
make</verb></tscreen>
<p>
Maintenant, déplacez le tout vers le bon endroit, et mettez-à-jour
les propriétaires et les permissions de fichier:
<tscreen><verb>cp xlock /usr/X11R6/bin/
cp XLock /var/X11R6/lib/app-defaults/
chown root.shadow /usr/X11R6/bin/xlock
chmod 2755 /usr/X11R6/bin/xlock
chown root.shadow /etc/shadow
chmod 640 /etc/shadow</verb></tscreen>
<p>
Votre xlock fonctionnera désormais correctement.

<!-- xdm -->
<sect1>xdm
<p>
<tt/xdm/ est un programme qui présente un écran de
<em/login/ pour <em/W-Window/. Quelques sytèmes
démarrent <tt/xdm/ lorsqu'il se situe dans un niveau
spécifique (voir <tt>/etc/inittab</tt>).
<p>
Avec le <em/kit Shadow/ installé, <tt/xdm/ doit être mis
à jour. Heureusement, il est relativement facile de mettre
&agrave jour votre programme <tt/xdm/.
<p>
<tt/xdm.tar.gz/ est disponible &agrave: <htmlurl
url="ftp://sunsite.unc.edu/pub/Linux/X11/xutils/xdm.tar.gz"
name="&lt;ftp://sunsite.unc.edu/pub/Linux/X11/xutils/xdm.tar.gz>;"> 
<p>
Récupérez <tt/xdm.tar.gz/ et placez-le dans le
répertoire <tt>/usr/src</tt>, et décompressez-le:
<tscreen><verb>tar -xzvf xdm.tar.gz</verb></tscreen>
éditez le fichier <tt>/usr/X11R6/lib/X11/config/linux.cf</tt>,
et changez la ligne:
<tscreen><verb>#define HasShadowPassword           NO</verb></tscreen>
en
<tscreen><verb>#define HasShadowPassword           YES</verb></tscreen>
Vous pouvez alors compiler les exécutables;:
<tscreen><verb>
cd /usr/src/xdm
xmkmf
make depend
make
</verb></tscreen>
Copier alors l'exécutable:
<tscreen><verb>cp xdm /usr/X11R6/bin</verb></tscreen>
<tt/xdm/ est exécuté en tant que <sf/root/ donc vous
n'avez pas à changer les permissions.


<!-- sudo -->
<sect1>sudo
<p>
Le programme <tt>sudo</tt> permet à l'administrateur système de laisser des
utilisateurs lancer des programmes qui normalement nécessiteraient les
permissions root. C'est intéressant car ça permet à l'administrateur de
se limiter lui même l'accès root pendant qu'il permet aux utilisateurs de
faire des opérations comme monter un disque.
<p>
<tt>sudo</tt> a besoin d'accéder aux mots de passe car il vérifie le mot de passe
des utilisateurs quand il est invoqué.<tt>sudo</tt> fonctionne déjà SUID root, donc
accéder au fichier <tt>/etc/shadow</tt> n'est pas un problème.
<p>
la mise à jour <tt>sudo</tt> pour shadow est disponible:
<htmlurl
url="ftp://sunsite.unc.edu/pub/Linux/system/Admin/sudo-1.2-shadow.tgz">
<p>
Cette version a été prévue pour fonctionner avec des mots de passe shadow,
donc la seule chose à faire est de recompiler le tout (mettez-le dans
<tt>/usr/src</tt>):
<tscreen><verb>
cd /usr/src
tar -xzvf sudo-1.2-shadow.tgz
cd sudo-1.2-shadow
make all
make install
</verb></tscreen>



<!-- imapd (paquetage Email Pine -->
<sect1>imapd (paquetage Email pine)
<p>
imapd est un serveur e-mail tout comme pop3d. imapd est compris dans
l'ensemble Email pine. La documentation qui est fournie avec le paquetage
prétend que la configuration par défaut pour un système linux fonctionne
avec shadow. Or j'ai constaté que ce n'est pas vrai. De plus, je n'ai pas 
encore compris comment fonctionne la combinaison Makefile / Script Build
et je n'ai pas réussi à le modifier pour qu'il supporte le format shadow.
<p>
Si quelqu'un arrive à faire cette mise à jour, merci de m'envoyer un email,
je l'incluerai ici.

<!-- pppd -->
<sect1>pppd (Serveur Point-to-Point protocol)
<p>
Le serveur pppd peut être configuré selon de nombreuses méthodes
d'authentification: <em>Password Authentifocation Protocol</em> (PAP) et
<em>Cryptographic Authentification Protocol</em> (CHAP). Le serveur pppd utilise
en général les mots de passe stockés dans le fichier
<tt>/etc/ppp/chap-secrets</tt>
et <tt>/etc/ppp/pap-secret</tt>. Si vous utilisez cette méthode,
ce n'est pas la peine de faire de mise-à-jour.
<p>
pppd vous permet aussi d'utiliser le paramètre <em>login</em> (soit en ligne de
commande, soit dans le fichier de configuration). Si l'option <tt>login</tt> est
utilisée, alors pppd utilisera pour le <em>PAP</em> le fichier <tt>/etc/passwd</tt>
pour le nom d'utilisateur et le mot de passe. Bien sur ça ne fonctionnera plus
sur un système mots de passe shadow. Pour pppd-1.2.1d, un ajout de code est
nécesssaire.
<p>
L'exemple donné dans la prochaine section est la modification du code de
<tt>pppd-1.2.1d</tt> (une vieille version de pppd).
<p>
<tt>pppd-2.2.0</tt> contient déjà le support shadow.



<!-- Faire en sorte que la suite shadow fonctionne -->
<sect>Faire en sorte que la suite shadow fonctionne <label id="sec-fonction">
<p>
Cette section explique quelques éléments que vous
souhaitez savoir depuis que vous avez la suite shadow sur votre
système. De plus amples informations sont disponibles dans les
pages de manuels.
<sect1>Ajouter, modifier, et supprimer des utilisateurs.
<p>
La <em>Suite Shadow</em> a ajouté les commandes suivantes qui
sont orientées ``ligne de commande'', pour ajouter, modifier et
supprimer des utilisateurs. Vous avez aussi s&ucirc;rement d&ucirc;
installer le programme <tt>adduser</tt>.
<sect2>useradd
<p>
la commande <tt>useradd</tt> peut être utilisée pour
ajouter des utilisateurs à votre système. Vous appelez
aussi cette commande pour changer les paramètres par
défaut.
<p>
La première chose à faire est d'examiner les
paramètres par défaut et effectuer des changements pour
votre propre système.
<tscreen><verb>useradd -D</verb></tscreen>
<code>GROUP=1
HOME=/home
INACTIVE=0
EXPIRE=0
SHELL=
SKEL=/etc/skel</code>

Les paramètres par défauts ne sont probablements pas ceux que
vous souhaitez, donc, si vous commencez à ajouter des
utilisateurs maintenant, vous aurez à spécifier toutes
les informations pour chacun d'entre eux. C'est pour cela que nous
pouvons et devons changer les valeurs par défaut.
<p>
Sur mon sytème:
<itemize>
<item>Je veux que le groupe par défaut soit 100,
<item>Je veux que les mots de passe expirent au bout de 60 jours,
<item>Je ne veux pas que le compte soit bloqué lors de
l'expiration du mot de passe,
<item>Je veux que le shell par défaut soit <tt>/bin/bash</tt></itemize>
Pour effectuer ces changements, j'ai d&ucirc; utiliser:
<tscreen><verb>useradd -D -g100 -e60 -f0 -s/bin/bash</verb></tscreen>
<p>
Maintenant, lancer <tt>useradd -D</tt> donne:
<code>
GROUP=100
HOME=/home
INACTIVE=0
EXPIRE=60
SHELL=/bin/bash
SKEL=/etc/skel
</code>
<p>
Ces valeurs par défaut sont stockées dans le fichier
<tt>/etc/defaults/useradd</tt>
<p>
Maintenant vous pouvez utiliser <tt>useradd</tt> pour ajouter des
utilisateurs à votre système. Par exemple, pour ajouter
l'utilisateur <tt>fred</tt>, en utilisant les valeurs par
défaut, vous devez utiliser ce qui suit:
<tscreen><verb>useradd -m -c "Fred Flintstone" fred</verb></tscreen>
Cela créera une entrée dans le fichier
<tt>/etc/passwd</tt>:
<tscreen><verb>fred:*:505:100:Fred Flintstone:/home/fred:/bin/bash</verb></tscreen>
Ainsi que cette entrée dans le fichier <tt>/etc/shadow</tt>:
<tscreen><verb>fred:!:0:0:60:0:0:0:0</verb></tscreen>
Le répertoire d'accueil de <tt>fred</tt>sera créé
et le contenu de <tt>/etc/skel</tt> sera copié à cet
endroit gr&acirc;ce à l'option <tt>-m</tt>
<p>
De plus, lorsque l'on ne spécifie pas l'IUD, le prochain
disponible est utilisé.
<p>
Le compte de <tt/fred/ est maintenant créé, mais
<tt/fred/ ne peut pas se loger tant que nous ne
dévérouillons pas le compte. Nous effectuons cela en
changeant le mot de passe.
<tscreen><verb>passwd fred</verb></tscreen>

<code>
Changing password for fred
Enter the new password (minimum of 5 characters)
Please use a combination of upper and lower case letters and numbers.
New Password: *******
Re-enter new password: *******
</code>

Maintenant <tt>/etc/shadow</tt> contient:

<tscreen><verb>fred:J0C.WDR1amIt6:9559:0:60:0:0:0:0</verb></tscreen>

<tt/fred/ est maintenant capable de se connecter et d'utiliser le
système. La chose intéressante à propos de <tt/useradd/
et des autres programmes provenant de la Suite Shadow, est qu'ils
effectuent les changements dans les fichiers <tt>/etc/passwd</tt> et
<tt>/etc/shadow</tt> automatiquement. Donc si vous ajoutez un
utilisateur, et qu'un autre utilisateur change son mot de passe au
même moment, les deux opérations sont effectuées
correctement.

Vous devriez plutôt utiliser les commandes fournies
qu'éditer directement les fichier <tt>/etc/passwd</tt> et
<tt>/etc/shadow</tt>. Si vous éditez le fichier
<tt>/etc/shadow</tt> et qu'un utilisateur change son mot de passe au
même moment, ce que vous sauverez, sera bien dans le fichier
mais, le nouveau mot de passe de l'utilisateur sera perdu.

Voici un petit script intéractif permettant d'ajouter des utilisateurs
en utilisant les commandes <tt>useradd</tt> et <tt>passwd</tt>:

<code>
#!/bin/bash
#
# /sbin/newuser - A script to add users to the system using the Shadow
#                 Suite's useradd and passwd commands.
#
# Written my Mike Jackson <mhjack@tscnet.com> as an example for the Linux
# Shadow Password Howto.  Permission to use and modify is expressly granted.
#
# This could be modified to show the defaults and allow modification similar
# to the Slackware Adduser program.  It could also be modified to disallow
# stupid entries.  (i.e. better error checking).
#
##
#  Defaults for the useradd command
##
GROUP=100        # Default Group
HOME=/home       # Home directory location (/home/username)
SKEL=/etc/skel   # Skeleton Directory
INACTIVE=0       # Days after password expires to disable account (0=never)
EXPIRE=60        # Days that a passwords lasts
SHELL=/bin/bash  # Default Shell (full path)
##
#  Defaults for the passwd command
##
PASSMIN=0        # Days between password changes
PASSWARN=14      # Days before password expires that a warning is given
##
#  Ensure that root is running the script.
##
WHOAMI=`/usr/bin/whoami`
if [ $WHOAMI != "root" ]; then
        echo "You must be root to add news users!"
        exit 1
fi
##
#  Ask for username and fullname.
##
echo ""
echo -n "Username: "
read USERNAME
echo -n "Full name: "
read FULLNAME
#
echo "Adding user: $USERNAME."
#
# Note that the "" around $FULLNAME is required because this field is
# almost always going to contain at least on space, and without the 
# the useradd command would think that you we moving on to the next
# parameter when it reached the SPACE character.
#
/usr/sbin/useradd -c"$FULLNAME" -d$HOME/$USERNAME -e$EXPIRE \
        -f$INACTIVE -g$GROUP -m -k$SKEL -s$SHELL $USERNAME
##
#  Set password defaults
##
/bin/passwd -n $PASSMIN -w $PASSWARN $USERNAME >/dev/null 2>&1
##
#  Let the passwd command actually ask for password (twice)
##
/bin/passwd $USERNAME
##
#  Show what was done.
##
echo ""
echo "Entry from /etc/passwd:"
echo -n "   "
grep "$USERNAME:" /etc/passwd
echo "Entry from /etc/shadow:"
echo -n "   "
grep "$USERNAME:" /etc/shadow
echo "Summary output of the passwd command:"
echo -n "   "
passwd -S $USERNAME
echo ""
</code> 

Utiliser un script pour ajouter des utilisateurs est
préférable à l'édition des fichiers
<tt>/etc/passwd</tt> et <tt>/etc/shadow</tt> ainsi qu'à l'utilisation
de programmes comme <tt>adduser</tt> de la distribution
Slackware. 

Vous êtes libre d'utiliser et de modifier le script
à en fonction de votre système.

Pour plus d'informations sur <tt>useradd</tt>, consultez le manuel en
ligne.

<sect2>usermod
<p>
Le programme <tt>usermod</tt> est utilisé pour modifier les
informations relatives à un utilisateur. Les options sont les
mêmes que pour <tt>useradd</tt>.

Disons que l'on souhaite changer le shell de <tt>fred</tt>. Vous
devrez faire la chose suivante:

<tscreen><verb>usermod -s /bin/tcsh fred</verb></tscreen>

Maintenant l'entrée concernant <tt>fred</tt> dans le fichier
<tt>/etc/passwd</tt> est devenue:

<tscreen><verb>fred:*:505:100:Fred
Flintstone:/home/fred:/bin/tcsh</verb></tscreen> 

On change la date d'expiration du compte au 15/09/97:

<tscreen><verb>usermod -e 09/15/97 fred</verb></tscreen>

Maintenant l'entrée concernant <tt>fred</tt> dans le fichier
<tt>/etc/shadow</tt> est devenue:
<tscreen><verb>fred:J0C.WDR1amIt6:9559:0:60:0:0:10119:0</verb></tscreen>

Pour plus d'informations concernant <tt>usermod</tt>, consultez la
page de manuel en ligne.

<sect2>userdel
<p>
<tt>userdel</tt> fait exactement ce que vous voulez, il efface le
compte d'un utilisateur. Utilisez simplement:
<tscreen><verb>userdel -r username</verb></tscreen>

L'option <tt>-r</tt> implique que tous les fichiers du
répertoire d'accueil d'un utilisateur seront
effacés. Les fichiers situés en dehors du
répertoire d'accueil devront être cherchés et
effacés manuellement.

Si vous souhaitez simplement vérouiller un compte au lieu de
l'effacer, utilisez la commande <tt>passwd</tt>.

<sect1>La commande passwd et la durée du mot de passe.
<p>
La commande <tt>passwd</tt> a pour but de changer les mots de passe. De
plus, elle est utilisée par l'utilisateur <sf>root</sf> pour:
<itemize>
<item>Vérouiller et dévérouiller des comptes (-l
et -u),
<item>Définir le nombre de jours de validité d'un mot de
passe (-x),
<item>Définir le nombre de jours minimums pour le changement de
mot de passe (-n),
<item>Définir le nombre de jours d'alerte concernant
l'expiration d'un mot de passe(-w),
<item>Définir le nombre de jours après que le mot de
passe soit expiré pour vérouiller le compte(-i),
<item>Permettre de voir les informations concernant un utilisateur
dans un format clair(-S).
</itemize>

Par exemple, jetons un coup d'oeil à <tt>fred</tt>:
<tscreen><verb>passwd -S fred
fred P 03/04/96 0 60 0 0</verb></tscreen>

Cela signifie que le mot de passe de <tt>fred</tt> est valide, qu'il a
été changé pour la dernière fois le
04/03/96, qu'il peut être changé à n'importe quel
moment, qu'il expire au bout de 60 jours, que <tt>fred</tt> ne sera
pas averti, et que le compte ne sera pas vérouillé lors
de l'expiration du mot de passe.

Cela veut simplement dire que si <tt>fred</tt> se loge après
l'expiration de son mot de passe, il lui sera demandé de taper
un nouveau mot de passe.

Si nous souhaitons prévenir <tt>fred</tt> 14 jours avant
l'expiration de son mot de passe, et vérouiller son compte 14
jours après l'avoir laissé expiré, nous devrions
faire la chose suivante:
<tscreen><verb>passwd -w14 -i14 fred</verb></tscreen>
Maintenant les informations concernant <tt>fred</tt> sont
changées en:
<tscreen><verb>fred P 03/04/96 0 60 14 14</verb></tscreen>

Pour de plus amples informations concernant <tt>passwd</tt>, se
référer au manuel en ligne.

<sect1>Le fichier login.defs
<p>
Le fichier <tt>/etc/login.defs</tt> est le fichier de configuration du
programme <tt>login</tt> ainsi que celui de toute le <em>Suite
Shadow</em>. 

Le fichier <tt>/etc/login.defs</tt> contient les paramètres
allant de l'apparance de l'invite à l'expiration par
défaut concernant les mots de passe utilisateurs.

Le fichier <tt>/etc/login.defs</tt> est assez bien documenté de
part ses propres commentaires. De plus, il y a quelques points a
noter:
<itemize>
<item>Il contient des drapeaux qui peuvent être activé ou
désactivé concernant la taille de journalisation,
<item>Il contient des pointeurs sur d'autres fichiers de
configuration,
<item>Il contient les valeurs par défaut comme la
durée d'un mot de passe.
</itemize>

Des informations précédantes on peut en déduire
que c'est un fichier important, vous devez être s&ucirc;r
qu'il existe et que les valeurs sont celles que vous désirez
pour votre système.

<sect1>Les mots de passe pour les groupes
<p>
Le fichier <tt>/etc/groups</tt> peut contenir des mots de passe
permettant à un utilisateur de devenir un membre d'un groupe
particulier. Cette fonction est validée si vous 
validez la constante <tt>SHADOWGRP</tt> dans le fichier
<tt>/usr/src/shadow-AAMMJJ/config.h</tt>.

Si vous définissez cette constante et que vous compilez, vous
devez créer un fichier <tt>/etc/gshadow</tt> pour stocker les
mots de passe pour les groupes, ainsi que les informations concernant
l'administration du groupe.

Lorsque vous avez créé le fichier <tt>/etc/shadow</tt>,
vous avez utilisé un programme appelé <tt>pwconv</tt>,
il n'y a pas d'équivalent pour créer le fichier
<tt>/etc/gshadow</tt>, mais ce n'est pas grave.

Pour créer le fichier <tt>/etc/gshadow</tt> initial, faites la
chose suivante:
<tscreen><verb>touch /etc/gshadow
chown root.root /etc/gshadow
chmod 700 /etc/gshadow</verb></tscreen>

Une fois que vous créez un nouveau groupe, il sera
ajouté dans le fichier <tt>/etc/group</tt> ainsi que dans le
fichier <tt>/etc/gshadow</tt>. Si vous modifiez un groupe en ajoutant,
retirant, ou en changeant le mot de passe du groupe, le fichier
<tt>/etc/gshadow</tt> sera changé.

Les programmes <tt>groups</tt>, <tt>groupadd</tt>, <tt>groupmod</tt>,
et <tt>groupdel</tt> sont fournis dans la <em>Suite Shadow</em> pour
modifier les groupes.

Le format du fichier <tt>/etc/group</tt> est:
<tscreen><verb>groupname:!:GID:member,member,...</verb></tscreen>
où:
<descrip>
<tag/<tt>groupname</tt></tag> Le nom du groupe,
<tag/<tt>!</tt></tag> Le champs contenant normalement le mot de passe
qui est maintenant stocké dans le fichier <tt>/etc/gshadow</tt>,
<tag/<tt>GID</tt></tag> L'identificateur numérique du groupe,
<tag/<tt>member</tt></tag> La liste des membres du groupe.
</descrip>

Le format du fichier <tt>/etc/gshadow</tt> est:
<tscreen><verb>groupname:password:admin,admin,...:member,member,...</verb></tscreen>
où:
<descrip>
<tag/<tt>groupname</tt></tag> Le nom du groupe,
<tag/<tt>password</tt></tag> Le mot de passe encodé,
<tag/<tt>admin</tt></tag> La liste des administrateurs de groupe,
<tag/<tt>member</tt></tag> La liste des membres du groupe.
</descrip>

La commande <tt>gpasswd</tt> est utilisée pour ajouter, retirer
des administrateurs et des membres d'un groupe. <sf>root</sf> ou un
administrateur du groupe peut ajouter ou retirer des membres du groupe.

Le mot de passe du groupe peut être changé en utilisant
le programme <tt>passwd</tt> par <sf>root</sf> ou un administrateur du
groupe.

En dépit du fait qu'il n'y ait pas encore de page de manuel
pour <tt>gpasswd</tt>, tapez <tt>gpasswd</tt> sans paramètres
pour obtenir la liste des options. C'est relativement facile de
comprendre comment tout marche un fois que vous avez compris le format
du fichier et les concepts.

<sect1>Programmes de vérification de la structure
<p>
<sect2>pwck
<p>
Le programme <tt>pwck</tt> est fourni pour vérifier la
cohérence des fichiers <tt>/etc/passwd</tt> et
<tt>/etc/shadow</tt>. Il vérifie chaque nom d'utilisateur
ainsi que les points suivants:
<itemize>
<item>Le nombre correct de champs,
<item>Nom unique,
<item>Nom et groupe valide,
<item>Groupe primaire valide,
<item>Répertoire d'accueil valide,
<item>Shell valide.</itemize>

Il prévient aussi lorsqu'un compte ne possède pas de mot
de passe.

C'est une bonne idée de lancer <tt>pwck</tt> après avoir
installé la <em>Suite Shadow</em>. C'est aussi une bonne
idée de le lancer périodiquement, une fois par semaine
ou par mois. Si vous utilisez l'option <tt>-r</tt>, vous pouvez
utiliser <tt>cron</tt> pour lancer une analyse régulière
et avoir un rapport sous forme de courrier.

<sect2>grpck
<p>
<tt>grpck</tt> est le programme de vérification de la
cohérance des fichiers <tt>/etc/group</tt> et
<tt>/etc/gshadow</tt>. Il effectue les vérifications suivantes:
<itemize>
<item>Le nombre correct de champs,
<item>Unicité du nom de groupe,
<item>Validité de la liste des membres et des administrateurs.
</itemize>

Il possède aussi l'option <tt>-r</tt> pour des rapports
automatiques.

<sect1>Les mots de passe "Accès à distance"
<p>
Les mots de passe "Accès à distance" sont une autre
ligne de défense des systèmes permettant la connexion
à distance. Si vous avez un système qui permet à
des utilisateurs de se connecter localement ou par
l'intermédiaire d'un réseau, mais vous voulez
contr&ocirc;ler qui peut appeler et se connecter, les mots de passe
"Accès à distance" sont pour vous. Pour valider les mots
de passe "Accès à distance", vous devez éditer le
fichier <tt>/etc/login.defs</tt> et vous assurer que
<tt>DIALUPS_CHECK_ENAB</tt> est positionnée à <tt>yes</tt>.

Les deux fichiers contenant les informations d'accès à
distance sont <tt>/etc/dialups</tt> et <tt>/etc/d_passwd</tt>.
Le fichier <tt>/etc/dialups</tt> contient les terminaux (un par ligne, avec
l'entête "<tt>/dev/</tt>" supprimé). Si un terminal est
listé alors, la vérification d'accès à
distance est effectuée;.

Le second fichier <tt>/etc/d_passwd</tt> contient le chemin complet
d'un shell, suivit d'un mot de passe optionnel.

Si un utilisateur se connecte à un terminal décrit dans une ligne du
fichier <tt>/etc/dialup</tt> et que son shell est listé dans le
fichier <tt>/etc/d_passwd</tt> alors l'accès lui est autorisé en
fournissant le mot de passe correct.

Une autre possibilité utile des mots de passe "Accès
à distance" est de spécifier un ligne qui ne permet
qu'un certain type de connexion (PPP, ou UUCP par exemple). Si un
utilisateur essaye d'avoir un autre type de connexion, (ie. une liste
de shell), il doit connaitre un mot de passe pour l'utiliser.

Avant de pouvoir utiliser les possibilités de l'accès
à distance, vous devez créer les fichiers.

La commande <tt>dpaswd</tt> est fournie pour assigner un mot de passe
à un shell dans le fichier <tt>d_passwd</tt>. Lisez le manuel
en ligne pour de plus amples informations.

<sect>Ajouter le support shadow à un programme en C. <label id="sec-prog">
<p>
Ajouter le support shadow à un programme C est assez facile. Le
seul problème est que le programme doit être lancé par root (ou SUID root) 
pour qu'il puisse accéder au fichier <tt>/etc/shadow</tt>.
<p>
Ceci présente un réel problème, il faut faire très attention lors de la
création de programmes SUID. Par exemple, il ne faut pas qu'un programme
SUID root puisse permettre un accès au shell.
<p>
La meilleure solution pour qu'un programme puisse accéder aux mots de passe
encodés sans être SUID root, est de lancer
ce programme SUID shadow à la place. C'est le cas par exemple du programme
<tt>xlock</tt>.
<p>
Dans l'exemple donné précédemment, <tt>pppd-1.2.1d</tt> fonctionne déjà
SUID root, donc ajouter le support shadow ne le rendra pas plus vulnérable.

<sect1>Les fichiers d'en-tête
<p>
Les fichiers d'en-tête doivent être stockés dans le répertoire
<tt>/usr/include/shadow</tt>. Le fichier <tt>/usr/include/shadow.h</tt>,
doit être un lien symbolique vers <tt>/usr/include/shadow/shadow.h</tt>.
<p>
Pour ajouter le support shadow à un programme, vous devez inclure les
fichiers de header:
<verb>
#include <shadow/shadow.h>
#include <shadow/pwauth.h>
</verb>
<p>
La meilleure solution est d'utiliser des directives de compilation pour
compiler conditionnellement le code shadow (Il y aura un exemple par la
suite).

<sect1>La bibliothèque libshadow.a
<p>
Quand vous avez installé <em>l'ensemble shadow</em>, le fichier
<tt>libshadow.a</tt> a été créé et installé dans le répertoire <tt>/usr/lib</tt>.
<p>
Lorsque vous compilez un programme avec le support shadow, vous devez
préciser à l'éditeur de liens d'inclure la bibliothèque <tt>libshadow.a</tt>
dans le lien:
<p>
<tscreen><verb>gcc programe.c -o program -lshadow</verb></tscreen>
<p>
Ceci dit, et vous le verrez par la suite dans notre exemple, la plupart des
programmes plus ou moins gros utilisent un fichier <tt>Makefile</tt>, qui en général,
utilise une variable appelée LIBS=... que vous pourrez modifier.

<sect1>La structure shadow
<p>
La bibliothèque <tt>libshadow.a</tt> utilise une structure appelée 
<tt>spwd</tt> pour récupérer les informations contenues dans le fichier
<tt>/etc/shadow</tt>. Voici la définition de la structure <tt>spwd</tt>
provenant de <tt>/usr/include/shadow/shadow.h</tt>:
<code>
struct spwd
{
  char *sp_namp;         /* nom de login */
  char *sp_pwdp;         /* mot de passe encode */
  sptime sp_lstchg;      /* date de la derniere modification */
  sptime sp_min;         /* nombre de jours minimum entre les modifs */
  sptime spmax;          /* nombre de jours maximum entre les modifs*/
  sptime sp_warn;        /* nombre de jours de warning avant l'expiration
                            du mot de passe */
  sptime sp_inact;       /* nombre de jours d'utilisation du compte
                            apres l'expiration. */
  sptime sp_expire;      /* nombre de jours a partir du 01/01/70 jusqu'a
			       l'expiration du compte */
  unsigned long sp_flag; /* reserve pour une utilisation future */
};
</code>
<p>
L'<em>ensemble shadow</em> peut placer des données dans le champ <tt>sp_pwdp</tt>
juste après le mot de passe encodé, le champ password pourrait contenir:
<tscreen><verb>username:Npge08pfz4wuk;@/sbin/extra:9479:0:10000::::</verb></tscreen>
<p>
Cela signifie qu'en plus du mot de passe, le programme <tt>/sbin/extra</tt> sera
appelé pour procéder à une authentification supplémentaire. Le programme appelé
recevra comme argument, le nom d'utilisateur et un <em>switch</em> qui indiquera pourquoi il
est appelé. Regardez le fichier <tt>/usr/include/shadow/pwauth.h</tt> et le
code source de <tt>pwauth.c</tt> pour plus d'informations.
<p>
La fonction d'authentification <tt>pwauth</tt> est toujours utilisée
avant la deuxième authentification..

<sect1>Les fonctions Shadow.
<p>
Le fichier <tt>shadow.h</tt> contient aussi la déclaration des
fonctions contenues dans la bibliothèque <tt>libshadow.a</tt>:
<code>
extern void setspent __P ((void));
extern void endspent __P ((void));
extern struct spwd *sgetspent __P ((__const char *__string));
extern struct spwd *fgetspent __P ((FILE *__fp));
extern struct spwd *getspent __P ((void));
extern struct spwd *getspnam __P ((__const char *__name));
extern int putspent __P ((__const struct spwd *__sp, FILE *__fp));
</code>
<p>
La fonction que nous allons étudier est <tt>getspnam</tt>, elle récupère une
structure <tt>spwd</tt> à partir d'un nom donné.

<sect1>Exemple
<p>
Voici un exemple d'ajout du support shadow à un programme qui en nécessite
mais pour qui ce support n'existe pas par défaut.
<p>
Nous allons nous baser sur l'exemple du serveur <tt>pppd-1.2.1d</tt> (
<em>Serveur Point-to-Point protocol</em>) configuré avec l'option
<em>login</em>:
il va chercher les mots de passe pour son authentification PAP dans le fichier
<tt>/etc/passwd</tt> au lieu des fichiers PAP ou CHAP. Vous n'avez pas besoin
d'ajouter ce code à <tt>pppd-2.2.0</tt>, c'est déjà fait.
<p>
Bien que cette possibilité de pppd ne soit pas très utilisée, 
elle ne fonctionnera plus dès lors que vous aurez installé l'ensemble
shadow: les mots de passe ne sont plus stockés dans <tt>/etc/passwd</tt>.
<p>
La partie du code source d'authentification des utilisateurs avec
<tt>pppd-1.2.1d </tt> se trouve dans le fichier
<tt>/usr/src/pppd-1.2.1d/pppd/auth.c</tt>.
<p>
Le code qui suit doit être ajouté au début du fichier, là où sont toutes les
autres directives <tt>#include</tt>.
<code>
#ifdef HAS_SHADOW
#include <shadow.h>
#include <shadow/pwauth.h>
#endif
</code>
<p>
Maintenant, il faut modifier le code actuel. Nous sommes toujours avec le
fichier <tt>auth.c</tt>.
<p>
La fonction <tt>auth.c</tt> avant les modifications:
<code>
/*
 * login - Controle le nom d'utilisateur et le mot de passe par rapport
 * a ceux stockes sur le systeme.
 * Accepte la connection si l'utilisateur est OK.
 *
 * retourne:
 *      UPAP_AUTHNAK: Connection refusee.
 *      UPAP_AUTHACK: Connection Acceptee.
 * Dans un cas comme dans l'autre, msg pointe sur le message approprie.
 */
static int
login(user, passwd, msg, msglen)
    char *user;
    char *passwd;
    char **msg;
    int *msglen;
{
    struct passwd *pw;
    char *epasswd;
    char *tty;

    if ((pw = getpwnam(user)) == NULL) {
        return (UPAP_AUTHNAK);
    }
     /*
     * XXX Si il n'y a pas de mots de passe, accepte la connection.
     */
    if (pw->pw_passwd == '\0') {
        return (UPAP_AUTHACK);
    }

    epasswd = crypt(passwd, pw->pw_passwd);
    if (strcmp(epasswd, pw->pw_passwd)) {
        return (UPAP_AUTHNAK);
    }

    syslog(LOG_INFO, "user %s logged in", user);

    /*
     * Ecris une entree wtmp pour cet utilisateur.
     */
    tty = strrchr(devname, '/');
    if (tty == NULL)
        tty = devname;
    else
        tty++;
    logwtmp(tty, user, "");    /* Ajoute une entree wtmp de connection */
    logged_in = TRUE;

    return (UPAP_AUTHACK);
}
</code>
<p>

Le mot de passe de l'utilisateur est placé dans <tt>pw->pw_passwd</tt>,
donc, nous devons ajouter la fonction <tt>getspnam</tt> qui placera le mot
de passe dans <tt>spwd->sp_pwdp</tt>.
<p>
Nous rajouterons la fonction <tt>pwauth</tt> pour l'authentification
actuelle. Une seconde authentification sera effectuée si le fichier
shadow est configuré pour.
<p>
Voici la fonction auth.c apres les modifications pour le support de shadow:
<code>
/*
 * login - Controle le nom d'utilisateur et le mot de passe par rapport
 * a ceux stockes sur le systeme.
 * Accepte la connection si l'utilisateur est OK.
 *
 * Cette fonction a ete modifiee pour etre compatible avec les mots de
 * passe Shadow Linux si USE_SHADOW a ete defini
 *
 * retourne:
 *      UPAP_AUTHNAK: Connection refusee.
 *      UPAP_AUTHACK: Connection Acceptee.
 * Dans un cas comme dans l'autre, msg pointe sur le message approprie.
 */

static int
login(user, passwd, msg, msglen)
    char *user;
    char *passwd;
    char **msg;
    int *msglen;
{
    struct passwd *pw;
    char *epasswd;
    char *tty;

#ifdef USE_SHADOW
    struct spwd *spwd;
    struct spwd *getspnam();
#endif

    if ((pw = getpwnam(user)) == NULL) {
        return (UPAP_AUTHNAK);
    }

#ifdef USE_SHADOW
    if ((spwd = getspnam(user)) == NULL) {
           pw->pw_passwd = "";
    } else {
    pw->pw_passwd = spwd->sp_pwdp;
    }
#endif

     /*
     *  XXX Si il n'y a pas de mots de passe, accepte la connection.
     */
    if (pw->pw_passwd == '\0') {
        return (UPAP_AUTHNAK);
    }
#ifdef HAS_SHADOW
    if ((pw->pw_passwd && pw->pw_passwd[0] == '@'
         && pw_auth (pw->pw_passwd+1, pw->pw_name, PW_LOGIN, NULL))
        || !valid (passwd, pw)) {
        return (UPAP_AUTHNAK);
    }
#else
    epasswd = crypt(passwd, pw->pw_passwd);
    if (strcmp(epasswd, pw->pw_passwd)) {
        return (UPAP_AUTHNAK);
    }
#endif

    syslog(LOG_INFO, "user %s logged in", user);

    /*
     * Ecris une entree wtmp pour cet utilisateur.
     */
    tty = strrchr(devname, '/');
    if (tty == NULL)
        tty = devname;
    else
        tty++;
    logwtmp(tty, user, "");     /* Ajoute une entree wtmp de connection  */
    logged_in = TRUE;

    return (UPAP_AUTHACK);
}
</code>
<p>
En examinant précisément le code, vous verrez que d'autres modifications ont
été effectuées. La version originale autorisait l'accès (en retournant 
<tt>UPAP_AUTHACK</tt>) quand il n'y avait
pas de mots de passe dans le fichier <tt>passwd</tt>. Il ne fallait
<em>pas</em> laisser ceci car utilisé avec l'option <tt>login</tt>, pppd
utilise le nom d'utilisateur dans <tt>/etc/passwd</tt> et le mot de passe dans
<tt>/etc/shadow</tt> pour son authentification PAP.
<p>
Donc si nous avions gardé la version originale, n'importe qui aurait pu
établir une connexion ppp avec un mot de passe vide.
<p>
Nous avons arrangé ça en retournant <tt>UPAP_AUTHNAK</tt> à la place de
<tt>UPAP_AUTHACK</tt> dans le cap ou le champ mot de passe est vide.
<p>
A savoir que pppd-2.2.0 possède le même problème.
<p>
Nous devons modifier le Makefile pour que deux choses soient
prises en compte:
<tt>USE_SHADOW</tt> doit être défini, et <tt>libshadow.a</tt> doit être ajouté
au processus d'édition de liens.
<p>
Editez le Makefile, et ajoutez:
<tscreen><verb>LIBS = -shadow
</verb></tscreen>
<p>
Alors, trouvez la ligne:
<tscreen><verb>COMPILE_FLAGS = -I.. -D_linux_=1 -DGIDSET_TYPE=gid_t
</verb></tscreen>
<p>
et replacez-la par:
<tscreen><verb>COMPILE_FLAGS = -I.. -D_linux_=1 -DGIDSET_TYPE=gid_t -DUSE_SHADOW
</verb></tscreen>
<p>
Maintenant, lancez make et installez.

<sect>Foire Aux Questions
<p>
<em>Q:</em> J'essaye de contr&ocirc;ler sur quel terminal <sf>root</sf>
peut se connecter en utilisant <tt>/etc/securettys</tt>, mais il
semble que cela ne marcher plus. Qu'arrive-t-il ?

<em>R:</em> Les fichier <tt>/etc/securettys</tt> ne fait absolument
rien lorsque la <em>Suite Shadow</em> est installée. Le terminal
à partir duquel <sf>root</sf> peut se connecter et maintenant
situé dans le fichier <tt>/etc/login.defs</tt>. L'entrée
dans ce fichier peut pointer sur un autre fichier.

<em>Q:</em> J'ai installé la <em>Suite Shadow</em>, mais je ne
peux plus me connecter, qu'ai-je oublié ?

<em>R:</em> Vous avez probablement installé les programmes,
mais vous n'avez très certainement pas exécuté
<tt>pwconv</tt> ou bien vous avez oublié de copier le fichier
<tt>/etc/npasswd</tt> vers le fichier <tt>/etc/passwd</tt> ainsi que
le fichier <tt>/etc/nshadow</tt> vers le fichier
<tt>/etc/shadow</tt>. De plus vous aurez besoin de placer le fichier
<tt>login.defs</tt> dans le répertoire <tt>/etc/</tt>.

<em>Q:</em> Dans la section sur <sf>xlock</sf>, il est dit de
positionner le groupe propiétaire du fichier
<tt>/etc/shadow</tt> à <tt>shadow</tt>. Je n'ai pas de groupe
<tt>shadow</tt>, comment je fais ?

<em>R:</em> Vous pouvez en ajouter un. Editez simplement le fichier
<tt>/etc/group</tt> et insérez une ligne pour le groupe
<tt>shadow</tt>. Vous devez vous assurer que le numéro du
groupe n'est pas déjà utilisé par un autre
groupe, de plus vous devez l'insérer avant l'entrée
<tt>nogroup</tt>. Ou bien vous pouvez positionner le bit <tt>suid</tt>
du programme <tt>xlock</tt> à <sf>root</sf>.

<em>Q:</em> Y-a-t'il une liste de diffusion pour la suite Shadow
password de Linux ?

<em>R:</em> Oui, mais c'est pour le développement et les tests
des béta versions de la prochaine Suite Shadow pour Linux. Vous
pouvez vous y inscrire en envoyant un courrier à:
<tt>shadow-list-request@neptune.cin.net</tt> avec pour sujet
<tt>subscribe</tt>. La liste est actuellement en cours de discussion
à propos des parutions des series <tt>shadow-AAMMJJ</tt>. Vous
devriez vous inscrire si vous souhaitez vous investir dans le
développement ou bien si vous venez d'installer la suite sur
votre système et que vous souhaitez vous tenir informé
des nouvelles parutions.

<em>Q:</em> J'ai installé la <em>Suite Shadow</em>, mais
lorsque j'utilise la commande <tt>userdel</tt>, j'obtiens,
``<em>userdel: cannot open shadow group file''</em>, qu'est-ce que j'ai
fait de travers ?

<em>R:</em> Vous avez compilé la suite avec l'option
<tt>SHADOWGRP</tt> de validé, mais vous ne possédez pas
de fichier <tt>/etc/gshadow</tt>. Vous avez besoin d'éditer le
fichier <tt>config.h</tt> et de recompiler la suite. Allez voir la
section sur les groupes shadow.

<em>Q:</em> J'ai installé la <em>Suite Shadow</em> mais je
retrouve des mot de passe encodés dans mon fichier
<tt>/etc/passwd</tt>, qu'est-ce qui ne va pas ?

<em>R:</em> Soit vous avez compilé la suite avec l'option
<tt>AUTOSHADOW</tt> du fichier <tt>config.h</tt>, soit votre
<tt>libc</tt> a été compilée avec l'option
<tt>SHADOW_COMPAT</tt>. Vous devez déterminer quel est votre
problème et recompilez.

<sect>Copyright.
<p>
La version originale de ce document est placée sous copyright (c) 1996 de
Michael H. Jackson.
<p>
Ce document peut être reproduit et distribué en tout ou partie, sur tout
support physique ou électronique, à condition que cette notice soit
incluse dans chacune des copies.
<p>
Il est permis de copier et distribuer des versions modifiées de ce document
dans les conditions ci-dessus. Une notice doit apparaître spécifiant bien qu'il
s'agit d'une version modifiée.
<p>
Il est permis de copier et distribuer des versions traduites dans d'autres
langues, dans les conditions générales citées précédemment.
<p>
Il est permis de diffuser ce document sous un autre support selon les
clauses stipulées plus haut concernant les versions modifiées du document,
et sous réserve que celle spécifiant la disponibilité du code source
soit remplie sous la forme d'une référence évidente sur ce code dans ce
nouveau support. Le propriétaire du copyright se réserve le droit de
trancher lorsqu'il y a le moindre doute sur cette définition "d'évidence".



<sect>Divers et Remerciements
<p>
Les exemples de code pour <tt>auth.c</tt> proviennent de <tt>pppd-1.2.1d</tt> et
<tt>ppp-2.1.0e</tt>, Copyright (c) 1993 de l'Université Nationale D'Australie
et Copyright (c) 1989 de Université Carnegie Mellon.

Merci à <htmlurl url="mailto:marekm@il7linuxb.ists.pwr.wroc.pl"
name="Marek Michalkiewicz &lt;marekm@il7linuxb.ists.pwr.wroc.pl&gt;">
pour écrire et maintenir la <em>Suite Shadow pour Linux</em>
ainsi que pour ses commentaires sur ce document.

Merci à <htmlurl url="mailto:rtidd@tscnet.com"
name="Ron Tidd &lt;rtidd@tscnet.com&gt;"> pour sa précieuse
aide et ses tests.

Merci à tous ceux qui m'ont envoyé des commentaires qui
ont permis d'améliorer ce document.

S'il vous plait, si vous avez des suggestions ou des commentaires,
envoyez-moi un courrier.

amitiés

<htmlurl url="mailto:mhjack@tscnet.com"
name="Mickael H. Jackson &lt;mhjack@tscnet.com&gt;">

</article>
