Résumé : ne met pas uniquement un exit 0
dans un script /usr/share/libpam-script/pam_script_auth
. JAMAIS.
Sur un serveur Debian GNU/Linux auquel peuvent se connecter, en SSH, tous les membres de notre organisation, nous avons besoin d'effectuer des actions à l'ouverture des sessions.
Pour ce faire, j'utilise le module pam-script pour PAM (paquet logiciel libpam-script dans Debian).
Je crée un script /usr/share/libpam-script/pam_script_ses_open
. Je teste dans tous les sens : ça fait le boulot sans introduire de vulnérabilité.
Je modifie rien dans /etc/pam.conf
/ /etc/pam.d
(des fichiers sont modifiés lors de l'installation du paquet libpam-script).
Dans /var/log/auth.log
, je constate des erreurs :
pam-script[29537]: can not stat /usr/share/libpam-script/pam_script_auth
pam-script[29601]: can not stat /usr/share/libpam-script/pam_script_acct
pam-script[29587]: can not stat /usr/share/libpam-script/pam_script_ses_close
Je n'aime pas laisser des erreurs lors de la mise en œuvre de quoi que ce soit, car on finit toujours par oublier et, plus tard, en plein debug, on se demande toujours si de telles erreurs sont normales (sic !), leur origine, leur ancienneté, etc.
À l'arrache, je crée donc trois scripts ayant pour seul code exit 0
. Je ne teste pas. Erreur.
Voilà comment j'ouvre un accès sans mot de passe à ce serveur durant trois mois. Il suffit de connaître un identifiant valide, de taper n'importe quoi comme mot de passe et hop, on est connecté et on accède aux données personnelles de la personne (montées en NFS)… y compris celles de membres de la direction (qui n'utilisent pas ce serveur). Évidemment, nos identifiants sont dérivés du prénom+nom, donc prédictibles et connus de tous. Oups.
La configuration par défaut dans /etc/pam.d/common-auth
fait que pam-script est le premier module exécuté pour valider une authentification et qu'il est suffisant pour le faire. Comme le script exécuté lors de l'authentification, /usr/share/libpam-script/pam_script_auth
sort toujours sans erreur (effet de exit 0
), l'authentification est toujours validée, quel que soit le mot de passe.
Comme je n'ai pas envie de changer la pyramide des appels dans /etc/pam.d
, j'ai remplacé exit 0
par exit 1
dans /usr/share/libpam-script/pam_script_auth
et /usr/share/libpam-script/pam_script_acct
. J'ai laissé un exit 0
dans pam_script_ses_close
car une fermeture de session se déroule toujours bien, il y a rien à faire.
Morale ? PAM est complexe, donc ne pas modifier sa configuration à l'arrache sans tester tous les cas (vrai mot de passe, faux mot de passe, sudo root, sudo autre utilisateur, su root, su autre utilisateur, etc.).