3.4. Authentification par clef publique

OpenSSH supporte plusieurs types d'authentification dont les plus utilisés sont l'authentification par mot de passe et l'authentification par clef publique. Avec la première méthode, le serveur vous demande de saisir un mot de passe lors de la connexion. Comme vu précedemment, utiliser cette possibilité est déconseillé car elle peut laisser la porte ouverte à des attaques par force brute. Ce n'est pas non plus très pratique : il faudra taper un mot de passe à chaque connexion (même si l'on s'est déconnecté juste avant). Si en plus on doit gérer plusieurs serveurs, il faudra taper un mot de passe (potentiellement différent) à chaque connexion sur ces serveurs.

L'authentification par clef publique, en revanche, ne nécessite pas de taper un mot depasse sur le serveur. Il suffit de prouver au serveur que l'on possède une certaine clef (notre clef privée) correspondant à une clef déposée sur le serveur (notre clef publique).

Cette méthode possède plusieurs avantages. Tout d'abord, l'authentification est décorrelée du mot de passe du compte sur lequel nous voulons nous connecter. Par exemple, si je désire me connecter en tant que root, il suffira que je dépose ma clef publique à un endroit spécifique dans le répertoire maison de root. Si un autre utilisateur à aussi besoin de se connecter as root sur la machine, il suffira de déposer aussi sa clef privée. Tout cela se fait donc sans connaitre le mot de passe de root[7]. Ainsi, lorsque n personnes ont accès au compte root d'une machine, retirer l'accès à l'une d'elle consiste simplement à retirer sa clef. Si l'on avait utilisé l'authentification par mot de passe, il aurait fallu changer le mot de passe et distribuer ce nouveau mot de passe à n-1 personnes, avec tous les problèmes pratiques que cela peut poser.

Pour « débloquer » ma clef privée (et ainsi pouvoir valider mon identité en correspondance avec la clef publique), il faudra tout de même taper un mot de passe[8]. Mais OpenSSH est capable, grâce à ssh-agent, de mémoriser les clefs privées débloquées. Ainsi, une fois la clef débloquée, vous n'aurez généralement plus de mot de passe à taper tant que vous ne quittez pas votre session.

3.4.1. Création de clef client

La création de la clef (plus exactement de la paire de clefs) se fait avec ssh-keygen.

alice@linus:~$ ssh-keygen -t dsa ❶
Generating public/private dsa key pair.
Enter file in which to save the key (/home/alice/.ssh/id_dsa): 
Enter passphrase (empty for no passphrase): *****
Enter same passphrase again: *****
Your identification has been saved in /home/alice/.ssh/id_dsa.
Your public key has been saved in /home/alice/.ssh/id_dsa.pub.
The key fingerprint is:
42:24:74:1d:f3:f6:e8:74:24:99:06:4b:41:08:b6:8a alice@linus
alice@linus:~$

Type de clef à créer. Il est recommandé d'utiliser des clefs DSA

Les clefs publiques et privées générées seront appellées respectivement id_dsa.pub et id_dsa et seront créées dans le répertoire $HOME/.ssh. A moins d'utiliser plusieurs clefs, il vaut mieux éviter de changer le nom des clefs générées ou leur emplacement. La clef $HOME/.ssh/id_dsa est donc la clef privée et elle doit être particulièrement protégée. En cas de doute sur sa confidentialité, il ne faut pas hésiter à regénérer ses clefs.

3.4.2. Mise en place des clefs sur le serveur

Un fois la paire de clefs générée, il faut déposer la clef publique sur le serveur (ici 192.168.17.139). Cette clef sera ajoutée dans le authorized_keys de l'utilisateur cible situé dans le répertoire .ssh. Par exemple, si Alice veut se connecter sur la machine ubuntu en tant qu'utilisateur root, il faudra ajouter sa clef publique dans le fichier ~root/.ssh/authorized_keys sur ubuntu.

Lorsque l'usager du serveur cible possède un mot de passe (ce qui n'est pas le cas de root sous les Ubuntu), il est possible d'effectuer cette opération en une seule commande avec ssh-copy-id -i .ssh/id_dsa.pub utilisateur@server

Voici une session dans laquelle alice génère une paire de clef afin de se connecter en tant que root sur la machine serveur. On part du principe que PasswordAuthentication n'a pas encore été changé.

