Comment configurer et utiliser PAM sous Linux
Linux-PAM (abréviation de Pluggable Authentication Modules, qui a évolué à partir de l’architecture Unix-PAM) est une puissante suite de bibliothèques partagées utilisées pour authentifier dynamiquement un utilisateur auprès d’applications (ou de services) dans un système Linux.
Il intègre plusieurs modules d’authentification de bas niveau dans une API de haut niveau qui fournit une prise en charge de l’authentification dynamique pour les applications. Cela permet aux développeurs d’écrire des applications qui nécessitent une authentification, indépendamment du système d’authentification sous-jacent.
De nombreuses distributions Linux modernes prennent en charge Linux-PAM (ci-après dénommé « PAM ») par défaut. Dans cet article, nous allons vous expliquer comment configurer le PAM avancé dans les systèmes Ubuntu et CentOS.
Avant d’aller plus loin, notez que :
- En tant qu’administrateur système, le plus important est de maîtriser la façon dont les fichiers de configuration PAM définissent la connexion entre les applications (services) et les modules d’authentification enfichables (PAM) qui effectuent les tâches d’authentification réelles. Vous n’avez pas nécessairement besoin de comprendre le fonctionnement interne de PAM.
- PAM a le potentiel de modifier sérieusement la sécurité de votre système Linux. Une configuration erronée peut désactiver l’accès à votre système partiellement ou complètement. Par exemple, une suppression accidentelle d’un ou plusieurs fichiers de configuration sous /etc/pam.d/* et/ou /etc/pam.conf peut vous bloquer l’accès à votre propre système !
Comment vérifier qu’un programme est compatible PAM
Pour utiliser PAM, une application/un programme doit être « PAM aware » ; il doit avoir été écrit et compilé spécifiquement pour utiliser PAM. Pour savoir si un programme est « PAM-aware " ou non, vérifiez s’il a été compilé avec la bibliothèque PAM à l’aide de la commande ldd.
Par exemple sshd :
$ sudo ldd /usr/sbin/sshd | grep libpam.so
libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007effddbe2000)
Comment configurer PAM sous Linux
Le fichier de configuration principal de PAM est /etc/pam.conf et le répertoire /etc/pam.d/ contient les fichiers de configuration PAM pour chaque application/service prenant en charge PAM. PAM ignorera le fichier si le répertoire existe.
La syntaxe du fichier de configuration principal est la suivante. Le fichier est constitué d’une liste de règles écrites sur une seule ligne (vous pouvez étendre les règles à l’aide du caractère d’échappement « \ ») et les commentaires sont précédés de marques « # » et s’étendent jusqu’à la fin de la ligne suivante.
Le format de chaque règle est une collection de jetons séparés par des espaces (les trois premiers ne sont pas sensibles à la casse). Nous expliquerons ces jetons dans les sections suivantes.
service type control-flag module module-arguments
où:
- Service : nom réel de l’application.
- type : type/contexte/interface du module.
- control-flag : indique le comportement de l’API PAM si le module ne réussit pas sa tâche d’authentification.
- module : le nom de fichier absolu ou le chemin d’accès relatif du PAM.
- module-arguments : liste de jetons séparés par des espaces pour contrôler le comportement du module.
La syntaxe de chaque fichier dans /etc/pam.d/ est similaire à celle du fichier principal et est composée de lignes de la forme suivante :
type control-flag module module-arguments
Voici un exemple de définition de règle (sans argument de module) trouvée dans le fichier /etc/pam.d/sshd, qui interdit les connexions non root lorsque /etc/nologin existe :
account required pam_nologin.so
Comprendre les groupes de gestion PAM et les indicateurs de contrôle
Les tâches d’authentification PAM sont séparées en quatre groupes d’administration indépendants. Ces groupes gèrent différents aspects de la demande d’un utilisateur type pour un service restreint.
Un module est associé à l’un des types de groupes d’administration suivants :
- Compte : Fournir des services de vérification de compte : Le mot de passe de l’utilisateur a-t-il expiré ? ; Cet utilisateur est-il autorisé à accéder au service demandé ?.
- Authentification : authentifiez un utilisateur et configurez les informations d’identification de l’utilisateur.
- Mot de passe : sont responsables de la mise à jour des mots de passe des utilisateurs et travaillent avec les modules d’authentification.
- Session : Gérez les actions effectuées au début et à la fin d’une session.
Les fichiers objets chargeables PAM (les modules) doivent être situés dans le répertoire suivant : /lib/security/ ou /lib64/security selon l’architecture.
Les drapeaux de contrôle pris en charge sont les suivants :
- Requis : Failure renvoie instantanément le contrôle à l’application en indiquant la nature de la défaillance du premier module.
- Obligatoire : Tous ces modules sont nécessaires pour que libpam retourne le succès à l’application.
- Suffisant : étant donné que tous les modules précédents ont réussi, le succès de ce module entraîne un retour immédiat et réussi à l’application (l’échec de ce module est ignoré).
- Facultatif : Le succès ou l’échec de ce module n’est généralement pas enregistré.
En plus des mots-clés ci-dessus, il existe deux autres indicateurs de contrôle valides :
- include et substack : incluent toutes les lignes de type donné du fichier de configuration spécifié en argument de ce contrôle.
Comment restreindre l’accès root au service SSH via PAM
À titre d’exemple, nous allons configurer comment utiliser PAM pour désactiver l’accès de l’utilisateur root à un système via SSH et les programmes de connexion. Ici, nous voulons désactiver l’accès de l’utilisateur root à un système, en limitant l’accès aux services de connexion et de sshd.
On peut utiliser le module /lib/security/pam_listfile.so qui offre une grande flexibilité pour limiter les privilèges de comptes spécifiques. Ouvrez et modifiez le fichier du service cible dans le répertoire /etc/pam.d/ comme indiqué.
$ sudo vim /etc/pam.d/sshd
OR
sudo vim /etc/pam.d/login
Ajoutez cette règle dans les deux fichiers.
auth required pam_listfile.so \
onerr=succeed item=user sense=deny file=/etc/ssh/deniedusers
Explication des jetons dans la règle ci-dessus :
- auth : est le type de module (ou contexte).
- required : est un drapeau de contrôle qui signifie que si le module est utilisé, il doit réussir ou le résultat global sera échoué, quel que soit l’état des autres modules.
- pam_listfile.so : est un module qui permet de refuser ou d’autoriser des services basés sur un fichier arbitraire.
- onerr=succeed : argument du module.
- item=user : argument de module qui spécifie ce qui est listé dans le fichier et doit être vérifié.
- sense=deny : argument du module qui spécifie l’action à entreprendre s’il est trouvé dans le fichier, si l’élément n’est PAS trouvé dans le fichier, alors l’action opposée est demandée.
- file=/etc/ssh/deniedusers : argument module qui spécifie le fichier contenant un élément par ligne.
Ensuite, nous devons créer le fichier /etc/ssh/deniedusers et y ajouter le nom root :
$ sudo vim /etc/ssh/deniedusers
Enregistrez les modifications et fermez le fichier, puis définissez les autorisations requises sur celui-ci :
$ sudo chmod 600 /etc/ssh/deniedusers
À partir de maintenant, la règle ci-dessus indiquera à PAM de consulter le fichier /etc/ssh/deniedusers et de refuser l’accès aux services SSH et de connexion à tout utilisateur répertorié.
Comment configurer Advanced PAM sous Linux
Pour écrire des règles PAM plus complexes, vous pouvez utiliser des indicateurs de contrôle valides sous la forme suivante :
type [value1=action1 value2=action2 …] module module-arguments
Où valeurN correspond au code de retour de la fonction appelée dans le module pour lequel la ligne est définie. Vous pouvez trouver les valeurs prises en charge dans le Guide de l’administrateur PAM en ligne. Une valeur spéciale est default, ce qui implique que toutes les valeurN ne sont pas mentionnées explicitement.
L’actionN peut prendre l’une des formes suivantes :
- Ignorer : si cette action est utilisée avec une pile de modules, l’état de retour du module ne contribuera pas au code de retour obtenu par l’application.
- bad : indique que le code de retour doit être considéré comme une indication de l’échec du module. Si ce module est le premier de la pile à échouer, sa valeur d’état sera utilisée pour celle de l’ensemble de la pile.
- die : équivalent à bad mais peut arrêter la pile de modules et PAM revenant immédiatement à l’application.
- ok : cela indique à PAM que l’administrateur système pense que ce code de retour doit contribuer directement au code de retour de la pile complète de modules.
- done : équivalent à ok mais peut arrêter la pile de modules et le PAM revenant immédiatement à l’application.
- N (un entier non signé) : équivalent à ok mais peut sauter par-dessus les N modules suivants dans la pile.
- Reset : cette action efface toute la mémoire de l’état de la pile de modules et redémarre avec le module empilé suivant.
Chacun des quatre mots-clés : obligatoire ; Requise; suffisant; et facultatif, avoir une expression équivalente en termes de syntaxe [...], qui vous permettent d’écrire des règles plus compliquées et ce sont :
- required : [success=ok new_authtok_reqd=ok ignore=ignore default=bad]
- requisite : [success=ok new_authtok_reqd=ok ignore=ignore default=die]
- suffisant : [succès=fait new_authtok_reqd=fait default=ignorer]
- facultatif : [success=ok new_authtok_reqd=ok default=ignore]
Ce qui suit est un exemple d’un système CentOS 7 moderne. Considérons ces règles à partir du fichier PAM /etc/pam.d/postlogin :
#%PAM-1.0
This file is auto-generated.
User changes will be destroyed the next time authconfig is run.
session [success=1 default=ignore] pam_succeed_if.so service !~ gdm* service !~ su* quiet
session [default=1] pam_lastlog.so nowtmp showfailed
session optional pam_lastlog.so silent noupdate showfailed
Voici un autre exemple de configuration à partir du fichier PAM /etc/pam.d/smartcard-auth :
#%PAM-1.0
This file is auto-generated.
User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth [success=done ignore=ignore default=die] pam_pkcs11.so nodebug wait_for_card
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account required pam_permit.so
password required pam_pkcs11.so
session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
Pour plus d’informations, reportez-vous à la page de manuel pam.d :
$ man pam.d
Enfin, une description complète de la syntaxe du fichier de configuration et de tous les modules PAM peut être trouvée dans la documentation de Linux-PAM.
Résumé
PAM est une API puissante de haut niveau qui permet aux programmes qui reposent sur l’authentification d’utilisateurs authentiques d’accéder à des applications dans un système Linux. C’est puissant mais très difficile à comprendre et à utiliser.
Dans cet article, nous avons expliqué comment configurer les fonctionnalités avancées de PAM dans Ubuntu et CentOS. Si vous avez des questions ou des commentaires à formuler, utilisez le formulaire de rétroaction ci-dessous.