PAM



1 Pour quoi faire ?

Les PAM (pluggable module authentification) est un moyen modulable d'authentifier des utilisateurs. On peut ainsi définir des stratégies sans avoir à recompiler les programmes qui supportent PAM. En fait PAM, évite que chaque application ne vous redemande une authentification avec des règles différentes à chaque fois.
Avez vous besoin de toucher à cela?
La plupart du temps non, mais si vous souhaitez renforcer la sécurité (obliger des mots de passe qui ne sont pas dans un dictionnaire par exemple), l'uniformiser ou adopter une autre méthode d'authentification (ldap par exemple) alors la réponse est oui.
   

2 L'installation

Il est installé sur tous les unix - linux par défaut. Toutefois il existe des petites différences. 
Dans certains cas on trouve l'ensemble de la configuration dans /etc/pam.conf (BSD), sous RedHat, Mandrake on a un fichier par service dans /etc/pam.d/. Si le fichier /etc/pam.d correspondant existe le fichier /etc/pam.conf est ignoré.
Le fichier principal dans le cas de l'existence de /etc/pam.d est system-auth.
Les modules appelés dans les différents fichiers de configuration se trouvent dans /lib/security (ou /usr/lib/) cela dépend de la distribution. Vérifiez donc que le module que vous souhaitez utiliser existe.
Enfin on trouve dans /etc/security des fichiers complémentaires (access.conf, group.conf, limits.conf, time.conf)  utilisés par certaines applications. 

4 La syntaxe de configuration 

       Il y a une petite différence si vous avez cela dans pam.conf ou dans /etc/pam.d, mais le principe est le même.
login    auth    required    /lib/security/pam_securetty.so
login    account    requisite    /lib/security/pam_roles.so

Voilà deux lignes seulement pour vous montrer la syntaxe.
Le premier champ indique le nom de l'application. Il n'existe que pour le fichier pam.conf.
Le deuxième indique le type de module. Il peut prendre les valeurs suivantes :
  
auth    authentifie l'utilisateur par une demande de mot de passe ou par une autre méthode.
account    restriction du compte : expiration, en fonction de l'heure, de la machine source, des ressources disponibles.
password    Gestion des mots de passe. 
session    Tout ce qui concerne l'ouverture d'une session, avant et après.

Le troisième champ est ce que l'on appelle un drapeau de contrôle. Il peut prendre les valeurs suivantes :
required    Doit réussir, mais on continue à tester les autres modules malgré tout. Echec est renvoyé. L'avantage par rapport à requisite étant que l'on ne donne pas la raison de l'échec de la connexion.
requisite    Doit réussir, on ne continue pas à lire les autres modules, Echec est renvoyé immédiatement.
optimal    Est ignoré, en fait que le test réussisse ou pas cela ne change pas la suite.
sufficient    Si le test est correct, on obtient immédiatement une acceptation.

En lisant les lignes précédentes, vous comprenez que l'ordre des modules est extrêmement important.
Le dernier champ indique l'endroit ou se trouvent les modules. Normalement, ils sont tous dans le même répertoire.   

5 Modules à connaître

