Il semble qu'ils s'excluent mutuellement, car désactiver l'un me donne l'autre, et vice versa. L'authentification à deux facteurs pour mes serveurs ssh sonne vraiment bien, alors y a-t-il un moyen d'y parvenir?
Avec les versions récentes de Fedora et RHEL 6, vous pouvez utiliser RequiredAuthentications2 pubkey,password
pour exiger à la fois l'authentification par mot de passe pubkey et . Habituellement, cela est nécessaire pour exiger la clé de publication et le jeton d'authentification à 2 facteurs, pas le mot de passe de l'utilisateur.
Mise à jour: Maintenant sur RHEL/CentOS 7, et tout système avec une version récente d'OpenSSH, vous pouvez utiliser:
AuthenticationMethods "publickey,password" "publickey,keyboard-interactive"
Il est également possible de tiliser la directive Match pour exclure les IP ou Users.
Vous pouvez avoir à la fois une clé publique et une authentification par mot de passe sur le même serveur. Si l'authentification par clé publique échoue, il ira à l'authentification par mot de passe.
Quant à exiger les deux, cela semble idiot et contre-productif, et vérifier man sshd_config
il n'y a pas d'option pour ce faire.
Votre clé privée ssh doit avoir une phrase de passe sécurisée. Donc, si un attaquant obtient votre clé privée, il ne peut toujours rien faire sans avoir d'abord obtenu votre phrase secrète. S'ils ont compromis cette phrase secrète (très probablement avec un enregistreur de frappe; ou en forçant brutalement une phrase secrète extrêmement faible), ils peuvent aussi trivialement récupérer/forcer brutalement n'importe quel mot de passe mémorisé.
Si vous le souhaitez vraiment, vous pouvez éventuellement configurer quelque chose avec, par exemple, ForceCommand (par exemple, autoriser uniquement l'authentification par clé publique, puis diriger l'utilisateur vers un shell qui demande un mot de passe). Je ne le recommande pas.
Une meilleure alternative si vous souhaitez limiter l'exposition, est d'avoir une configuration de pare-feu pour limiter les adresses IP pouvant atteindre le port ssh; éventuellement avec un VPN supplémentaire exécuté sur un serveur quelque part si vous avez besoin de tunneler à partir d'un autre ordinateur à un moment donné. Vous pouvez également utiliser quelque chose comme knockd pour ouvrir un trou dans un pare-feu après un schéma de port particulier, tout en reconnaissant que toute personne qui espionne le trafic peut rejouer le schéma de frappe pour ouvrir un port.
(affichage croisé réponse SO avec une solution mise à jour à nos jours)
Si vous lisez la page de manuel de sshd_config(5)
, il y a l'option AuthenticationMethods
, qui prend la liste des méthodes que vous devez passer avant de vous accorder l'accès. Votre configuration requise est:
AuthenticationMethods publickey,password
Cette méthode devrait fonctionner sur tous les systèmes Linux actuels avec openssh récent (openssh-6, openssh-7).
La seule exception que je connaisse est RHEL 6 (openssh-5.3), qui nécessite de définir une option différente avec les mêmes valeurs (comme décrit dans l'autre réponse):
RequiredAuthentications2 publickey,password
Je me suis penché un peu plus là-dessus et j'ai trouvé ce qui suit.
Vous pouvez utiliser PAM pour l'authentification à deux facteurs, mais ce faisant, vous n'utiliserez pas de clés SSH, vous utiliserez deux facteurs différents.
Par exemple, vous pouvez utiliser Google avec leur authentification à deux facteurs et utiliser pam pour s'authentifier, comme décrit sur
La seule solution qui a fonctionné pour moi est d'avoir ce qui suit dans le/etc/ssh/sshd_config (testé avec un CentOS7):
PubkeyAuthentication yes
AuthenticationMethods publickey password
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
PermitEmptyPasswords no
ChallengeResponseAuthentication no
UsePAM yes
Ce qui signifie que PAM est activé, qu'il a activé chaque ligne qui concerne la clé publique et, enfin, que AuthenticationMethods répertorie correctement les deux méthodes. Veuillez noter que, malgré ce qui était écrit par Jakuje , vous ne devez pas ajouter de virgule entre publickey et mot de passe après AuthenticationMethods.