Une authentification à deux facteurs pour SSH
Sommaire
Contexte
Ubuntu / Debian
Avril 2020
1er essai avec OTPW
Installation & test
$ sudo apt-get install libpam-otpw $ otpw-gen > otpw.txt
- Saisir un mot de passe ("préfixe")
- Trouver la liste des mots de passe à usage unique dans le fichier otpw.txt
- Modifier la configuration de pam
- Vérifier la configuration d'OpenSSH
- Tenter de se connecter en SSH
$ ssh localhost Password 079:
Ici, saisir son le code 079 (sans l'espace central) précédé de son préfixe, et le tour est joué.
Dans le cas où vous trouveriez l'indication, saisissez votre préfixe suivi des trois codes (sans espaces centraux).
$ ssh localhost Password 095/206/039:
Configuration de pam
# /etc/pam.d/sshd # PAM configuration for the Secure Shell service # Standard Un*x authentication. auth required pam_otpw.so #@include common-auth
Décommenter la dernière ligne pour devoir tapper le mot de passe à usage unique PUIS son mot de passe classique.
Configuration d'OpenSSH
# /etc/ssh/sshd_config ChallengeResponseAuthentication yes UsePAM yes
Conclusion
Opérationnel et d'un niveau de sécurité intéressant, à condition de se satisfaire de HOTP, qui est rébarbatif et demande à stocker une liste de mots de passe, en aucun cas plus sécurisé que de stocker un mot de passe unique.
2nd essai avec Google Authenticator
Préambule
Si le mot "Google" se trouve dans cet outil, c'est qu'il est sorti des équipes de Google... mais le code source est libre et son usage est indépendant des services de Google.
Installation & test
$ sudo apt-get install libpam-google-authenticator $ google-authenticator
Do you want authentication tokens to be time-based (y/n) y Warning: pasting the following URL into your browser exposes the OTP secret to Google: https://www.google.com/chart?chs=200x200&chld=M%7C0&cht=qr&chl=otpauth://totp/xxx@mylaptop... Your new secret key is: ABCD Your verification code is 12345 Your emergency scratch codes are: 45678 56789 67890 78901 Do you want me to update your "/home/user/.google_authenticator" file? (y/n) y Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) n By default, a new token is generated every 30 seconds by the mobile app. In order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. This allows for a time skew of up to 30 seconds between authentication server and client. If you experience problems with poor time synchronization, you can increase the window from its default size of 3 permitted codes (one previous code, the current code, the next code) to 17 permitted codes (the 8 previous codes, the current code, and the 8 next codes). This will permit for a time skew of up to 4 minutes between client and server. Do you want to do so? (y/n) n If the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s. Do you want to enable rate-limiting? (y/n) n
Il convient de configurer pam pour ssh, et de vérifier sa configuration de SSH :
Maintenant il est temps de tester :
$ ssh localhost Verification code: <code from TOTP app> Password: <usual password> Welcome to XXXX
Configuration de pam
# /etc/pam.d/sshd # PAM configuration for the Secure Shell service # Standard Un*x authentication. auth required pam_google_authenticator.so nullok @include common-auth
Disposer des deux lignes permet de s'authentifier d'abord en TOTP, puis via son mot de passe utilisateur classique.
L'option "nullok" pour pam_google_authenticator.so permet de garder un fonctionnement normal pour les utilisateurs n'ayant pas défini de configuration TOTP...
Configuration d'OpenSSH
# /etc/ssh/sshd_config ChallengeResponseAuthentication yes UsePAM yes
Généralisation de la solution retenue
Il convient ensuite de placer les directives relatives à l'authentification de pam au niveau global, c'est à dire dans le fichier /etc/pam.d/common-auth
Troubleshooting
Si vous utilisez un HOME chiffré (par exemple avec encryptfs), vous serez face à un problème d'ordre récursif : votre configuration google-authenticator se trouve dans votre répertoire HOME qui ne peut être accédé en clair qu'une fois connecté.
Je conseille alors de positionner sa configuration personnelle .google-authenticator dans /etc/totp/${USER}/.google_authenticator (malheureusement cela se fait manuellement) et de paramétrer pam ainsi :
# /etc/pam.d/common-auth auth required pam_google_authenticator.so nullok secret=/etc/totp/${USER}/.google_authenticator