SSH (Secure Shell)

ssh (client SSH) est un programme qui permet de se connecter sur une machine distante, ou d'exécuter des commandes sur une machine distante. Il a pour objectif de remplacer rlogin et rsh, et fournit des transmissions sécurisées et chiffrées entre deux machines non sûres, et ce à travers un réseau non sécurisé. On peut également transférer des connexions X11 et des ports TCP/IP arbitraires à travers un tunnel sécurisé.

Connexion à un serveur distant

Connexion en tant que john au serveur distant www.mon-serveur.com. Nous supposons ici qu'un compte utilisateur nommé john existe sur le serveur distant:

$ ssh john@www.mon-serveur.com
Password: ********
Last login: Fri Feb  1 12:32:47 2008 from www.chez-moi.com
[john@www.mon-serveur.com ~] $

Exécuter une commande sur un serveur distant

Exécute la commande uname -o sur le serveur distant en tant que john:

$ ssh john@www.mon-server.com "uname -o"
Password: ********
GNU/Linux

Note: Lorsque vous exécutez une commande à distance, vous n'avez que la sortie standard et la sortie d'erreur (stdout/stderr). Par exemple si le programme exécuté vous demande un mot de passe, vous ne pourrez pas le saisir. Pour disposer de l'entrée standard (stdin) en plus, il faut utiliser l'option -t comme ceci:

$ ssh -t john@www.mon-server.com "mysql -u root -p"
Password: ********        <---- mot de passe ssh
Enter password: ********  <---- mot de passe mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 973494

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

Copier des fichiers sur un serveur distant

Copie d'un fichier nommé /home/john/mon_fichier.txt dans le répertoire /tmp du serveur distant:

$ scp /home/john/mon_fichier.txt john@www.mon-server.com:/tmp
Password: ********
mon_fichier.txt                              100%  953     0.4KB/s   00:00

Copie récursive d'un répertoire nommé /home/john/mon_repertoire/ dans le répertoire /tmp du serveur distant:

$ scp -r /home/john/mon_repertoire/ john@www.mon-server.com:/tmp

Rediriger un port distant en local

La commande suivante permet d'accéder à l'intranet de la société gigacorp en localhost sur le port 8080, par rebond sur l'extranet (on suppose ici que l'extranet est dans le même réseau local que l'intranet, et que l'utilisateur y accède depuis chez lui).

$ ssh -f -N -L 8080:intranet.gigacorp.com:80 john@extranet.gigacorp.com
Password: ********
$ firefox localhost:8080

Rediriger un port local à distance

La commande suivante permet à un utilisateur présent dans les locaux de la société gigacorp de rendre accessible l'intranet à son collègue john depuis chez lui. (On suppose ici que l'intranet n'est accessible que depuis le réseau local de gigacorp et que l'utilisateur thomas a un compte sur la machine www.chez-moi.com).

Voici la commande lancée par l'utilisateur présent dans les locaux de gigacorp:

$ ssh -f -N -R 8080:intranet.gigacorp.com:80 thomas@www.chez-moi.com
Password: ********

Et la commande lancée par john pour se connecter à l'intranet depuis chez lui:

$ firefox localhost:8080

Chaîner des connexions SSH

La commande suivante permet de se connecter au serveur serverC en rebondissant par les serveurs serverA et serverB (on suppose ici que serverC n'est accessible que depuis serverB, que serverB n'est accessible que depuis serverA, et que serverA est accessible depuis internet):

$ ssh -t loginA@serverA "ssh -t loginB@serverB \"ssh loginC@serverC\""
loginA@serverA's password: ********
loginB@serverB's password: ********
loginC@serverC's password: ********
Last login: Fri Feb  1 12:39:12 2008 from serverB
[loginC@serverC ~] $

Connexion à un serveur distant avec clé publique

Générer un paire de clés

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/john/.ssh/id_rsa): ********
Enter passphrase (empty for no passphrase): ********
Enter same passphrase again: 
Your identification has been saved in /home/john/.ssh/id_rsa.
Your public key has been saved in /home/john/.ssh/id_rsa.pub.
The key fingerprint is:
52:77:35:e9:a7:f8:53:97:c2:9e:ff:39:d2:b7:ab:b6 john@chez-moi

