Authentification en trois étapes?

9

J'utilise Ubuntu.

Je me demande simplement s'il est possible d'avoir libpam-google-authentifier (qui vous permet de vous connecter en utilisant un code généré par votre téléphone) ET l'authentification par certificat configurée pour fonctionner ensemble, et si c'est possible, comment je procéderais le mettre en place. Ainsi - pour vous connecter à mon compte, vous devez avoir mon mot de passe, mon téléphone (et son mot de passe) ET mon certificat / clé privée et son mot de passe.

J'ai réussi à travailler tous les deux indépendamment, mais je n'ai jamais réussi à les faire travailler ensemble. Mais je suis sûr que c'est possible.

Merci.

Jesse W
la source
Habituellement, vous ne gagnez pas grand-chose avec les facteurs en double. Un générateur de certificats et de codes correspond au facteur «quelque chose que vous avez». Un mot de passe correspond à «quelque chose que vous savez». L'autre facteur commun est «quelque chose que vous êtes» (biométrie).
Zoredache

Réponses:

8

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 vous empêchera de vous connecter à votre système

Heureusement, vous pouvez toujours démarrer en mode mono-utilisateur et résoudre le problème, mais sachez que PAM n'est pas quelque chose avec lequel vous voulez jouer plus que nécessaire.

Quoi qu'il en soit, l'idée derrière cela est qu'il est possible d'utiliser l' empilage de modules PAM pour vous assurer que pam-google-authenticator, pam_unix(ce contrôle votre mot de passe) et le module de certificat doivent tous réussir à vous autoriser l' accès. Par défaut, PAM est configuré pour permettre à n'importe quel module d'authentification de vous authentifier, en ignorant les autres.

Dans /etc/pam.d/common-auth, vous verrez près du haut une ligne qui ressemble à ce qui suit:

auth    [success=2 default=ignore]  pam_unix.so nullok_secure try_first_pass

Cela indique à PAM que cela doit pam_unix.soréussir, il ignorera les deux règles suivantes (qui sont généralement un autre module d'authentification, puis pam_deny.so) et passera aux modules facultatifs. Cependant, en cas de défaillance du module, il sera ignoré et le contrôle passera au module suivant de la chaîne. Cela continue dans chaque module d'authentification jusqu'à ce que le contrôle passe au bloc facultatif ou que PAM atteigne pam_deny.so et échoue immédiatement.

Cela peut être exploité pour garantir que pam-google-authenticator, pam_unix.soet votre module PAM de certificat doit tous réussir pour vous permettre d'accéder. 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 d'authentification commune. Donc, en mettant quelque chose comme ça 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

Remplacer <n>par le nombre de modules entre le module pam_permit.so ici et le pam_permit.somodule suivant - en d'autres termes, il doit être défini sur le code [success = n default = ignore] du module d'authentification le plus haut + 1. Cette syntaxe est un peu géniale , mais ignore essentiellement les modules d'authentification une fois 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 d'utilisateur. Cela peut être fait avec un pam_succeed_if.somodule 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>

<username>est remplacé par votre nom d'utilisateur. Cette ligne indique simplement que si pam_succeed_if.so réussit (alias votre nom d'utilisateur correspond au nom d'utilisateur sur cette ligne), PAM devrait alors 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 choses, par exemple l'appartenance à un groupe avec un certain nom d'utilisateur, plusieurs lignes doivent être utilisées, 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 quoi que ce soit, je voudrais sauvegarder le fichier d'authentification commune et me familiariser également avec le mode mono-utilisateur et comment 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 racine ou deux et laissez-les tranquilles. Ceux-ci agissent comme des solutions de rechange en cas de problème, car vous pouvez facilement remplacer l'authentification commune par la sauvegarde. Ensuite, apportez ces modifications. Ensuite, essayez d'utiliser supour vous connecter à votre compte d'utilisateur - vous devez passer par le processus d'authentification en trois étapes.

La documentation complète du pam_succeed_if.somodule est disponible à l' adresse http://linux.die.net/man/8/pam_succeed_if

Xénopathique
la source
Excellente réponse! Si je pouvais voter plus d'une fois, je le ferais.
Aaron Miller
Merci! Bien que - pour la connexion au certificat, j'ajoute ma clé publique dans .ssh / authorized_keys (en utilisant les paramètres RSAAuthentication et PubkeyAuthentication dans sshd_config) et pour le code OTP j'utilise pam_google_authenticator - google-authenticator.googlecode.com/hg . Alors, comment cela fonctionnerait-il?
Jesse W
@JesseW Pour que cela fonctionne, vous devez configurer SSHD pour utiliser PAM ainsi qu'une clé publique. Bien que je ne sois pas sûr des détails, vous devrez certainement définir ChallengeResponseAuthenticationet UsePAM«oui», puis définir les lignes détaillées dans ma réponse ci-dessus dans /etc/pam.d/sshd ou /etc/pam.d/common -auth, selon que vous souhaitez effectuer cette opération pour toutes les connexions ou simplement SSH. N'oubliez pas de supprimer la ligne de remplissage 'pam_certificate_auth.so' et de modifier la ligne [success = <n> en conséquence.
Xenopathic
2

J'ai lu ce post et j'ai trouvé que ça avait l'air cool - voici comment j'ai réussi à faire fonctionner l'authentification à trois facteurs. J'ai écrit un blog à ce sujet ici .

Fondamentalement, j'ai configuré Google Authenticator et le mot de passe dans PAM, puis mis en place une authentification par clé publique dans OpenSSH (cela contourne les deux autres), et enfin requis par OpenSSH pour s'authentifier également via PAM (la dernière ligne)

Depuis / etc / ssh / sshd_conf

PubkeyAuthentication yes
ChallengeResponseAuthentication yes
PasswordAuthentication no
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
Einar
la source
1

Seul Pubkey + GoogleAuth que vous devez ajouter en haut de votre /etc/pam.d/sshd

#auth    requisite    pam_unix.so nullok_secure #if you want password, too :)
auth    requisite    pam_google_authenticator.so
auth    [success=2]  pam_permit.so

Je suppose que vous avez OpenSSH> = 6.2 et sshd_config édité

Pour plus de sécurité paranoïaque, ajoutez des configurations supplémentaires: D

x4k3p
la source