La syntaxte de ssh est simplissime :

ssh {user@host}

ou user est le nom d'utilisateur sous lequel l'on veut se connecter et host est la machine.

alice@linus:~$ scp .ssh/id_dsa.pub oper@192.168.17.139: ❶
The authenticity of host '192.168.17.139 (192.168.17.139)' can't be established.
RSA key fingerprint is a2:e5:d2:3a:44:be:e6:2a:10:71:dc:2e:d7:80:c1:c7.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.17.139' (RSA) to the list of known hosts.
oper@ubuntu's password:***** 
id_dsa.pub                                    100%  602     0.6KB/s   00:00    
alice@linus:~$ ssh oper@192.168.17.139 ❷
oper@192.168.17.139's password: ***** 
Linux ubuntu 2.6.20-15-server #2 SMP Sun Apr 15 07:41:34 UTC 2007 i686

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
Last login: Wed Jun  6 09:03:53 2007
oper@ubuntu:~$ sudo -i ❸
Password:
root@ubuntu:~# mkdir .ssh
root@ubuntu:~# cat ~oper/id_dsa.pub >> .ssh/authorized_keys
root@ubuntu:~# chmod 700 .ssh/ ❹
root@ubuntu:~# chmod 600 .ssh/*
root@ubuntu:~# logout ❺
oper@ubuntu:~$ logout
Connection to 192.168.17.139 closed.
alice@michel:~$ ssh root@192.168.17.139 ❻
Enter passphrase for key '/home/alice/.ssh/id_dsa': ***** ❼
Linux ubuntu 2.6.20-15-server #2 SMP Sun Apr 15 07:41:34 UTC 2007 i686

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
root@ubuntu:~# 

scp permet de copier (Secure CoPy) de fichiers à travers un canal ssh sécurisé. Ici on copie ~alice/.ssh/id_dsa.pub vers le répertoire $HOME de l'utilisateur oper de la machine serveur. Nous somme oligés de passer par ce compte utilisateur puisque root n'a pas de mot de passe. Attention à ne pas oublie les « : » dans la commande, sinon n'effectuera qu'une copie locale.

Alice se connecte en tant que oper sur le serveur.

oper est dans le groupe admin, et il est donc autorisé à passer root grâce à sudo.

ssh est très regardant concernant les permissions des fichiers. Il n'autorisera les connexions que si les fichiers d'autorisation et les clefs sont correctement protégées des regards indiscrets. Alice aurait pu aboutir au même résultat en faisant un umask 077 après le sudo.

Une fois le fichier mis en place et les permissions corrigées, Alice peut se délogguer du compte root (elle revient du sudo), puis du serveur (elle revient du ssh).

Le moment de vérité... Alice essaie de se connecter en tant que root sur le serveur.

Maintenant Alice utilise le mot de passe qu'elle a utilisé lors de la création de sa clef privée.

Pour faire mémoriser une clef débloquée à ssh-agent, il suffit d'invoquer ssh-add et de taper le mot de passe de déblocage de la clef.

alice@linus:~$ ssh-add
Enter passphrase for /home/alice/.ssh/id_dsa: *****
Identity added: /home/alice/.ssh/id_dsa (/home/alice/.ssh/id_dsa)
Identity added: /home/alice/.ssh/identity (alice@linus)
alice@linux:~$ ssh root@192.168.17.139
Last login: Wed Jun  6 17:54:41 2007 from 192.168.253.70
[root@ubuntu root]# 

3.4.3. Regénération des clefs sur le serveur

On peut parfois avoir besoin de regénérer les clefs du serveur. Dans le cas de machines clonées par exemple, si rien n'est fait les clefs seront identiques sur les clones. Il est préférable de générer une nouvelle clef de serveur afin que chaque serveur ait son propre jeu de clefs.

Poure regenérer les clafs serveurs, on peut invoquer le script de post-installation Ubuntu avec dpkg-reconfigure openssh-server :

alice@michel:~$ ssh root@192.168.17.139
...
root@ubuntu:~# rm /etc/ssh/*key*
root@ubuntu:~# dpkg-reconfigure openssh-server
Creating SSH2 RSA key; this may take some time ...
Creating SSH2 DSA key; this may take some time ...
 * Restarting OpenBSD Secure Shell server...                                                             [ OK ] 