Déposer votre clé publique sur le serveur distant

Il faut maintenant déposer votre clé publique sur le serveur distant. Il existe un outils nommé ssh-copy-id dédié à cette tâche.

$ ssh-copy-id -i ~/.ssh/id_rsa.pub john@www.mon-server.com
Password: ********
Now try logging into the machine, with "ssh 'john@www.mon-server.com'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

Cependant, ssh-copy-id n'est pas toujours disponible. Voici comment procéder si c'est le cas:

$ scp ~/.ssh/id_rsa.pub john@www.mon-server.com:/tmp
id_rsa.pub                              100%  406     0.4KB/s   00:00    
$ ssh john@www.mon-server.com
Password: ********
Last login: Fri Feb  1 12:37:14 2008 from www.chez-moi.com
[john@www.mon-serveur.com ~] $ touch ~/.ssh/authorized_keys
[john@www.mon-serveur.com ~] $ chmod 600 ~/.ssh/authorized_keys
[john@www.mon-serveur.com ~] $ cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys
[john@www.mon-serveur.com ~] $ rm /tmp/id_rsa.pub
[john@www.mon-serveur.com ~] $ exit

Se connecter au serveur

La connexion au serveur se fait de la même façon, excepté que c'est la phrase secrète de votre clé privée qui est demandée au lieu du mot de passe de votre compte sur le serveur distant.

$ ssh john@www.mon-server.com
Enter passphrase for ~/.ssh/id_rsa: ********
Last login: Fri Feb  1 12:37:14 2008 from www.chez-moi.com
[john@www.mon-serveur.com ~] $

Quel interêt me direz-vous puisque l'on doit toujours taper un mot de passe ?

  • Si vous devez vous connecter fréquemment sur différents serveurs, vous n'avez qu'un seul mot de passe à connaître.
  • Il existe un programme nommé ssh-agent permettant de ne taper votre phrase secrète qu'une seule fois pour plusieurs connexion.

Utiliser ssh-agent

Note: Il est recommandé d'utiliser keychain plutôt que directement ssh-agent (voir plus bas). Si vous souhaitez utiliser keychain, vous pouver sauter cette partie.

ssh-agent permet de garder en mémoire la clé privée et donc de ne taper qu'une fois votre phrase secrète.

Pour utiliser ssh-agent, il faut ajouter les lignes suivantes à votre fichier ~/.bash_profile:

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

Il est également raisonnable d'ajouter la ligne suivante au fichier .logout:

kill $SSH_AGENT_PID

Enfin il reste à taper votre phrase secrète:

$ ssh-add ~/.ssh/id_rsa
Enter passphrase for ~/.ssh/id_rsa: ********

Et enfin la connexion sans mot de passe ni phrase secrète:

$ ssh john@www.mon-serveur.com
Last login: Fri Feb  1 12:32:47 2008 from www.chez-moi.com
[john@www.mon-serveur.com ~] $

Utiliser keychain

Keychain permet de gérer ssh-agent de façon simple et optimisée. De plus, keychain permet d'utiliser ssh-agent dans des scripts ou même dans des tâches cron.

Pour utiliser keychain il faut simplement ajouter les lignes suivantes au début de votre fichier ~/.bash_profile:

/usr/bin/keychain ~/.ssh/id_rsa
source ~/.keychain/`hostname`-sh

Si vous utilisez zsh il faut ajouter les lignes précédentes au fichier ~/.zlogin

Il faut maintenant se déconnecter puis se reconnecter. Keychain vous demandera votre phrase secrète à la connexion. Il est maintenant possible de se connecter avec ssh sans entrer votre mot de passe.

Utiliser keychain dans un script ou une tâche cron

Pour utiliser keychain dans un script ou une tâche cron, il suffit d'ajouter cette ligne dans le script en question avant d'utiliser ssh:

source ~/.keychain/`hostname`-sh

TODO:

  1. -D
  2. tun/tap
  3. X11Forwarding
  4. Port ssh bloqué par firewall
 
outils/reseaux/ssh.txt · Dernière modification: 2008/02/13 21:36 par cdelorme