====== 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 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: - -D - tun/tap - X11Forwarding - Port ssh bloqué par firewall