SSH Simplifier une connexion passant par un Proxy
Sommaire
2.1 Génération de clef de chiffrement
2.2 Fonctionnement des clefs de chiffrement
3 Faire « rebondir » une connexion SSH
La plus part des utilisateurs avancés en informatique utilisent leur poste personnel pour se connecter vers des serveurs de travail distants qui sont dans de nombreux cas extérieurs à leur réseau local.
Le protocole standard de connexion dans ce cas est le SSH pour Secured SHell (terminal sécurisé).
Utiliser ce type de connexion peut être relativement fréquent lors d'une journée de travail classique derrière un ordinateur, la copie et/ou la récupération de données sur une machine extérieure au réseau local auquel appartient le poste de travail devient alors quelque chose de routinier.
L'évolution des conditions de sécurité est telle que les connexions entre le parc d'ordinateur d'un réseau local et des machines situées en dehors de ce réseau (sur internet) sont de plus en plus souvent centralisées et filtrées par une machine appelée 'Proxy':
Utilisation d'un proxy
Cette procédure est un moyen supplémentaire pour l'administrateur du réseau de détecter les tentatives d'intrusion sur l'ensemble des ordinateurs qu'il surveille.
Cependant elle complique les opérations usuelles de connexion, d'envois et de récupérations de données des utilisateurs du réseau local ainsi protégé.
En effet les utilisateurs doivent alors se connecter dans un premier temps sur la machine proxy depuis leur poste local avant de pouvoir se connecter sur une machine extérieure depuis leur poste sur le proxy.
De la même manière pour récupérer des données sur la machine distante il faudra dans un premier temps les transférer sur la machine proxy puis les transférer à nouveau sur le poste du réseau local.
Le document suivant illustre le moyen de faire passer inaperçu les connexions passant par le proxy de manière à simplifier la communication et le travail entre les réseaux locaux et externes.
La commande de base pour lancer une connexion SSH est :
[user@pc-client ~]$ ssh -l login pc-serveur
Ce qui équivaut à :
[user@pc-client ~]$ ssh login@pc-serveur
où l'utilisateur user de la machine pc-client va se connecter sur le compte de l'utilisateur login sur la machine distante pc-serveur.
De plus toute connexion SSH repose sur une authentification, l'utilisateur qui lance la connexion depuis une machine locale doit en effet s'identifier sur la machine distante.
Pour cela il existe deux possibilités, la première est de saisir à chaque fois le mot de passe correspondant au nom d'utilisateur donné dans la commande de connexion et qui est login dans l'exemple précédent :
[user@pc-client ~]$ ssh -l login pc-serveur
login@pc-serveur's password:
Il faut donc saisir le mot de passe de l'utilisateur distant, ce qui peut être relativement fastidieux si l'on utilise plusieurs connexions ou si l'on doit rétablir la même connexion plusieurs fois par jour.
La seconde beaucoup plus fiable et intéressante est l'utilisation d'une clef de chiffrement (parfois appelée à tort clef de cryptage).
Cette clef est le garant de l'identité électronique et permet de se passer de mot de passe lors de la connexion.
Une clef de chiffrement est spécifique à un utilisateur et une machine donnée, de plus la clef se compose de deux parties, une partie privée réservée à l'ordinateur et à l'utilisateur local, et une partie publique destinée à tout ordinateur distant sur lequel l'utilisateur de l'ordinateur local souhaite se connecter.
La technique présentée dans ce document pour faire « rebondir » une connexion SSH sur une machine proxy est basée sur l'utilisation des clefs de chiffrement.
Sachant que la complexité de la clef augmente de façon exponentielle avec sa taille bits utiliser des clefs de chiffrement permet de conserver des marges confortables de sécurité.
Sur Linux/Unix la commande à utiliser pour générer une clef de chiffrement est la suivante :
[user@pc-client ~]$ ssh-keygen
Cependant pour des besoins particuliers, il est possible de préciser des options :
[user@pc-client ~]$ ssh-keygen -t rsa -b 4096
où l'option -t indique le type de chiffrement (ici rsa du nom des mathématiciens Rivest, Shamir et Adleman qui l'ont développé) et l'option -b la complexité du chiffrement (ici 4096 bits).
En tapant [Entrée] une invite demande de donner le dossier dans lequel les clefs vont être déposées :
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Ce dossier est toujours par défaut le dossier ~/.ssh qui est un dossier caché dans le répertoire racine de l'utilisateur, le ~ est la syntaxe abrégée de /home/user/ et désigne le répertoire de connexion par défaut de l'utilisateur dans un système Linux/Unix.
En tapant [Entrée] pour conserver cette valeur par défaut il vient :
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Il est alors possible de rajouter une phrase de passe (et non un mot de passe) additionnelle dans la clef, étape qui permet de sécuriser d'avantage la clef privée.
Cependant cette phrase de passe peut être vide (ce qui équivaut à une absence de phrase de passe), dans ce cas seul la correspondance entre les parties privée (depuis le client qui se connecte) et publique (sur le serveur distant) va être utilisée pour authentifier et activer la connexion.
Et enfin un résumé du travail effectué pour générer les clefs est affiché :
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
49:99:10:a8:80:a0:80:99:34:09:3b:1a:86:cf:1d:6b login@pc-client
Cette commande permet de créer deux fichiers placés par défaut dans le répertoire ~/.ssh/ et se nommant id_rsa (qui représente la partie privée de la clef) et id_rsa.pub qui représente la partie publique de la clef.
•.Partie publique d'une clef de chiffrement 4096 bits de type rsa pour l'utilisateur user sur la machine pc-client :
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAgEAsAQld3wDloQxCC/ANMMAFS8/p1tYqMOKNinmb+
f9EUV6WXsbIOrlF104LVa1hcduowroDKLxOYczdB7FW+TnFCuUdstCCajOdr0lg+tjw7qtGAG3
Bv16V45vnBAPq2NP00Y942yhasAbt7U1yRbHXMHYZu2dKSongh/tUrcO66thIRyHrNZD7pDrg+
jc7REMW2JhPGukstjaH4+pJo+p0ML4+d5IoegOIIMlxANTqysaCSqI/QfbzN5JZgJEtWUYgEA9
Vsb4EO/dGwSdDaoZ8aKfKUvGDGR6HpmRJH2qAeztoi42kiBxRMRlHedsQg8PphvGi+6VDTf8uK
Y4OW7BUWV7MBIfIJj+gf4shIeQWs7zaLx4k9zeTwspFQTN7jYdFTotNelJWEmNBKj+TwEZj7Vd
8mM157xt/lGp5Rx9EdrcNsGJ3+xvYumqLdTuPJkslqIW9WjvB6mJLcKgkYe6URi+JKif47YdXe
I6CcFcd5BVEjJn1t2Yyj5QNHOJbzVvvOLH9OKvdIl7V5S29/dkUz9CO/WpoSJRzUsQdXMocHTS
0Jc0siz9op1Ii2h2nyPkJsvlzopIOBd5zW9UZj2u/VTjKNKCSHoeiJVqrLt/CmwlTPXvV053nm
Ya+MF/HAogVP7OwHaecxz0SNwNUou4YOu/GuO6SNKEWyy2ydQdM9s= user@pc-client
L'instruction user@pc-client est facultative, il est possible de la remplacer par l'adresse IP ou un vide ce qui est utile lorsque que l'ordinateur ne se connecte pas sur le web en utilisant une adresse IP fixe (cas d'un ordinateur personnel avec connexion par modem réinitialisée à chaque mise en fonction).
•.Partie privée d'une clef de chiffrement 4096 bits de type RSA pour l'utilisateur user sur la machine pc-client :
-----BEGIN RSA PRIVATE KEY-----
MIIJJQIBAAKCAgEAsAQld3wDloQxCC/ANMMAFS8/p1tYqMOKNinmb+f9EUV6WXsb
IOrlF104LVa1hcduowroDKLxOYczdB7FW+TnFCuUdstCCajOdr0lg+tjw7qtGAG3
Bv16V45vnBAPq2NP00Y942yhasAbt7U1yRbHXMHYZu2dKSongh/tUrcO66thIRyH
[...]
EByseaTX1VR/FAT5h/BaegxW5uhJSf/5LCDZ1l6Lj/KOdQpeU33L0a8lUjvVXr2p
YQZO/HIKCTvhKp6sTjuZz7BqMfUl0fpEpVQCCEkgeJhfMynmbdpHYeVbdZD0pV85
duRCCc0CfqVr5b0QFzH9XXhgwPeMiSThT+KK6YiSX/EJ7XICVI8Yaew=
-----END RSA PRIVATE KEY-----
La partie privée de la clef de chiffrement ne doit en aucun cas être partagée, elle est la propriété exclusive de utilisateur qui l'a créée.
Il ne faut jamais la déplacer, modifier les conditions d'accès ou le contenu du fichier lui même.
Le degré de complexité de ces clefs est évident et est assez impressionnant en comparaison de celui d'un mot de passe classique.
Pour pouvoir établir une connexion par clefs chiffrées entre le poste local sur lequel la clef a été créée et un poste distant, il faut tout d'abord se connecter une fois sur le poste distant en utilisant la méthode d'authentification par mot de passe.
Il faut ensuite se placer dans le dossier ~/.ssh de la machine distante et créer un fichier dont le nom est authorized_keys.
Ce fichier doit contenir une copie des clefs publiques des utilisateurs pouvant se connecter sur la machine distante (une simple copie du contenu du fichier id_rsa.pub généré plus haut).
[user@pc-client ~]$ scp ~/.ssh/id_rsa.pub login@pc-serveur:rsa.pub-user
login@pc-serveur's password:
id_rsa.pub 100%
[user@pc-client ~]$ ssh login@pc-serveur
login@pc-serveur's password:
[login@pc-serveur ~]$ cat rsa.pub-user >> ~/.ssh/authorized_keys
[login@pc-serveur ~]$ rm rsa.pub-user
Attention ! [login@pc-serveur ~]$ chmod 600 ~/.ssh/authorized_keys ou [login@pc-serveur ~]$ chmod u+rw,g-rwx,o-rwx ~/.ssh/authorized_keys |
Configuration du serveur SSH PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys L'option PubkeyAuthentication permet d'activer l'authentification par clef, l'option AuthorizedKeysFile renseigne, pour chaque utilisateur, le nom du fichier dans lequel doivent être placées les clefs publiques des machines se connectant sur le serveur SSH. # systemctl restart sshd.service |
À partir de maintenant la connexion entre les deux machines dans le sens poste local vers poste distant se fera sans nécessiter de mot de passe et avec des clefs de chiffrement.
Il n'y a simplement qu'à saisir la commande dans un terminal pour être connecté instantanément sans aucune autre formalité :
[user@pc-client ~]$ ssh login@pc-serveur
[login@pc-serveur ~]$
Connexion du serveur vers le client |
Attention ! [user@pc-client ~]$ chmod 600 ~/.ssh/authorized_keys |
Voilà donc pour le principe afin de comprendre les mécanismes. Il est cependant recommandé et possible d'automatiser toutes ces opérations en utilisant la commande ssh-copy-id. Se référer à l'article sur l'authentification par clé.
La procédure de connexion d'une machine à une autre est grandement simplifiée par l'utilisation des clefs de chiffrement.
Cependant les normes de sécurité devenant de plus en plus drastiques, les administrateurs réseau choisissent fréquemment de contrôler tous les flux entrant et sortant de leur réseau en bloquant les connexions directes d'un poste client du réseau local vers un serveur externe (et vice-versa). Il faut alors passer par un poste proxy qui filtre les connexions entrantes (et sortantes) :
Utilisation d'un proxy
Les connexions et plus particulièrement les transferts de données entre les machines client et serveur deviennent fastidieuses.
Dans le cas de la copie d'un fichier d'un poste client d'un réseau local vers un poste serveur distant, il faudrait effectuer dans l'ordre les opérations :
•.Copie des fichiers sur le proxy ;
•.Connexion sur le proxy ;
•.Copie des fichiers sur le serveur distant depuis le proxy ;
Et peut être, pour travailler et modifier ce fichier sur le serveur distant :
•.Connexion sur le serveur distant depuis le proxy.
La première étape nécessaire pour mettre en place le « rebond » SSH est de générer des clefs de chiffrement sur chacune des machines concernées (le client, le proxy et le serveur).
Bien sûr l'opération reste possible avec des mots de passe mais demeure dans ce cas toujours un peu laborieuse.
Il faut ensuite créer un fichier ~/.ssh/authorized_keys sur chacune des machines concernées (le client, le proxy et le serveur) et copier dans chaque fichier ~/.ssh/authorized_keys le contenu des parties publiques des clefs de chiffrement des deux autres machines.
Cela permet d'activer la connexion par clef dans les deux sens : client -> proxy -> serveur (sens 1) et serveur -> proxy -> client (sens 2).
Connexion dans le sens client -> proxy -> serveur |
Une fois cette étape accomplie, il faut créer un fichier portant le nom de config dans le dossier ~/.ssh/ de la machine client.
Dans ce fichier doivent figurer les instructions suivantes :
Host=pc-proxy
Hostname=proxy.nom_de_domaine_de_pc-proxy
User=user_sur_proxy
Host=pc-serveur
User=login
ProxyCommand=ssh pc-proxy nc pc-serveur.nom_de_domaine_de_pc-serveur 22
Les 3 premières lignes indiquent les instructions relatives à la connexion sur la machine pc-proxy, et les 3 dernières indiquent les instructions à lancer lors de la connexion sur la machine pc-proxy pour se connecter sur la machine pc-serveur depuis la machine pc-client.
La commande nc (pour netcat) est un utilitaire permettant d'ouvrir des connexions réseau. A l'aide de ProxyCommand, c'est à dire une commande qui va être exécutée sur le proxy pc-proxy, on demande d'ouvrir une connexion réseau vers le serveur distant.
La commande netcat |
Attention ! |
Attention ! [user@pc-client ~]$ chmod 600 ~/.ssh/config |
Après la création du fichier ~/.ssh/config, une simple commande permet de se connecter directement depuis le poste client vers le serveur distant :
[user@pc-client ~]$ ssh pc-serveur
[login@pc-serveur ~]$
La connexion par le proxy passe inaperçue.
Le grand avantage de cette configuration et de l'utilisation de ProxyCommand n'est pas uniquement de permettre une connexion plus simple, mais également de rediriger convenablement toute opération SSH depuis le client vers le serveur et en particulier le transfert de fichiers.
Ainsi pour copier un fichier file du poste client vers le serveur distant, il suffit de saisir la commande :
[user@pc-client ~]$ scp file pc-serveur:
Connexion dans le sens serveur -> proxy -> client Host=pc-proxy Hostname=proxy.nom_de_domaine_de_pc-proxy User=user_sur_proxy
Host=pc-client User=user ProxyCommand=ssh pc-proxy nc pc-client.nom_de_domaine_de_pc-client 22 |
Attention ! [login@pc-serveur ~]$ chmod 600 ~/.ssh/config |
A titre d'exemple voici le contenu du fichier ~/.ssh/config utilisé depuis un poste client pc-client du réseau local reseau-local.fr pour se connecter sur les machines distantes serveur1.fr et serveur2.com :
Host=proxy
Hostname=proxy.reseau-local.fr
User=user-proxy
Host=serveur1
User=user-1
ProxyCommand=ssh proxy nc serveur1.fr 22
Host=serveur2
User=user-2
ProxyCommand=ssh proxy nc serveur2.com 22
user-proxy est le nom d'utilisateur sur le proxy du réseau local proxy.reseau-local.fr, user-1 est le nom d'utilisateur sur le serveur distant serveur1.fr et user-2 est le nom d'utilisateur sur le serveur distant serveur2.com.
Pour se connecter sur les serveurs distants serveur1.fr et serveur2.com, il faut utiliser les commandes :
[user@pc-client ~]$ ssh serveur1
et
[user@pc-client ~]$ ssh serveur2
Pour copier un fichier file depuis le poste pc-client du réseau local vers une de ces deux machines, serveur1.fr et serveur2.com, il faut utiliser respectivement les commandes :
[user@pc-client ~]$ scp file serveur1:
et
[user@pc-client ~]$ scp file serveur2:
Le temps gagné en configurant convenablement vos connexions SSH peut être considérable.
•.Implémentation du protocole SSH dans Fedora OpenSSH ;
•.Les protocoles de chiffrement RSA et DSA utilisables dans le protocole SSH ;
•.Choisir la bonne taille de sa clef de chiffrement ici ;
•.Détails sur la commande netcat sur Wikipédia ici.