Essayer d'obtenir SSH avec une clé publique (pas de mot de passe) + authentificateur Google travaillant sur Ubuntu 14.04.1

20

J'utilise Ubuntu 14.04.1 (avec OpenSSH 6.6 et libpam-google -hentator 20130529-2).

J'essaie de configurer des connexions SSH où la clé publique s'authentifie (sans mot de passe) et un utilisateur est invité à entrer un code de l'authentificateur de Google.

Suivre / adapter ces instructions m'a donné une invite de mot de passe ainsi qu'une invite Google Auth:

J'ai installé le package, modifié mes fichiers /etc/ssh/sshd_configet/etc/pam.d/ssh

Dans /etc/ssh/sshd_config:

ChallengeResponseAuthentication yes
AuthenticationMethods  publickey,keyboard-interactive
UsePAM yes

et en bas de /etc/pam.d/ssh:

auth required pam_google_authenticator.so nullok # (I want to give everyone a chance to set up their 2FA before removing "nullok")

Je sais que PAM dépend de l'ordre, mais l'est sshd_configaussi?

Qu'est-ce que je fais mal? Toute aide serait appréciée.

JT.
la source

Réponses:

28

Je l'ai bien fait, d'abord:

apt-get install libpam-google-authenticator

Dans /etc/pam.d/sshdj'ai changé / ajouté les lignes suivantes (en haut):

# @include common-auth
auth required pam_google_authenticator.so

Et dans /etc/ssh/sshd_config:

ChallengeResponseAuthentication yes
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
PasswordAuthentication no

Fonctionne bien et je reçois maintenant une invite "Code de vérification" après l'authentification avec la clé publique. Je ne sais pas comment j'autoriserais l'authentification avec mot de passe + jeton OU clé + jeton, car j'ai maintenant supprimé la méthode d'authentification par mot de passe de PAM.

Utilisation d'Ubuntu 14.04.1 LTS (GNU / Linux 3.8.0-19-x86_64 générique) avec ssh -v: OpenSSH_6.6.1p1 Ubuntu-2ubuntu2, OpenSSL 1.0.1f 6 janvier 2014

Linus Kendall
la source
Donc, pour l'amour de la postérité, j'ai réalisé mon problème. J'avais aussi essayé PasswordAuthentication no, mais ce n'était pas ça. Le problème est / était que j'avais / have ControlMaster autoet des ControlPathdirectives dans mon fichier ~ / .ssh / config. Je voulais m'assurer de ne pas m'enfermer, donc je laisserais toujours une session SSH ouverte. Étant donné que mon ordinateur ne ferait que les réutiliser, je suis toujours entré sans que le système ne demande un jeton. J'ai marqué votre réponse comme correcte, car quelqu'un qui la suivrait aurait en effet une configuration de travail. Merci!
JT.
2
J'utilise CentOS 7. J'ai PasswordAuthentication no, ChallengeResponseAuthentication yes, AuthenticationMethods publickey,keyboard-interactiveet UsePAM yesdans sshd_config. Il valide ma clé , puis me demande mon jeton Google Authenticator et me demande également mon mot de passe. Me fait faire les trois - je ne peux en sauter aucun. J'ai également essayé AuthenticationMethods publickey,keyboard-interactive:pamcomme suggéré par la page de manuel, mais cela n'a rien changé. Des idées?
Nick Williams
6
@NickWilliams J'avais le même problème. Ce qui m'a arrangé, c'est que je devais recommander la @include common-authligne que les réponses montrent. Je pensais juste que c'était un commentaire pour la pam_google_authenticatorligne dans /etc/pam.d/sshd au début.
freb
5
Merci! Ma solution n'était pas exactement la même (j'avais besoin de commenter auth substack password-auth), mais votre commentaire a résolu mon problème!
Nick Williams
7

J'ai finalement pu faire fonctionner cela en plaçant auth [success=done new_authtok_reqd=done default=die] pam_google_authenticator.so nulloken haut de /etc/pam.d/sshd.

Selon la page de manuel pam.d :

  • success=done signifie que si Google Authenticator se déconnecte, aucune autre authentification ne sera effectuée, ce qui signifie aucune invite de mot de passe supplémentaire.
  • default=die signifie que si Google Authenticator rejette la tentative de connexion, l'authentification échouera immédiatement, ignorant l'invite de mot de passe.

Il en [success=done new_authtok_reqd=done default=die]est de même d'un mélange entre les valeurs de contrôle sufficientet requisite, car nous voulons un comportement des deux: en cas de succès, se terminer immédiatement (suffisant), et en cas d'échec, se terminer également immédiatement (requis).

Notez que l' nullokargument de pam_google_authenticator.so signifie que si ~/.google_authenticatoraucun fichier n'est trouvé pour un utilisateur, l'authentification par clé publique se déroule normalement. C'est utile si je veux verrouiller uniquement un sous-ensemble de mes comptes avec 2FA.

bluegate010
la source
6

La réponse de Linus Kendall devrait fonctionner sur les anciens systèmes, mais sur les machines Linux plus récentes, c'est problématique; sur mon serveur web basé sur linux arch, cette configuration a pour résultat que pam demande mon code d'authentification et mon mot de passe après avoir reçu ma clé ssh (c'est-à-dire que j'ai besoin des 3).

Une solution plus simple qui empêche ce problème et qui devrait fonctionner sur chaque système consiste à modifier l'entrée en /etc/pam.d/sshd:

auth sufficient pam_google_authenticator.so

Et puis pour apporter les mêmes modifications à `` / etc / ssh / sshd` que Linus a mentionné:

ChallengeResponseAuthentication yes
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
PasswordAuthentication no

Cela devrait vous demander votre jeton d'authentification après que le serveur a accepté votre clé publique. Il ne devrait pas vous demander votre mot de passe.

En passant, si vous souhaitez avoir un compte utilisateur sftp, vous devrez probablement contourner l'authentificateur google pour le faire fonctionner. Voici une suggestion sur la façon de le faire en toute sécurité en utilisant une prison sftp. Dans etc/ssh/sshd_config:

Subsystem sftp internal-sftp
Match User ftp-user
  PasswordAuthentication yes
  AuthenticationMethods password
  ChrootDirectory /path/to/ftp/dir
  ForceCommand internal-sftp

Vous devez faire les autorisations sur / chemin / vers / ftp / dir écriture racine uniquement (par exemple chown root:root /path/to/ftp/dir, chmod 755 /path/to/ftp/dir. Tous les parents , au- dessus de ce répertoire a également besoin d' autorisations sécurisées. La façon dont je le fais habituellement c'est en faisant le répertoire chroot /home/shared/user, la création d' un répertoire là-bas (par exemple «données»), puis monter le répertoire que je veux partager comme ceci:sudo mount -o bind /path/to/ftp/dir /home/shared/user/data

Si vous suivez toutes ces étapes, vous aurez une clé publique + un identifiant google authentifiant pour vos utilisateurs ssh et un compte sftp protégé par mot de passe pour le transfert de données.

Mike Dacre
la source
Cela fonctionne très bien. Et comme pour une raison quelconque, je ne me sens pas à l'aise de commenter l'authentification commune, c'était plus idéal que la solution de Linus.
Luke Sapan
Merci beaucoup! gaspillé une nuit de débogage ssh, me demandant pourquoi je dois encore taper le mot de passe après pubkey + authcode ……
felix021