Retrouvez cet article dans : Linux Magazine 82
Le protocole SSH est surtout connu comme étant un moyen sécurisé d’obtenir un shell sur une machine distante. Cette vision n’est pas fausse, mais elle est en revanche terriblement limitée. Dans cet article, nous allons couvrir l’utilisation basique de SSH ainsi que quelques-unes de ses utilisations moins connues, comme le tunneling ou le montage de systèmes de fichiers distants. Nous verrons ainsi que SSH est bien plus qu’un simple remplaçant de telnet !
Historique
SH (pour Secure SHell) est un protocole réseau sécurisé développé à l’université de Helsinki. Son but premier était de fournir un remplaçant robuste aux vieillissants
Utilisation de base
Voici la configuration réseau que nous allons assumer pour les exemples de cet article : lancelot est la machine client sur laquelle nous travaillons. Nous voulons nous connecter à percival, qui dispose donc d’un serveur SSH (Figure 1).
Fig. 1 : Configuration réseau de lancelot et percival.
Utiliser SSH comme telnet
L’exemple le plus simple d’utilisation de SSH est de se connecter directement à un serveur afin d’obtenir un shell :moi@lancelot:~$ ssh percival Password: moi@percival:~$Ici, nous avons simplement ouvert une session pour l’utilisateur moi (qui lance la connexion) sur percival en donnant son mot de passe sur cette machine. Un autre utilisateur peut être précisé en utilisant la syntaxe suivante :
moi@lancelot:~$ ssh lui@percival Password: lui@percival:~$Openssh supporte de nombreuses options. Voici quelques-unes des plus fréquentes :
-Xpermet de rediriger l’affichage des programmes Xwindow vers le serveur X du client. En d’autres termes, si vous lancez un programme X tel quexeyessur le serveur, celui-ci s’exécutera sur ce dernier mais s’affichera sur l’écran du client.-Cpermet de compresser les données transférées. Cette option est souvent utilisée conjointement à -X pour soulager les lignes à bas débit.-v,-vvet-vvvseront utiles si le serveur SSH vous refuse l’accès alors que vous pensez qu’il ne devrait pas. Ces options rendent votre client plus bavard sur ce qu’il fait.
Copie de fichiers distants
SSH offre également un remplaçant à rcp. scp permet de copier un ou plusieurs fichiers en utilisant une syntaxe similaire à celle de cp :
$ scp monfichier.txt lui@percival:~/Ici,
-ppréserve les attributs des fichiers copiés (date de modification, droits, etc.).-rcopie récursivement les répertoires donnés.-C, comme son homologue de SSH, compresse les données durant le transfert.
$ sftp lui@percival Connecting to percival... Password: sftp> ls Desktop Bin sftp> put monfichier.txt Uploading monfichier.txt to /home/lui/monfichier.txt monfichier.txt 100% 12KB 12.1KB/s 00:00 sftp> quit
Utilisation avancée
Nous savons maintenant utiliser SSH comme on utiliseraitClés SSH et méthodes d’authentification
Bien que l’utilisation de SSH du point de vue de l’utilisateur semble aussi simple que celle de$ ssh-keygen -t dsa -b 4096Cette commande suffira pour générer une paire de clés DSA d’une taille de 4096 bits. L’algorithme RSA peut également être utilisé, mais le DSA reste en général préféré. La génération prend un certain temps, après lequel il est demandé dans quel fichier sauvegarder la clé privée (laissez les valeurs par défaut), ainsi qu’une phrase de passe (passphrase). C’est cette phrase qui permettra d’utiliser la clé. Elle constitue une sécurité supplémentaire, car dans le cas où votre clé privée se fait subtiliser, l’auteur du forfait ne pourra rien en tirer s’il ne connaît pas la phrase de passe. Choisissez-la bien. Vous pouvez également décider de vous en passer... à vos risques et périls. Une fois l’exécution de ssh-keygen terminée, vous vous retrouvez donc avec deux fichiers
$ ssh -v percival ... debug1: Authentications that can continue: publickey,keyboard-interactive debug1: Next authentication method: publickey ... debug1: Trying private key: /home/moi/.ssh/id_rsa debug1: Offering public key: /home/moi/.ssh/id_dsa debug1: Server accepts key: pkalg ssh-dss blen 818 debug1: PEM_read_PrivateKey failed debug1: read PEM private key done: type <unknown> Enter passphrase for key ‘/home/moi/.ssh/id_dsa’:Oh ! On nous demande cette fois le mot de passe de la clé privée. Une fois tapé, l’accès Ã
Le gardien des clés
ssh-agent est un petit programme qui gardera nos clés privées ouvertes pour les utiliser à chaque fois que nécessaire, sans redemander leur mot de passe. Si vous le lancez en ligne de commande, vous ne manquerez pas d’être perplexe par son comportement :$ ssh-agent SSH_AUTH_SOCK=/tmp/ssh-sciaTo7933/agent.7933; export SSH_AUTH_SOCK; SSH_AGENT_PID=7934; export SSH_AGENT_PID; echo Agent pid 7934; $C’est déjà fini ? Oui, et en plus, ça n’a servi à rien ! :) ssh-agent est en fait un programme qui est prévu pour être lancé en début de session, avec comme paramètre le programme initial de la session. Si vous travaillez en mode console, ce pourra être bash, si vous êtes sous X, ce sera sans doute votre gestionnaire de fenêtres. Comme sa sortie l’indique, ssh-agent définit quelques variables d’environnement, puis lance le programme passé en paramètre. Si ce programme est celui qui va gérer la session, tous les programmes lancés par la suite seront des fils de ssh-agent et auront donc accès à ces variables d’environnement qui leur permettront de communiquer avec lui. De nombreuses distributions lancent le gestionnaire de fenêtre avec ssh-agent. Si vous êtes logué via l’interface graphique, il y a de grandes chances qu’il soit déjà lancé. Pour vérifier :
$ ps x |grep ssh-agent 7313 ? Ss 0:00 /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-session x-session-managerCe résultat variera selon ce que vous utilisez, mais si vous voyez ssh-agent apparaître, c’est qu’il est déjà lancé. Si vous ne le voyez pas et que vous voulez l’essayer rapidement, vous pouvez lancer ssh-agent bash dans une console par exemple. Tous les programmes que vous lancerez à partir de cette console auront alors accès à votre agent. Une fois ssh-agent lancé, il suffit de lui indiquer que nous voulons garder notre clé privée ouverte :
$ ssh-add Enter passphrase for /home/moi/.ssh/id_dsa:Entrez votre phrase de passe, et voilà ! Vous pouvez dorénavant vous connecter sur
-Dferme toutes les clés ouvertes ;-dferme la clé dont le fichier est donné en paramètre ;-tdurée ne garde les clés ouvertes que pendant une durée limitée (en secondes).
SSH et les tubes
Une grande partie de la puissance du shell réside dans l’utilisation des tubes, permettant de relier la sortie d’une commande à l’entrée d’une autre. Le fait de passer par SSH ne rompt pas cette chaîne, et il est ainsi possible de brancher la sortie de commandes locales sur des commandes distantes, et vice-versa. Tout d’abord, il est possible d’utiliser SSH pour exécuter une simple commande sur la machine distante et récupérer sa sortie. Il suffit de passer la commande à exécuter après le nom d’hôte (de préférence entre guillemets pour la protéger) :moi@lancelot$ ssh lui@percival "ls" Password: Desktop bin monfichier.txt moi@lancelot$Notez que la connexion est coupée dès que la commande distante est exécutée. Voyons maintenant comment nous pouvons tirer parti de cette forme d’appel à SSH. Un problème récurrent pour bon nombre d’entre nous consiste à faire des sauvegardes de ses données les plus importantes. Par sécurité, il est pertinent de stocker ces données sauvegardées sur une autre machine. En combinant bash et SSH, nous allons rendre cette opération possible en une seule ligne de commande qui pourra facilement être définie comme tâche périodique à l’aide de cron. Lorsque l’on demande à SSH d’exécuter une simple commande distante, cette commande peut être branchée avec une commande locale. SSH redirige en effet son entrée standard vers l’entrée standard de la commande distante, et la sortie standard de la commande distante vers la sienne. Voici la ligne permettant de faire une sauvegarde du répertoire
$ tar czf - Documents |ssh percival "cat >sauvegarde.tar.gz"Le paramètre - donné Ã
$ tar cf - Documents |ssh percival "gzip -c >sauvegarde.tar.gz"La restauration de cette sauvegarde pourra se faire de la manière suivante :
$ ssh percival "cat sauvegarde.tar.gz" |tar xzfOn peut donc faire passer les sorties standards de commandes à travers une connexion SSH. Ce serait dommage de s’arrêter là – on peut en effet y faire passer bien d’autres choses !
Tunnels SSH
Pour ce scénario, nous allons compléter notre schéma réseau :$ ssh -L 2500:arthur:110 percival
Fig. 2 : Utilisation d’un tunnel SSH pour atteindre une machine inaccessible à partir du réseau visible.
Du point de vue d’arthur, ce sera percival qui se connecte, pas lancelot !
Nous demandons à SSH de nous connecter à percival. Jusque-là tout est normal. Mais en plus, l’option -L demande à rediriger le port local 2500 vers le port 110 de l’hôte arthur. Celui-ci est spécifié du point de vue de percival – rappelons qu’arthur n’est même pas visible pour lancelot. Le tunnel se fermera avec la session ssh. Du côté du client mail, il suffira de d’indiquer localhost comme serveur de mail, avec le port 2500. Et voilà ! Tant que la connexion SSH restera ouverte, le fait de nous connecter sur le port 2500 de lancelot équivaudra à se connecter sur le port 110 de arthur, et nous pourrons récupérer nos mails à partir de ce dernier, qui transiteront cryptés dans le tunnel SSH.
Intégration et transparence
Maintenant que nous connaissons les principes de SSH et que nous maîtrisons l’outil en ligne de commande, nous allons voir quelques exemples d’intégration dans des applications modernes qui rendent son utilisation plus confortable.
Intégration à KDE et Gnome
Les deux principaux environnements de bureau libres offrent la possibilité de passer par un serveur SSH pour accéder à des fichiers distants. KDE et Gnome proposent une couche d’accès à différents systèmes de fichiers (les KIO pour KDE, gnome-vfs pour Gnome) qui gèrent (entre autres) le protocole SFTP. Cette fonctionnalité très puissante mériterait un article à elle seule. Pour accéder à vos fichiers distants, il suffit de préciser un emplacement sous une forme similaire à celle utilisée pour scp, préfixé de sftp://. Cette syntaxe peut être utilisée dans n’importe quelle boîte d’ouverture/d’enregistrement de fichiers, ou tout simplement dans la barre d’URL de Konqueror ou Nautilus (figure 3). Par exemple : sftp://moi@percival/home/moi/ vous placera dans le répertoire /home/moi de percival, en vous authentifiant en tant que moi.

