SSH et authentification forte

Aujourd'hui au cours d'un entretien pour un stage en entreprise on m'a demandé si j'avais déjà mis en place un serveur ssh avec un système d'authentification dite forte; basé sur une passphrase...

Le résultat est que il ne vous est plus demandé de mot de passe au moment de l'authentification avec le serveur

J'avais à l'époque tenté de mettre en place ce système sans grand succès. Et dans un élan d'honnêteté j'ai avoué que je n'avais pas réussi à le faire fonctionner à l'époque. Petit boulette de ma part je dois l'avouer. De retour à la maison c'est donc la première chose sur laquelle je me suis jeté. Et après dix minutes ça fonctionne nickel. :-) pas si mauvais qu'il en a l'air le gars !

Alors voici la procédure étape par étape :

Tout d'abord coté client; créons les clés privé e et publique.

client@laptop:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/client/.ssh/id_rsa): /home/client/.ssh/id_rsa1
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/client/.ssh/id_rsa.
Your public key has been saved in /home/client/.ssh/id_rsa.pub.
The key fingerprint is:
0c:5b:45:9b:e3:c2:a7:15:e4:37:e8:5b:0e:3c:4d:40 client@laptop

Note : entrez une passphrase relativement complexe mélangeant symboles et caractères alphanumériques et enregistrez la dans un fichier car elle vous sera demandée à chaque utilisation de ssh-agent. Dans le cas ou vous ne voudriez pas d'une clé trop compliquées; il est recommandé de choisir un mot de passe différent de celui utilisé sur le poste.

Note : apparemment dans la "vraie vie" :-) les passphrases sont bien souvent vides. Permettant ainsi l'utilisation de nombreuses fonctionnalités qu'offre ssh ou encore rsh (transfert de fichiers, exécution de commandes distantes...)

Il ne ne nous reste à présent qu'à fournir au serveur distant notre clé publique fraîchement générée contenue dans le fichier /home/client/.ssh/id_rsa.pub

client@laptop:~$ ssh-copy-id -i /home/client/.ssh/id_rsa.pub client@10.3.120.1
client@10.3.120.1's password:

cette commande va copier la clé contenue dans le fichier /home/client/.ssh/id_rsa.pub du poste client vers le fichier /home/client/.ssh/authorized_keys du serveur distant.

Note : étant donné qu'il s'agit de sécuriser la connexion j'aurai tendance à vous suggerer d'ajouter à la main l'entrée dans le fichier authorized_keys directement depuis votre serveur. La commande précédente va en effet envoyer votre clé privé par le réseau internet jusqu'à votre serveur. La bonne démarche serait donc d'aller physiquement sur le serveur et de copier votre clé id_rsa.pub dans le fichier authorized_keys

Bon histoire de bien comprendre la suite nous allons faire un bref bilan de la situation.

Nous avons la clé publique

/home/client/.ssh/id_rsa.pub

la clé privé

/home/client/.ssh/id_rsa

une clé énorme imprononçable

