Il est possible de le faire en enchaînant les modules PAM. Mais avant d'entrer dans les détails :
Une configuration incorrecte de PAM peut et va vous empêcher de vous connecter à votre système.
Heureusement, vous pouvez toujours démarrer en mode utilisateur unique et résoudre le problème, mais sachez que PAM n'est pas quelque chose que vous souhaitez manipuler plus que nécessaire.
Quoi qu'il en soit, l'idée derrière tout cela est qu'il est possible d'utiliser l'empilement des modules PAM pour s'assurer que pam-google-authenticator
, pam_unix
(qui vérifie votre mot de passe) et le module de certificat doivent tous réussir pour vous permettre l'accès. Par défaut, PAM est configuré pour autoriser tout module d'authentification à vous authentifier, en ignorant les autres.
Dans le fichier /etc/pam.d/common-auth, vous verrez en haut une ligne qui ressemble à ce qui suit :
auth [success=2 default=ignore] pam_unix.so nullok_secure try_first_pass
Cela indique à PAM qu'il doit pam_unix.so
réussit, il ignore les deux règles suivantes (qui sont généralement un autre module d'authentification, puis un module d'authentification). pam_deny.so
) et passer aux modules optionnels. Cependant, si le module échoue, il sera ignoré et le contrôle passera au module suivant de la chaîne. Cela continue avec chaque module d'authentification jusqu'à ce que le contrôle saute au bloc optionnel, ou que PAM rencontre pam_deny.so et échoue là.
Cela peut être exploité pour garantir que pam-google-authenticator
, pam_unix.so
et le module PAM de votre certificat doivent tous réussir pour vous permettre l'accès. Je ne connais pas le nom du module d'authentification Google ou du module de certificat que vous utilisez, mais vous devriez pouvoir les trouver dans votre fichier common-auth. Donc en mettant quelque chose comme ceci en haut :
auth requisite pam_unix.so nullok_secure
auth requisite pam_google_authenticator.so
auth requisite pam_certificate_auth.so
auth [success=<n>] pam_permit.so
Remplacement de <n>
avec le nombre de modules entre le module pam_permit.so ici et le suivant pam_permit.so
en d'autres termes, il doit être défini comme le code [success=n default=ignore] + 1 du module d'authentification le plus élevé. Cette syntaxe est un peu bizarre, mais elle permet essentiellement d'ignorer les modules d'authentification après que les modules ci-dessus ont réussi.
Bien sûr, vous vous demandez peut-être comment limiter cette authentification en trois étapes à votre seul compte utilisateur. Cela peut être fait avec un pam_succeed_if.so
et doit être inséré au-dessus du bloc d'authentification en trois étapes décrit ci-dessus :
auth [success=ignore default=4] pam_succeed_if.so user = <username>
Où <username>
est remplacé par votre nom d'utilisateur. Cette ligne dit simplement que si pam_succeed_if.so réussit (c'est-à-dire que votre nom d'utilisateur correspond au nom d'utilisateur sur cette ligne) alors PAM devrait passer aux modules suivants, qui sont les modules d'authentification en trois étapes. Sinon, PAM devrait passer aux vrais modules, qui sont à 4 modules de celui-ci.
Pour faire correspondre plusieurs éléments, par exemple l'appartenance à un groupe et un certain nom d'utilisateur, il faut utiliser plusieurs lignes, par exemple :
auth [success=1 default=ignore] pam_succeed_if.so user = <username>
auth [success=ignore default=4] pam_succeed_if.so user ingroup <group>
Avant de faire tout cela, je ferais une sauvegarde du fichier common-auth, et je me familiariserais également avec le mode utilisateur unique et la façon de restaurer l'ancien fichier en cas d'urgence. Cette configuration n'a pas été testée par moi, mais elle devrait fonctionner.
Pour tester cela la première fois, ouvrez un Shell ou deux, et laissez-les tranquilles. Ils agissent comme des solutions de repli en cas de problème, puisque vous pouvez facilement remplacer common-auth par la sauvegarde. Ensuite, effectuez ces changements. Ensuite, essayez d'utiliser su
pour vous connecter à votre compte d'utilisateur - vous devriez devoir passer par le processus d'authentification en trois étapes.
La documentation complète pour le pam_succeed_if.so
peut être trouvé à l'adresse suivante http://linux.die.net/man/8/pam_succeed_if