pam_cracklib : Permet d'accepter ou de rejeter un mot de passe, si celui-ci se trouve dans un dictionnaire. Il permet aussi de vérifier que vous ne réutilisez pas le même mot de passe. Vous pouvez le faire suivre de retry=n (le nombre de tentatives) minlen=n (la longueur imposée) difok=n (nombre de caractères qui sont dans le vieux mot de passe et que l'on ne peut pas retrouver dans le nouveau).
pam_env :  Permet de spécifier des variables d'environnements spécifiées dans /etc/security/pam_env.conf à tout utilisateur qui se connecte sur la machine.
pam_unix : Module de base. Gère à la mode unix la politique d'authentification. Il peut être avec les quatre types de modules : account (établi la validité utilisateur/mot de passe et peut forcer la modification de celui là), auth (compare avec la base le mot de passe), password (la politique de changement du mot de passe), session (pour loguer les connexions).
Vous pouvez associer quelques options dont : nullock pour autoriser un mot de passe vide, md5 pour le type de cryptage, debug pour loguer les informations à syslog, remember=n pour ce souvenir des n derniers mots de passe utilisés.
pam_pwdb : module de base, qui a les mêmes options que pam_unix. 
pam_time : autorise un accès par heure. La configuration se faisant dans le fichier /etc/security/time.conf.
pam_wheel : permet de limiter l'accès à root via la commande su qu'aux seuls membres du groupe wheel. On peut changer le nom du groupe par défaut avec l'option group=mon_group.
pam_limits :  Permet de limiter les ressources mis à la disposition d'un utilisateur. Il faut alors configurer le fichier /etc/security/limits.conf. 
pam_nologin : permet de désactiver les comptes. Il faut alors créer le fichier /etc/nologin et alors il n'y a plus que root qui puisse se connecter.
pam_access : Ce module permet de contrôler les utilisateurs par nom, machine, domaine, adresse IP, terminal. Vous devez alors configurer le fichier /etc/security/access.conf
pam_deny : comme sont nom l'indique. Vous pouvez (devez !) l'utiliser dans /etc/security/other pour auth, account, password et session avec required. Si dans le répertoire /etc/security vous avez des noms d'applications que vous n'utilisez pas vous pouvez renommer ces fichiers avec un autre nom au cas..! Si quelqu'un cherche à utiliser l'application le other sera alors utilisé par défaut.
pam_securrety : Vérifie que le compte root a la possibilité de se connecter sur cette console. Pour cela il faut qu'elle soit indiquée dans le fichier /etc/securrety. 
pam_warm : log les informations à syslog
pam_console : permet de spécifier les autorisations d'accès à la console. Il faut alors configurer /etc/security/console.perms.
pam_stack : généralement suivi de service=system-auth, permet de renvoyer sur system-auth.
pam_ldap : permet d'effectuer l'authentification sur une base ldap. Ce module demande une documentation à lui  tout seul.

6 Exemple

Voici le fichier /etc/pam.d/login.

#%PAM-1.0 
auth required /lib/security/pam_securetty.so 
auth required /lib/security/pam_unix.so shadow nullok 
auth required /lib/security/pam_nologin.so 
account required /lib/security/pam_unix.so 
password required /lib/security/pam_cracklib.so 
password required /lib/security/pam_unix.so shadow nullok use_authtok 
session required /lib/security/pam_unix.so

Ligne 1 est un commentaire.
Ligne 2 interdit à root de se connecter sur la console (enfin directement on peut utiliser su), si la console n'est pas autorisée dans /etc/securrety.
Ligne 3 Vérifie le mot de passe, on peut aussi utiliser pam_pwdb
Ligne 4 Vérifie l'existence du fichier /etc/nologin. Si celui-ci existe, il n'est plus possible de ce loguer sauf pour root. Affiche son contenu.
Ligne 5 Comptabilise la "vie" du mot de passe.
Ligne 6 Teste la validité du mot de passe.
Ligne 7 Impose les règles de modification du mot de passe. 
Ligne 8 Ne fait rien, mais indique qu'il doit être utilisé pour gérer la session.

7 Les liens

http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/pam.html


TP 1 :  Créez un utilisateur. Ne pas lui donner de mot de passe. 
Dans une autre console, se loguer avec ce compte. Peut il se loguer ?
Dans /etc/pam.d/passwd modifier la ligne auth required /lib/security/pam_pwdb.so shadow nullock  en enlevant nullock.
Essayez de vous reloguer avec le compte précédent.

TP 2 : Modifiez la politique de mot de passe.
Dans /etc/pam.d/passwd vérifiez la présence de pam_cracklib.so. Sinon ajoutez la ligne password required /lib/security/pam_cracklib.so retry=3 minlen=X difok=Y
Ajustez X et Y à votre politique de sécurité.

TP 3 : Dans le fichier /etc/pam.d/login vérifiez la présence de nologin.so. Sinon ajouter la ligne auth required /lib/security/pam_nologin.so.
Créez un fichier vide touch /etc/nologin. Essayez de vous connecter avec le compte précédent. 


© Philippe Chadefaux - 10/1/2002 -