Différences

Cette page vous affiche les différences entre la révision choisie et la version actuelle de la page.

Lien vers cette vue comparative

outils:reseaux:ssh [2008/02/13 21:36]
cdelorme
outils:reseaux:ssh [2008/02/13 21:36] (Version actuelle)
cdelorme
Ligne 1: Ligne 1:
 +====== SSH (Secure Shell) ======
  
 +[[http://​www.openssh.com/​|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 <​nowiki>​www.mon-serveur.com</​nowiki>​. Nous supposons ici qu'un compte utilisateur nommé john existe sur le serveur distant:
 +<​code>​
 +$ 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 ~] $
 +</​code>​
 +
 +
 +
 +
 +===== Exécuter une commande sur un serveur distant =====
 +
 +Exécute la commande //uname -o// sur le serveur distant en tant que john:
 +<​code>​
 +$ ssh john@www.mon-server.com "uname -o"
 +Password: ********
 +GNU/Linux
 +</​code>​
 +
 +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:
 +
 +<​code>​
 +$ 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>
 +</​code>​
 +
 +
 +===== 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:
 +<​code>​
 +$ scp /​home/​john/​mon_fichier.txt john@www.mon-server.com:/​tmp
 +Password: ********
 +mon_fichier.txt ​                             100%  953     ​0.4KB/​s ​  00:00
 +</​code>​
 +
 +Copie récursive d'un répertoire nommé /​home/​john/​mon_repertoire/​ dans le répertoire /tmp du serveur distant:
 +<​code>​
 +$ scp -r /​home/​john/​mon_repertoire/​ john@www.mon-server.com:/​tmp
 +</​code>​
 +
 +===== 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).
 +
 +<​code>​
 +$ ssh -f -N -L 8080:​intranet.gigacorp.com:​80 john@extranet.gigacorp.com
 +Password: ********
 +$ firefox localhost:​8080
 +</​code>​
 +
 +
 +
 +===== 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 <​nowiki>​www.chez-moi.com</​nowiki>​).
 +
 +Voici la commande lancée par l'​utilisateur présent dans les locaux de gigacorp:
 +<​code>​
 +$ ssh -f -N -R 8080:​intranet.gigacorp.com:​80 thomas@www.chez-moi.com
 +Password: ********
 +</​code>​
 +
 +Et la commande lancée par john pour se connecter à l'​intranet depuis chez lui:
 +<​code>​
 +$ firefox localhost:​8080
 +</​code>​
 +
 +=====  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):
 +<​code>​
 +$ 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 ~] $
 +</​code>​
 +
 +=====  Connexion à un serveur distant avec clé publique =====
 +
 +==== Générer un paire de clés ====
 +
 +<​code>​
 +$ 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
 +</​code>​
 +
 +==== 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.
 +<​code>​
 +$ 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.
 +
 +</​code>​
 +Cependant, ssh-copy-id n'est pas toujours disponible. Voici comment procéder si c'est le cas:
 +<​code>​
 +$ 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
 +</​code>​
 +
 +
 +==== 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.
 +<​code>​
 +$ 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 ~] $
 +</​code>​
 +
 +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:​
 +<​file>​
 +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
 +</​file>​
 +Il est également raisonnable d'​ajouter la ligne suivante au fichier .logout:
 +<​file>​
 +kill $SSH_AGENT_PID
 +</​file>​
 +
 +Enfin il reste à taper votre phrase secrète:
 +<​code>​
 +$ ssh-add ~/​.ssh/​id_rsa
 +Enter passphrase for ~/​.ssh/​id_rsa:​ ********
 +</​code>​
 +
 +Et enfin la connexion sans mot de passe ni phrase secrète:
 +<​code>​
 +$ 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 ~] $
 +</​code>​
 +
 +
 +
 +
 +
 +
 +
 +
 +===== 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:​
 +<​file>​
 +/​usr/​bin/​keychain ~/​.ssh/​id_rsa
 +source ~/​.keychain/​`hostname`-sh
 +</​file>​
 +
 +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:
 +<​file>​
 +source ~/​.keychain/​`hostname`-sh
 +</​file>​
 +
 +TODO: 
 +  - -D
 +  - tun/tap
 +  - X11Forwarding
 +  - Port ssh bloqué par firewall
 
outils/reseaux/ssh.txt · Dernière modification: 2008/02/13 21:36 par cdelorme