'u'(çàt_jzrhgiluzhgfuljsr_ç'"(à"'hzertç_@'"'fsd

voila les trois informations que vous devrez toujours avoir sur vous pour pouvoir utiliser l'agent de connexion ssh-agent sur des postes différents.

Enfin le serveur dispose de notre clé publique stocké dans le fichier /home/client/.ssh/authorized_keys

Passons maintenant à la connexion en elle même Alors comme je l'ai dis précédemment nous avons besoins des deux fichiers pour pouvoir nous authentifier

l'agent de connexion ssh-agent permet donc d'établir une connexion sécurisée; nous verrons plus tard en quoi.

place à la pratique

lançons screen dans une session ssh-agent :

client@laptop:~$ ssh-agent screen

puis ajoutons la clé publique à la session ssh-agent (votre clé est directement stockée dans la RAM)

client@laptop:~$ ssh-add
Enter passphrase for /home/client/.ssh/id_rsa:

Renseignez la passphrasse puis validez.

Identity added: /home/client/.ssh/id_rsa (/home/client/.ssh/id_rsa)
client@laptop:~$

Vérifions que la clé a bien été ajoutée à la session ssh-agent

client@laptop:~$ ssh-add -L%%%
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAtQXF85JQDXLcobMQmw5YjzFovEreDRiJ+dJnhpkutJbtdWGhJyZB+EgRTuZQgx0LjjEnykQrqAt5oUi9z5Vsj6C/fEqFlkhvhNQRFxpQOuOkAyM/WrdeuCM/Acu/bWAYIDFQdAwzs62BKJ29DS6l9HUFKQS/GULoqaUDTzXzKPdY/s22uT1Ubf1Ve+4ZQXsSs9cklBqBndP3gakEgD8vcj2QzP4sjncorqRu8vMq7S3fQ6sLvtKz+pwywNw7rbXIFq5wbBQZEEk2a3DuVMGUkQwxhptcD8XECA6BgCMvYnHZa41MsdBvVlQw6728wxKOPFJZeL3QPxcaDMVM6g5YuQ== /home/client/.ssh/id_rsa%%%
client@laptop:~$%%%

Voila qui est maintenant confirmé.
Note : La clé de cryptage etant stockée dans la RAM de votre machine; il vous faudra à chaque redémarrage renseigner votre passphrase pour rendre l'authentification transparente pour le reste de la session. Nous pouvons à présent nous connecter de façon totalement sécurisée sans renseigner aucun mot de passe.

client@laptop:~$ ssh client@10.3.120.1
Linux server 2.6.22-14-generic #1 SMP Tue Feb 12 07:42:25 UTC 2008 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.
You have new mail.
Last login: Sat May 17 00:50:23 2008 from laptop.local

client@server:~$

Voila nous avons vu en pratique comment cela fonctionne.

La bonne nouvelle c'est que j'ai pu constater qu'une session ssh-agent se lançait automatiquement au démarrage de mon interface graphique.le résultat est qu'à la prochaine connexion les connexions ssh que vous établirez avec votre serveur utiliserons directement l'authentification forte simplement en ajoutant l'identité RSA du client en utilisant la commande suivante.

client@server:~$ ssh-add

-i permet de spécifier le fichier .pub à utiliser s'il se trouve dans un chemin différent

les petites astuces sur le tas

Charger ssh-agent au chargement de votre profil utilisateur :

Cette technique forte intéressante permet de lancer une session ssh-agent à chaque fois que vous charger votre profil utilisateur. Résultat dans chaque terminal ouvert se chargera automatiquement en arrière plan une tâche ssh-agent. Vous pourrez ainsi charger vos clés publiques sans vous soucier de l'agent. Pour se faire ajoutez simplement les lignes suivantes à votre fichier ~/.profile :


## demarrer l'agent ssh
SSHAGENT=/usr/bin/ssh-agent
SSHAGENTARGS="-s"
if [ -z "$SSH_AUTH_SOCK" -a -x "$SSHAGENT" ]; then
  eval `$SSHAGENT $SSHAGENTARGS`
  trap "kill $SSH_AGENT_PID" 0
fi

Si vous n'avez pas d'agent ssh-agent associé à une session graphique ou si tout simplement vous n'utilisez pas de session graphique.

Vous avez pu le remarquer: l'authentification forte créée par l'agent ssh-agent est limitée au seul terminal de la session screen. Il est cependant possible d'"exporter" cette session vers d'autres terminaux et ainsi permettre une connexion au serveur avec une authentification forte.

lorsque l'on ajoute une identité à une session ssh-agent; la variable SSH_AUTH_SOCK est renseignée par le chemin du socket crée. Il suffit donc simplement de récupérer la valeur de cette variable et de l'exporter ensuite vers le terminal dans lequel nous souhaitons utiliser l'authentification forte.

pour récupérer le chemin du fichier pointant sur le socket. tapez cette commande dans le terminal dans lequel est lancé ssh-agent

client@laptop:~$ echo $SSH_AUTH_SOCK
/tmp/ssh-pTlAZa6203/agent.6203
client@laptop:~$

ouvrez ensuite un nouveau terminal et renseignez la variable SSH_AUTH_SOCK dans celui-ci

client@laptop:~$ export SSH_AUTH_SOCK='/tmp/ssh-pTlAZa6203/agent.6203'
client@laptop:~$

voila vous pouvez à présent utiliser l'authentification forte dans votre nouveau terminal.

Et just for fun; un p'tit script concocté par notre ami Mojo permettant de récupérer la variable SSH_AUTH_SOCK:

#!/bin/sh
PID=`/bin/ps -u $USER|grep ssh-ag|head -n1 |cut -b2-6`
for i in /tmp/ssh-*
do
if [ -w $i/agent.* ]
then
SOCK=`ls $i/agent.*`
fi
done

echo setenv SSH_AGENT_PID $PID
#export SSH_AGENT_PID
#SSH_AUTH_SOCK=$SOCK
echo setenv SSH_AUTH_SOCK $SOCK
#export SSH_AUTH_SOCK
echo ssh-add


Maintenant pourquoi cette méthode serait elle plus sécurisée qu'une autre ?

Je vois tout de suite la réaction de tout le monde: "Pourquoi je m'embêterai à avoir constamment ces trois informations pour simplement me connecter sans mot de passe à mon compte ssh ?"

Voici quelques éléments de réponse que j'ai pu comprendre de diverses documentations ainsi que le man des différents outils utilisés.

Comme nous avons pu le voir à travers les différentes commandes lancées précédemment; ssh-agent exécute une commande et reste lancé en arrière-plan. Pour faire simple; voyons un peu cela comme une session. La vocation de cette session est de stocker vos clé privées. Initialement ssh-agent ne connaît aucune de vos clés. Elles sont ajoutées à la session via la commande ssh-add. Sans paramètre la commande va charger les clés contenues dans /.ssh/id_dsa et ~/.ssh/identity (pour les authentifications ssh1) une fois les clés ajoutées à la session ssh-agent, toutes les opérations qui nécessitent une clé privée seront exécutées par ssh-agent et retournées ensuite au client. Cela aura pour conséquence que les clés privées ne seront jamais connues du client et que la passphrase ne sera jamais envoyée sur internet.

Voila donc la fin d'un nouvel article venu. Je m'en retourne donc à mes moutons en vous laissant soin de ne pas perdre les clés ;-)

Note : Après un premier essai infructueux; j'ai remis le serveur "zéro" en effaçant tous les fichiers contenus dans le dossier concernant ssh à savoir /etc/ssh/ et ~/.ssh/ . j'ai ensuite régénéré les clés pour le serveur

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

La discussion continue ailleurs

URL de rétrolien : http://blog.tools-fm.com/index.php?trackback/49

Fil des commentaires de ce billet