Une authentification à deux facteurs pour SSH : Différence entre versions

De e-glop
(Installation & test)
 
(4 révisions intermédiaires par le même utilisateur non affichées)
Ligne 98 : Ligne 98 :
 
Maintenant il est temps de tester :
 
Maintenant il est temps de tester :
  
  $ ssh localhost
+
  <nowiki>$ ssh localhost
 
  Verification code: <code from TOTP app>  
 
  Verification code: <code from TOTP app>  
 
  Password: <usual password>
 
  Password: <usual password>
  Welcome to XXXX
+
  Welcome to XXXX</nowiki>
  
 
=== Configuration de pam ===
 
=== Configuration de pam ===
Ligne 126 : Ligne 126 :
  
 
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
 
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

Version actuelle datée du 30 avril 2020 à 08:16

Contexte

Ubuntu / Debian

Avril 2020

1er essai avec OTPW

Installation & test

$ sudo apt-get install libpam-otpw
$ otpw-gen > otpw.txt
  1. Saisir un mot de passe ("préfixe")
  2. Trouver la liste des mots de passe à usage unique dans le fichier otpw.txt
  3. Modifier la configuration de pam
  4. Vérifier la configuration d'OpenSSH
  5. 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