<h2>But de ce document</h2>
<p class="spip">Ce document me sert de mémo pour la compréhension et la configuration de <strong class="spip">PAM (Pluggable Authentification Modules » sous Debian</strong>. Je le diffuse en espérant qu’il serve à d’autres personnes.</p>

<h2>PAM c’est quoi ?</h2>
<p class="spip">Le système PAM est un ensemble de modules permettant de gérer l’authentification sur un système Linux.</p>

<p class="spip">Cela permet de rendre les différents programmes nécessitant une authentification (login, su, ssh, kdm,..) indépendants de la base de données gérant les comptes utilisateurs (passwd, LDAP, MySQL, Domaine Windows avec Winbind,...).</p>

<p class="spip">De plus avec PAM, l’authentification ne se limite pas à la gestion d’un login/password, mais va beaucoup plus loin comme nous le verrons dans ce document.</p>

<h2>ATTENTION</h2>
<p class="spip">Une erreur dans la modification des fichiers de configuration de PAM peut entraîner l’impossibilité de se connecter même sous root. Avant de modifier la configuration, il est fortement recommandé de se connecter sous une autre console en root pour pouvoir corriger le problème.</p>

<h2>Les 4 groupes de modules</h2>
<p class="spip">Dans un fichier de configuration de PAM, nous allons retrouver les différents modules répartis en 4 groupes. Un module (ex : pam_unix.so) pouvant être utilisé dans plusieurs groupes.</p>

<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Groupe</strong></th><th scope='col'><strong class="spip">Fonction</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td>auth</td><td>Authentification : Établit en général la correspondance entre l’utilisateur et le mot de passe, mais toutes les authentifications ne sont pas de ce type, il existe par exemple des schémas d’authentification basés sur le matériel.</td></tr>
<tr class="row_odd"><td>account</td><td>Vérification du compte utilisateur : Est-ce que le mot de passe est encore valide ? ; Cet utilisateur a t-il le droit d’accéder au service demandé ? L’utilisateur a t-il le droit de se connecter à cette date et à cette heure ?</td></tr>
<tr class="row_even"><td>password</td><td>Habituellement, les services sont fortement couplés avec un des groupes auth. Ce groupe permet par exemple d’autoriser le changement de mot de passe.</td></tr>
<tr class="row_odd"><td>session</td><td>Ce groupe est utilisé après l’authentification pour ouvrir la session, monter les répertoires personnels, activer sa boite mail,...</td></tr>
</tbody>
</table>
<h2>Présentation des différents fichiers de configurations de PAM</h2>
<p class="spip">Les fichiers de configurations de PAM, sont disponibles dans « <strong class="spip">/etc/pam.d/</strong> ».</p>

<p class="spip">Dans ce dossier, nous retrouverons un fichier de configuration pour chaque service (programme) ayant besoin d’une authentification (su, login, ssh, ftp,..). Nous trouverons également des fichiers communs (common-*) permettant de simplifier la configuration. Ces fichiers communs seront inclus dans les fichiers des services à l’aide de la directive « @include common-* ».</p>

<p class="spip">Présentation de quelques fichiers disponibles dans « /etc/pam.d/ :</p>

<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Fichier</strong></th><th scope='col'><strong class="spip">Commentaire</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td>common-account</td><td>Fichier commun pour les modules du groupe « account »</td></tr>
<tr class="row_odd"><td>common-auth</td><td>Fichier commun pour les modules du groupe « auth »</td></tr>
<tr class="row_even"><td>common-password</td><td>Fichier commun pour les modules du groupe « password »</td></tr>
<tr class="row_odd"><td>common-session</td><td>Fichier commun pour les modules du groupe « session »</td></tr>
<tr class="row_even"><td>kdm</td><td>Utilisé pour l’authentification de KDM</td></tr>
<tr class="row_odd"><td>kscreensaver</td><td>Utilisé pour l’authentification pour la sortie de l’écran de veille avec un mot de passe ou pour le déverrouillage de la session.</td></tr>
<tr class="row_even"><td>login</td><td>Utilisé pour l’authentification sur une console (ex : ALT+F1)</td></tr>
<tr class="row_odd"><td>ssh</td><td>Utilisé pour l’authentification de ssh</td></tr>
<tr class="row_even"><td>su</td><td>Utilisé pour l’authentification de su (changement d’utilisateur)</td></tr>
<tr class="row_odd"><td>sudo</td><td>Utilisé par sudo</td></tr>
</tbody>
</table>
<h2>Les indicateurs de contrôle de PAM</h2>
<p class="spip">Lors d’une vérification, chaque module retourne un résultat et en fonction de celui-ci et de l’indicateur de contrôle indiqué avant, PAM sait ce qu’il doit faire.</p>

<p class="spip">Il existe plusieurs indicateurs de contrôle :</p>

<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Indicateur</strong></th><th scope='col'><strong class="spip">Description</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td>required</td><td>Si le résultat du test échoue, les autres modules sont quand même analysés avant de prendre une décision finale.</td></tr>
<tr class="row_odd"><td>sufficient</td><td>Si le résultat est positif, le résultat global sera positif même si les modules précédents de type « required » étaient en échec.</td></tr>
<tr class="row_even"><td>requisite</td><td>Si le résultat du test échoue, l’analyse est interrompue et l’utilisateur est immédiatement averti de l’échec.</td></tr>
<tr class="row_odd"><td>optional</td><td>Que le résultat soit positif ou négatif, cela n’aura aucune importance dans l’authentification globale sauf si ce module est le seul testé.</td></tr>
</tbody>
</table>
<h2>Les arguments passés en options</h2>
<p class="spip">Chaque module peut utiliser des arguments. Ceux-ci sont écrits à la fin du nom du module. Par exemple, voici les arguments que le l’on peut trouver pour le module « pam_unix » :</p>

<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Arguments</strong></th><th scope='col'><strong class="spip">Description</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td>debug</td><td>Augmente les logs dans syslog</td></tr>
<tr class="row_odd"><td>use_first_pass</td><td>Reprend le mot de passe fourni par le module précédent pour éviter à l’utilisateur de le saisir plusieurs fois</td></tr>
<tr class="row_even"><td>nullok</td><td>Autorise les mots de passe vides </td></tr>
</tbody>
</table>
<h2>Exemple de fichier de configuration</h2>
<p class="spip">Dans un fichier nous retrouverons, un ou plusieurs modules avec un indicateur de contrôle (required, sufficient,..) avant le nom du module et éventuellement des options de configuration après (debug, nullok, use_first_pass ,..)</p>

<p class="spip"><strong class="spip">Attention</strong> : L’ordre des modules dans un fichier de configuration de PAM est important.</p>

<p class="spip">Un fichier de configuration PAM ressemble à ceci :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>#%PAM-1.0<br />
auth      required  pam_securetty.so<br />
auth      required  pam_unix.so shadow nullok<br />
auth      required  pam_nologin.so<br />
account   required  pam_unix.so<br />
password  required  pam_cracklib.so<br />
password  required  pam_unix.so shadow nullok use_authtok<br />
session   required  pam_unix.so</code></div>
<p class="spip">La première ligne est un commentaire car elle commence par un #</p>

<p class="spip"><code class='spip_code' dir='ltr'>auth      required  pam_securetty.so</code></p>

<p class="spip">Cette ligne sert à s’assurer que, si l’utilisateur essaie de se connecter en tant qu’utilisateur root, le terminal sur lequel il se connecte fait partie de la liste se trouvant dans le fichier /etc/securetty, si ce fichier existe.</p>

<p class="spip"><code class='spip_code' dir='ltr'>auth      required  pam_unix.so shadow nullok</code></p>

<p class="spip">Cette ligne fait en sorte que le mot de passe de l’utilisateur soit demandé et vérifié.</p>

<p class="spip"><code class='spip_code' dir='ltr'>auth      required  pam_nologin.so</code></p>

<p class="spip">Cette ligne vérifie si le fichier /etc/nologin existe. Si c’est le cas et que l’utilisateur n’est pas un utilisateur root, l’authentification échoue.</p>

<p class="spip"><code class='spip_code' dir='ltr'>account   required  pam_unix.so</code></p>

<p class="spip">Cette ligne active la vérification des comptes si nécessaire. Par exemple, si des mots de passe masqués ont été activés, le module pam_unix.so vérifie si le compte est périmé ou si l’utilisateur a changé son mot de passe pendant le délai de grâce alloué.</p>

<p class="spip"><code class='spip_code' dir='ltr'>password  required  pam_cracklib.so</code></p>

<p class="spip">Cette ligne teste les mots de passe récemment modifiés afin de déterminer s’ils peuvent être détectés facilement par un programme de détermination de mots de passe utilisant un dictionnaire.</p>

<p class="spip"><code class='spip_code' dir='ltr'>password  required  pam_unix.so shadow nullok use_authtok</code></p>

<p class="spip">Cette ligne spécifie que le module pam_unix.so doit être utilisé si le programme login change le mot de passe de l’utilisateur. (Cela ne se produit que lorsqu’un module auth détermine que le mot de passe doit être changé - quand un mot de passe masqué est périmé, par exemple.)</p>

<p class="spip"><code class='spip_code' dir='ltr'>session   required  pam_unix.so</code></p>

<p class="spip">Cette ligne indique que le module pam_unix.so doit être utilisé pour gérer la session. En ce moment, ce module ne fait rien du tout ; il pourrait être remplacé par tout autre module nécessaire ou complété par la superposition de modules.</p>

<h2>Autres sources de documentation :</h2>
<p class="spip">Page de man en français : <a href="http://www.delafond.org/traducmanfr/man/man8/pam.8.html" class="spip_out">http://www.delafond.org/traducmanfr/man/man8/pam.8.html</a></p>

<p class="spip">La bible sur PAM en anglais : <a href="http://www.kernel.org/pub/linux/libs/pam/" class="spip_out">http://www.kernel.org/pub/linux/libs/pam/</a></p>

<p class="spip">Référence des modules : <a href="http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/pam-6.html" class="spip_out">http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/pam-6.html</a></p>

<h2>Historique des modifications</h2>
<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Version</strong></th><th scope='col'><strong class="spip">Date</strong></th><th scope='col'><strong class="spip">Commentaire</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td>0.1</td><td>13/07/06</td><td>Création par Tony GALMICHE</td></tr>
<tr class="row_odd"><td>0.2</td><td>15/08/06</td><td>Mise en ligne</td></tr>
</tbody>
</table>