root@ubuntu:~# 

Une autre possibilité consiste à les générer à la main :

alice@michel:~$ ssh root@192.168.17.139
...
root@ubuntu:~# ssh-keygen -f "/etc/ssh/ssh_host_rsa_key" -N '' -t rsa
Generating public/private rsa key pair.
/etc/ssh/ssh_host_rsa_key already exists.
Overwrite (y/n)? y
Your identification has been saved in /etc/ssh/ssh_host_rsa_key.
Your public key has been saved in /etc/ssh/ssh_host_rsa_key.pub.
The key fingerprint is:
eb:46:c3:9c:6f:90:06:b6:c9:f6:3a:9b:11:28:87:41 root@ubuntu
root@ubuntu:~# ssh-keygen -f "/etc/ssh/ssh_host_dsa_key" -N '' -t dsa
Generating public/private dsa key pair.
/etc/ssh/ssh_host_dsa_key already exists.
Overwrite (y/n)? y
Your identification has been saved in /etc/ssh/ssh_host_dsa_key.
Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.
The key fingerprint is:
78:46:c7:97:7d:2f:a7:ad:21:77:9c:01:20:06:29:61 root@ubuntu
root@ubuntu:~# 

Dans les deux cas, Alice devra aussi effectuer une modification dans sa configuration. En effet, ssh étant plutôt strict, il refusera de vous laisser vous connecter à un serveur dont la clef à changé. Ces clefs serveurs sont parfois stockés globalement (/etc/ssh/ssh_known_hosts) mais le plus souvent resident dans ~/.ssh/known_hosts. Ce fichier est en général rempli par ssh avec la clef d'un serveur lors de la première connexion (sauf si le paramètre StrictHostKeyChecking est à yes dans /etc/ssh/ssh_config.

Il faudra alors supprimer manuellement l'ancienne clef serveur de ~/.ssh/known_hosts. Comme le message d'erreur comporte le numéro de ligne (NN ici) contenant l'ancienne clef, l'astuce vi +NNd +x /home/alice/.ssh/known_hosts permet de supprimer la mauvaise clef en une seule commande. Il suffit ensuite de relancer la connexion et d'accepter la nouvelle clef.

alice@linus:~$ ssh root@192.168.17.139
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
eb:46:c3:9c:6f:90:06:b6:c9:f6:3a:9b:11:28:87:41.
Please contact your system administrator.
Add correct host key in /home/alice/.ssh/known_hosts to get rid of this message.
Offending key in /home/alice/.ssh/known_hosts:43
RSA host key for 192.168.17.139 has changed and you have requested strict checking.
Host key verification failed.
alice@linus:~$ vi +43d +x /home/alice/.ssh/known_hosts
alice@linus:~$ ssh root@192.168.17.139
The authenticity of host '192.168.17.139 (192.168.17.139)' can't be established.
RSA key fingerprint is eb:46:c3:9c:6f:90:06:b6:c9:f6:3a:9b:11:28:87:41.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.17.139' (RSA) to the list of known hosts.
Enter passphrase for key '/home/alice/.ssh/id_dsa': *****
Last login: Wed Jun  6 22:41:50 2007 from 192.168.0.228
Linux ubuntu 2.6.20-15-server #2 SMP Sun Apr 15 07:41:34 UTC 2007 i686

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
root@ubuntu:~# 

3.4.4. Modification du mot de passe d'une clef privée

On pourrait critiquer de l'utilité d'une telle fonctionnalité. En effet, pour quelle raison voudrait-on changer de mot de passe ? Soit le mot de passe est compromis (ou est susceptible de l'être). Dans ce cas, la clef privée l'est aussi. Soit on désire utiliser un mot de passe plus robuste. C'est donc que l'ancien ne l'était pas et que la clef n'est pas conséquent plus digne de confiance.

La aussi, chacun d'entre nous devra peser le « pour » et le « pour » et décider d'utiliser ou non cette fonctionalité. C'est l'option -p de la commande ssh-keygen qui permet de modifier le mot de passe de la clef.



[7] il faudra évidemment connaître le mot de passe pour se connecter la première fois sur la machine et y déposer la première clef

[8] il est possible de créer une clef privée sans mot de passe mais c'est déconseillé car extrèmement dangereux