Utiliser des clefs SSH et un agent-ssh

Le client SSH s’utilise le plus sou­vent avec un cou­ple [utilisateur + mot de passe] vers une machine dis­tante.

Toute­fois, il est fortement conseillé d’utiliser une clef (authen­tifi­ca­tion par clef privée/publique,
voir http://fr.wikipedia.org/wiki/Cryptographie_asym%C3%A9trique ) pour s’authentifier sur la machine dis­tante.
De plus, en utilisant un agent SSH, on peut éviter de taper des mots de passe.

Générer un jeu de clefs

Pour générer son jeu de clefs personnel, on utilise les même commandes que pour le jeu de clefs internes du PSMN .

On ajoute une étape importante : Une passphrase pour verrouiller la clef privée.

Pour Windows, reportez-vous à documentation de PuTTY.

Pour Linux, BSD et MacOS X, voici les étapes à suivre :

Étape 1 : Démarrer la génération d'un jeu de clefs

Dans un Terminal :

user@host:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
            <Appuyer la touche Enter>
Created directory '/home/user/.ssh'.
Enter passphrase (empty for no passphrase):

Étape 2 : Choisir une bonne passphrase

La passphrase est importante, c'est elle qui verrouille votre clef privée. Une bonne passphrase doit comprendre au moins 15 caractères

Ceci est une mauvaise passphrase :

toto

Si la passphrase est trop courte, ou trop mauvaise, le programme va répondre :

Enter same passphrase again: 
passphrase too short: have 4 bytes, need > 4
Saving the key failed: /home/user/.ssh/id_rsa.

failed…

Ceci est une bonne passphrase :

V0ici 1 ex3mple de passphrase c0mpl1quée, v0ire, alambiquée.

Ceci est aussi une bonne passphrase :

Une bouteille de "Glenfîddich Rare Collection 1937" vaut 15 000 euros TTC. Minimum...

Étape 3 : Finir la génération du jeu de clefs

Et ssh-keygen de répondre, pour finir :

Enter same passphrase again: 
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.

Une empreinte de vérification (fingerprint) est également générée (voir ci-dessous) :

The key fingerprint is:
7a:ec:b2:1c:90:f5:2f:77:c5:bc:36:8b:0f:23:2e:76 user@host
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|      .          |
|     o .     o   |
|    o   S     +  |
|     . o .   . . |
|      o + + + +  |
|     ..+o+Eo = o |
|      o+.o. ..o  |
+-----------------+

Étape 4 : Sauvegarder le jeu de clefs

Vous pouvez copier/coller l'empreinte de vérification (fingerprint + image) dans un fichier ~/.ssh/fingerprint.

Sauvegardez votre clef privée (id_rsa), le fichier d'empreinte (fingerprint) et la clef publique (id_rsa.pub), dans un endroit sûr et personnel (une clef USB, par exemple).

Charger l'agent-ssh

Linux / BSD

Il existe tout un tas de méthodes :

  • Utiliser les programmes ssh-askpass ou ssh-askpass-gnome de votre distribution favorite…

ou

  • charger l'agent dans un script :
eval `ssh-agent`
ssh-add

ou

  • Installer et utiliser keychain (outil CLI, prendre l'archive Release).

Vous pouvez utiliser un script (dans votre ~/.bashrc) pour le démarrer, et l'utiliser automatiquement dans vos terminaux :

# add key(s) to agent
eval `keychain --eval --agents ssh id_rsa`

MacOS X

Sur MacOS X, il existe aussi différentes méthodes :

  • Installer et utiliser keychain (outil CLI, prendre le package pour MacOS X).

Vous pouvez utiliser un script (dans votre ~/.bashrc) pour le démarrer, et l'utiliser automatiquement dans Terminal :

# add key(s) to agent
eval `keychain --eval --agents ssh id_rsa`

ou

  • Si vous utilisez MacOSX Keychain, ajoutez l'option –inherit any :
# add key(s) to agent
eval `keychain --eval --agents ssh --inherit any id_rsa`
Si, à chaque ouverture de Terminal, keychain demande votre passphrase, enlevez l'option –inherit any

ou

Pour bénéficier de “l'export X”, il faut aussi démarrer le serveur X sur le Mac, voir X11 et MacOS X

Windows

Sur Windows, il faut utiliser le logiciel PuTTY/KiTTY, dont l'usage est expliqué sur cette page.

Diffuser la clef publique

Pour que le login automatique (ie: sans mot de passe, mais avec passphrase) fonctionne, votre clef publique (id_rsa.pub) doit se trouver sur tous les serveurs cibles, dans le fichier ~/.ssh/authorized_keys.

  • Pour le PSMN, on peut simplement faire comme ceci (le /home est partagé entre tous les serveurs et noeuds de calculs) :
scp ~/.ssh/id_rsa.pub votrelogin@allo-psmn:~/.ssh/authorized_keys
 
  votrelogin@allo-psmn's password:
  id_rsa.pub                    100%  9KB 9.3KB/s   00:00
Cela écrase le fichier ~/.ssh/authorized_keys existant. Pour ajouter votre clef publique au fichier ~/.ssh/authorized_keys existant, utilisez les commandes suivantes :
scp ~/.ssh/id_rsa.pub votrelogin@allo-psmn:~/.ssh/id_rsa.pub
  votrelogin@allo-psmn's password:
  id_rsa.pub                    100%  9KB 9.3KB/s   00:00
ssh votrelogin@allo-psmn
  votrelogin@allo-psmn's password:
 
> cat .ssh/id_rsa.pub >> .ssh/authorized_keys
> exit

Si vous avez bien chargé votre agent-ssh, vous pouvez maintenant vous connecter sur allo-psmn, sans fournir votre mot de passe :

user@host:~$ ssh votrelogin@allo-psmn.ens-lyon.fr

(votrelogin correspond à votre login au PSMN)

Exemples et Cas particuliers

Exemple de configuration pour Linux et BSD

On peut automatiser les étapes de la connexion en utilisant le fichier config de SSH sur votre poste de travail. En voici un exemple :

  • ~/.ssh/config pour Linux ou BSD
config
Host *
  ServerAliveInterval 60
  ForwardX11Timeout 1d
  TCPKeepAlive yes
  ForwardAgent yes
  ForwardX11 yes         # pour Linux
#  ForwardX11Trusted yes # pour MacOSX
  Compression yes
  StrictHostKeyChecking no
  HashKnownHosts no
 
###
# passerelle interne
Host allo-psmn
  User <login PSMN>
  HostName allo-psmn.psmn.ens-lyon.fr
 
# connexion à x5650comp1 depuis l'interieur de l'ENS
Host comp1
  User <login PSMN>
  Hostname x5650comp1
  ProxyCommand ssh <login PSMN>@allo-psmn netcat -w1 %h %p
 
# connexion à e5-2670comp2 depuis l'interieur de l'ENS
Host comp2
  User <login PSMN>
  Hostname e5-2670comp2
  ProxyCommand ssh <login PSMN>@allo-psmn netcat -w1 %h %p
 
###
# passerelle externe
Host allo-externe
  User <login PSMN>
  ProxyCommand ssh <login PSMN>@ssh.psmn.ens-lyon.fr tcpconnect allo-psmn %p
#  User <login ENS>
#  ProxyCommand ssh <login ENS>@ssh.ens-lyon.fr tcpconnect allo-psmn %p
 
# connexion à x5650comp1 depuis l'exterieur de l'ENS
Host comp1-ext
  User <login PSMN>
  HostName x5650comp1
  ProxyCommand ssh <login PSMN>@allo-externe netcat -w1 %h %p
 
# connexion à e5-2670comp2 depuis l'exterieur de l'ENS
Host comp2-ext
  User <login PSMN>
  Hostname e5-2670comp2
  ProxyCommand ssh <login PSMN>@allo-externe netcat -w1 %h %p

Bien évidemment, il faut remplacer <login PSMN> par votre login du PSMN, et <login ENS> par votre login de l'ENS. netcat -w1 peut être remplacé par tcpconnect.

La liste des serveurs de connexion du PSMN est disponible sur cette page.

Ce fichier contient déjà des rebonds. Pour plus d'explication, la documentation sur les rebonds et leur automatisation est disponible sur cette page.

Exemple de configuration pour MacOS X

Sur MacOS X, il vaut mieux utiliser l'option -Y au lieu de -X (ou ForwardX11Trusted yes au lieu de ForwardX11 yes dans votre fichier ~/.ssh/config). En voici un exemple :

  • ~/.ssh/config pour MacOS X
config
Host *
  ServerAliveInterval 60
  ForwardX11Timeout 1d
  TCPKeepAlive yes
  ForwardAgent yes
#  ForwardX11 yes       # pour Linux
  ForwardX11Trusted yes # pour MacOSX
  Compression yes
  StrictHostKeyChecking no
  HashKnownHosts no
 
###
# passerelle interne
Host allo-psmn
  User <login PSMN>
  HostName allo-psmn.psmn.ens-lyon.fr
 
# connexion à x5650comp1 depuis l'interieur de l'ENS
Host comp1
  User <login PSMN>
  Hostname x5650comp1
  ProxyCommand ssh <login PSMN>@allo-psmn netcat -w1 %h %p
 
# connexion à e5-2670comp2 depuis l'interieur de l'ENS
Host comp2
  User <login PSMN>
  Hostname e5-2670comp2
  ProxyCommand ssh <login PSMN>@allo-psmn netcat -w1 %h %p
 
###
# passerelle externe
Host allo-externe
  User <login PSMN>
  #HostName allo-psmn
  ProxyCommand ssh <login PSMN>@ssh.psmn.ens-lyon.fr tcpconnect allo-psmn %p
 
# connexion à x5650comp1 depuis l'exterieur de l'ENS
Host comp1-ext
  User <login PSMN>
  HostName x5650comp1
  ProxyCommand ssh <login PSMN>@allo-externe netcat -w1 %h %p
 
# connexion à e5-2670comp2 depuis l'exterieur de l'ENS
Host comp2-ext
  User <login PSMN>
  Hostname e5-2670comp2
  ProxyCommand ssh <login PSMN>@allo-externe netcat -w1 %h %p

Bien évidemment, il faut remplacer <login PSMN> par votre login au PSMN. netcat -w1 peut être remplacé par tcpconnect.

La liste des serveurs de connexion du PSMN est disponible sur cette page

Ce fichier contient déjà des rebonds. Pour plus d'explication, la documentation sur les rebonds et leur automatisation est disponible sur cette page.

export X pour MacOS X

Pour pouvoir utiliser “l'export X” sur un Mac, il faut démarrer le logiciel X11 (dans Applications/Utilitaires, comme Terminal) avant d'initier une connexion SSH.

Rebonds et multiples rebonds

Pour plus d'explication, la documentation sur les rebonds et leur automatisation est disponible sur cette page.

documentation/tutorials/ssh/clef_agent_ssh.txt · Dernière modification: 2019/04/24 10:22 par ltaulell