Si un mot de passe est nécessaire (celui du compte utilisateur distant ou de votre clé SSH), il vous sera demandé au travers d’une boîte de dialogue. KDE propose également un protocole supplémentaire : fish://. Celui-ci n’utilise pas le protocole SFTP, mais passe par une connexion SSH classique assistée d’un script perl. Il peut se révéler utile pour vous connecter à un serveur qui a désactivé le protocole SFTP.
SSHFS
Les intégrations que nous venons de couvrir sont très pratiques et puissantes, mais ne constituent néanmoins pas une solution universelle : elles sont limitées aux applications KDE ou Gnome. Et si je veux ouvrir un fichier distant avec Emacs ? Ou regarder un film avec Mplayer sans avoir à le copier préalablement ? Un autre désavantage de ces couches d’accès est qu’elles traitent les fichiers distants comme des flux et ne supportent pas (du moins à l’heure actuelle) le déplacement. Impossible par exemple de se déplacer dans un fichier son en cours de lecture...
La solution à tous ces problèmes consiste à placer l’accès distant à un niveau plus bas que le middleware applicatif : au niveau du noyau. SSHFS est un système de fichiers utilisant FUSE, le module noyau permettant de développer des systèmes de fichiers au niveau utilisateur.
Beaucoup de systèmes de fichiers existent pour FUSE, comme le fameux GmailFS, ou ce module permettant de monter une KIO... FUSE et SSHFS sont disponibles dans certaines distributions (Ubuntu Breezy notamment). Si la vôtre ne les fournit pas, vous pouvez vous reporter sur la page du projet pour la procédure d’installation.
Attention ! Il faut en général être dans le groupe fuse pour pouvoir monter un système de fichiers avec ce dernier. Une fois installé, vous pouvez invoquer SSHFS comme vous invoqueriez mount :
$ mkdir remote $ sshfs moi@percival:/home/moi remoteCette commande montera le répertoire
$ fusermount -u percivalSSHFS vous offre ainsi un accès distant totalement transparent et sécurisé et un moyen simple d’accéder à vos données de n’importe où ! Vous pouvez par exemple laisser votre collection musicale, vos albums photo ou vos documents de travail sur votre serveur personnel et les avoir toujours à disposition, pourvu que vous disposiez d’une connexion internet.
Conclusion
Nous avons rapidement découvert l’utilisation de base de SSH, ses méthodes d’authentification ainsi que le tunneling. L’utilisation de ce protocole comme moyen d’accès à des fichiers distants, au travers de KDE, Gnome ou FUSE, reste cependant l’utilisation la plus pratique (et aussi la plus méconnue) de ce protocole. Particulièrement adapté à l’utilisation contemporaine des réseaux, SSH permet d’accéder à ses données personnelles de manière simple et sécurisée à partir de n’importe quelle connexion réseau. Liens:- Openssh : http://www.openssh.org/
- FUSE : http://fuse.sourceforge.net/
Port Forwarding iptables et authentification d’hôte par SSH - par Denis Bodor
A chaque première connexion SSH à un hôte distant, ssh, sur le poste client, demande à l’utilisateur de confirmer l’identité de la machine en fournissant l’empreinte de sa clef RSA.
Dans la plupart des cas, avouez-le, vous répondez simplement yes sans vérifier l’empreinte. C’est une très mauvaise chose puisque, si un attaquant est déjà en lice, vous pourriez littéralement accepter une attaque Man-In-the-Middle et toutes celles qui suivront. L’acceptation entraîne l’enregistrement de la clef publique dans un fichier ~/.ssh/known_hosts.
Celle-ci sera vérifiée à chaque connexion par la suite. Encore récemment, les entrées dans ce fichier débutaient par l’adresse IP ou le nom de la machine distante.
A présent, cette information est chiffrée. Un problème survient lorsque, pour une même adresse IP, nous avons plusieurs hôtes serveur SSH à contacter. Le cas typique est celui d’une passerelle/NAT faisant fonctionner un serveur SSH sur le port 22 mais faisant suivre son port 2222 sur le port 22 d’une machine du LAN.
Ainsi, en utilisant l’option -p de ssh on accèdera soit à la passerelle, soit à la machine du LAN. Cependant, dans ~/.ssh/known_hosts, une seule clef sera stockée et un message d’alerte sera affiché si la vérification échoue.
Il existe une solution permettant de régler le problème et de différencier les deux hôtes. Il suffit pour cela de créer des profiles dans votre ~/.ssh/config :
Host gateway
Hostname truc.dom.fr
CheckHostIP no
Port 22
HostKeyAlias gateway
Host mamachine
Hostname truc.dom.fr
CheckHostIP no
Port 2222
HostKeyAlias mamachine
On se connectera alors en utilisant




Laissez une réponse
Vous devez avoir ouvert une session pour écrire un commentaire.