Introduction
Google-Authenticator permet l’ajout d’une seconde protection à l’accès de certains services. Par exemple lors de sa connexion au serveur par SSH, l’utilisateur devra renseigner le mot de passe de son compte (comme à l’habitude). Si le mot de passe est correct, il devra ensuite taper un code à 6 chiffres disponible uniquement via l’application de son smartphone Android, iOS ou Blackberry. Pour des raisons de sécurité, le code se régénère toutes les 30 secondes. Si tous les pré-requis sont validés alors l’utilisateur parvient à accéder au serveur.
La validation en deux étapes est une procédure permettant de renforcer la sécurité des connexions aux comptes Google, par le biais d’un code de validation que les utilisateurs doivent saisir en complément de leur nom d’utilisateur et de leur mot de passe.
Pré-requis : L’application Android (Market), iOS (AppleStore) ou Blackberry http://code.google.com/p/google-authenticator/
Note : Pour l’installation de ce module, je me suis basé sur l’article très complet de essembeh sur son blog.
Patch : Par défaut, l’installation de Google-Authenticator impacte TOUS les utilisateurs du système. Le patch ignore_nofile permet d’éviter cela et choisir quel(s) utilisateur(s) doivent bénéficier de la validation à deux étapes. (optionnel)
Installation
Installer les dépendances.
apt-get install mercurial subversion libpam-dev
Attention : Mercurial doit être >= 1.7.5 ! Si ce n’est pas le cas : http://code.google.com/p/google-authent … ialVersion
Télécharger les sources. (ça peut prendre un moment)
hg clone https://google-authenticator.googlecode.com/hg/ google-authenticator/
cd google-authenticator/libpam/
Appliquer le patch : http://code.google.com/p/google-authent … tail?id=18 (miroir-07-07-2011) (cf. partie Introduction)
patch < ignore_nofile.patch
Puis lancer la compilation.
make
sudo make install
Sous Ubuntu Server 11.04 (Natty) x86_64 lors du make, je tombe sur les erreurs suivantes :
gcc --std=gnu99 -Wall -O2 -g -fPIC -c -o google-authenticator.o google-authenticator.c
gcc --std=gnu99 -Wall -O2 -g -fPIC -c -o base32.o base32.c
gcc --std=gnu99 -Wall -O2 -g -fPIC -c -o hmac.o hmac.c
gcc --std=gnu99 -Wall -O2 -g -fPIC -c -o sha1.o sha1.c
gcc -g -o google-authenticator google-authenticator.o base32.o hmac.o sha1.o
google-authenticator.o: In function `displayQRCode':
~/work/google-authenticator/libpam/google-authenticator.c:154: undefined reference to `dlopen'
~/work/google-authenticator/libpam/google-authenticator.c:166: undefined reference to `dlsym'
~/work/google-authenticator/libpam/google-authenticator.c:168: undefined reference to `dlsym'
~/work/google-authenticator/libpam/google-authenticator.c:253: undefined reference to `dlclose'
~/work/google-authenticator/libpam/google-authenticator.c:156: undefined reference to `dlopen'
collect2: ld returned 1 exit status
make: *** [google-authenticator] Error 1
Rectification du chemin vers la librairie libdl.so
locate libdl.so
sudo sed -i -e 's/\/usr\/lib\/libdl.so/\/usr\/lib\/x86_64-linux-gnu\/libdl.so/' Makefile
Maintenant la compilation se termine correctement.
Configuration
Dans mon cas, j’utilise ce module pour sécuriser l’accès SSH au serveur. Mais on peut l’appliquer à d’autres services, comme par exemple Vsftpd, Samba…
Editer /etc/pam.d/sshd
Et ajouter en début de fichier après la ligne @include common-auth :
auth required pam_google_authenticator.so
Exemple a écrit :
# PAM configuration for the Secure Shell service
# Read environment variables from /etc/environment and
# /etc/security/pam_env.conf.
auth required pam_env.so # [1]
# In Debian 4.0 (etch), locale-related environment variables were moved to
# /etc/default/locale, so read that as well.
auth required pam_env.so envfile=/etc/default/locale# Standard Un*x authentication.
@include common-auth
auth required pam_google_authenticator.so# Disallow non-root logins when /etc/nologin exists.
account required pam_nologin.so
Passer la valeur à yes dans /etc/ssh/sshd_config
ChallengeResponseAuthentication yes
Puis redémarrer le service pour prendre en compte la nouvelle configuration
/etc/init.d/ssh restart
Utilisation
Chaque utilisateur qui souhaite bénificier de cette protection devra créer son propre fichier de configuration~/.google_authenticator avec la commande :
google-authenticator
Le lien pointe vers un QRcode qu’il faut impérativement scanner à l’aide de l’application.
Autrement, je suppose qu’il faut utiliser la clé secrète CMBGEGEKQYHP7IA5 dans cet exemple. (pas testé)
Il est important de noter ou rajouter des codes de secours en cas de perte ou panne du smartphone. (en éditant le fichier)
- La première question demande si on doit écrire le fichier de configuration, répondre oui.
- Ensuite si on permet ou non l’utilisation du même code plusieurs fois. Autrement dit comme un code est valable 30 secondes, si je veux me connecter deux fois en 30 secondes, je dois répondre oui.
- Ensuite on vous propose d’étendre la durée de vie des codes.
- Enfin une sécurité visant à interdire le brute-force.
Test
Pour tester que tout fonctionne comme il faut, on récupère le code de vérification avec l’application du smartphone.
L’application ne nécessite pas de connexion Internet.
Puis on ouvre une connexion SSH.
$ ssh user@10.20.30.40
Password:
Verification code:
Welcome to Ubuntu 11.04 (GNU/Linux 2.6.38-8-server x86_64)
* Documentation: http://www.ubuntu.com/server/doc
System information as of Wed Aug 31 17:54:56 CEST 2011
System load: 0.11 Processes: 203
Usage of /home: 85.8% of 448.84GB Users logged in: 1
Memory usage: 47% IP address for eth0: 10.20.30.40
Swap usage: 11%
Graph this data and manage this system at https://landscape.canonical.com/
Last login: Tue Aug 30 09:17:59 2011 from 11.12.13.14
Génial ! Ça marche !
Patch : Vérifier que les utilisateurs qui n’ont pas crée leur fichier ~/.google_authenticator peuvent toujours se connecter.