SSH
SSH Secure SHell
Principes
Le but de SSH est d'accéder à un shell sur une machine distance via une connexion sécurisée (chiffrée) et authentifiée.
La sécurisation des données
La sécurisation nécessite un algorithme de chiffrement (il y en a des myriades) et une clé pour la session. Les principes sont similaires à ce que vous utilisez sur des sites Internet sécurisés (https://
). Les machines se mettent d'accord sur:
- un algorithme de chiffrement à utiliser
- puis, via un autre algorithme, sur une clé de chiffrement sans que cette clé ne soit envoyée sur le réseau.
La même clé est utilisée pour chiffrer et déchiffrer un message, on parle donc de chiffrement symétrique.
L'authentification
SSH peut authentifier un utilisateur avec un login/mot de passe. Cependant pour de nombreux cas d'usage, il est fastidieux de saisir ces informations à chaque connexion. SSH peut donc remplacer l'authentification classique par une authentification par clés.
Attention
Ce sont des clés d'authentification, pas des clés de chiffrement.
Authentification par clés
L'authentification par clés est utilisée par SSH mais aussi par de nombreux services web, en particulier GitLab et GitHub.
Attention
Il est très important de bien comprendre ce qui suit, car vous en aurez besoin assez souvent dans les années à venir.
Le principe de l'authentification par clé est de travailler avec une paire de clés dites privée et publique.
Si on appelle K
la fonction de chiffrement de la clé privée et P
la fonction de chiffrement de la clé publique, le chiffrement par clé pour un message M
garanti (résumé rapide):
- K(P(M)) = M
- ceci rend possible le déchiffrement par tout possesseur de la clé publique du message chiffré par la clé privée
- P(K(M)) = M
- ceci rend possible le déchiffrement du message chiffré par la clé publique uniquement par le possesseur de la clé privée
- Il n'existe aucune autre fonction F calculable telle que F(K(M)) = M, K(F(M)) = M, F(P(M)) = M ou P(F(M)) = M
- ceci empêche un observateur ayant intercepté la clé publique de fabriquer un message chiffré valide pour la destination, et donc d'usurper l'identité de chiffrement de la source
On parle de chiffrement asymétrique
Info
Dans la pratique SSH, l'authentification est faite en échangeant des messages chiffrés avec ces clés dans les deux sens. Une fois l'authentification validée, la sécurisation (chiffrement) de la connexion utilise une autre clé (voir ci-dessus) pour des raisons d'efficacité, le chiffrement asymétrique étant plus coûteux en ressources que le chiffrement symétrique.
Par conséquent:
- La clé privée:
- ne doit jamais être communiquée
- doit rester en lecture seule pour l'utilisateur seulement et aucune permission pour groupe ou reste du monde (protection locale de la clé)
- La clé publique:
- peut être communiquée au monde entier
- doit être installée sur les machines où vous vous connectez depuis votre machine
Configuration
Résumé
Pour configurer une communication SSH, il va falloir :
- Créer une paire de clés, clé privée et clé publique
- Déposer la clé privée dans votre répertoire
~/.ssh
avec les bonnes permissions - Ajouter la clé publique dans le fichier
~/.ssh/authorized_keys
sur toutes les machines où vous voulez vous connecter- alternativement, téléverser la clé publique via l'interface GitHub/GitLab/autre pour les services en ligne utilisant des clés
- Sur votre machine, faire
ssh
suivi de l’adresse de la machine cible
Test SSH sans clés
Pour se connecter à une machine, par exemple tp-1a201-01
,
Le shell vous demandera de saisir le mot de passe de votre compte unix. Tant que vous n'aurez pas installé de clés (ce que nous allons voir ensuite), votre mot de passe sera demandé à chaque connexion.
À chaque connexion à une machine, votre ssh vérifie qu'il parle à la bonne machine et, pour cela, il vérifie que l'empreinte (fingerprint en anglais) de la machine correspond à l'empreinte qu'il connaît À chaque fois que vous vous connectez à une machine nouvelle, ssh affichera un message pour vous dire qu'il ne connaît pas encore cette machine et vous demandera de vérifier que c'est bien la bonne machine à laquelle vous vous connectez. Pour s'assurer de parler à la bonne machine, il faut vérifier que l'empreinte est la bonne lors de la première connexion. Si vous êtes sur le réseau de Télécom et que vous vous connectez à une machine de Télécom, vous pouvez accepter sans vérifier.
Quittez la connexion en tapant exit
ou logout
.
Info
Le nom des machines des salles de TP à l'école est de la forme tp-NOM_DE_LA_SALLE-xx
.
La liste des machines ainsi que leur disponibilité est consultable sur ce site.
Création des clés
Pour créer une pairs de clés publique/privée il faut utiliser la commande suivante :
Danger
Ne pas utiliser putty qui génère des fichiers dans un autre format.
Dans cette commande :
- le paramètre
-t ed25519
permet de spécifier l'algorithme utilisé pour générer la paire de clés. Ici, on choisit l'option ED25519 (pas DSA, pas RSA, pas ECDSA). La clé obtenue est courte mais très solide. - le paramètre
-a 100
permet de spécifier le niveau de protection du mot de passe qui protège la clé. - le paramètre
-C "login@telecom-paris.fr"
permet de nommer votre clé.
Cette commande va aussi vous demander deux renseignements :
- tout d'abord elle va vous demander où stocker la clé avec une question de la forme
Enter file in which to save the key (/home/login/.ssh/id_ed25519):
si vous tapez entrée (sans rien renseigner) la clé sera stockée dans le répertoire par défaut (ici/home/login/.ssh/id_ed25519
). Il est conseillé de laisser ce paramètre par défaut car tous les utilitaires (ssh
,git
,scp
) vont essayer de chercher dans ce répertoire par défaut. - ensuite on va vous demander un mot de passe qu'il faudra répéter. Il est possible de laisser le mot de passe vide mais il est très fortement conseillé de mettre un mot de passe. En effet, si votre machine est volée ou piratée ou que la clé privée est diffusée par erreur, une clé sans mot de passe permettra à quiconque l'ayant récupérée de se faire passer pour vous pour tous les services configurés avec cette clé.
La commande va générer deux fichiers, par défaut aux chemins suivants :
- la clé privée:
~/.ssh/id_ed25519
- la clé publique:
~/.ssh/id_ed25519.pub
La clé privée est, comme son nom l'indique, privée et ne doit être lisible que par son propriétaire. Si vous avez modifié les permissions, vous pouvez la remettre en mode lecture seule:
Note
La commande que nous avons donnée, ajoute des options pour préciser entre autres l'algorithme et le commentaire.
Ces paramètres sont optionnels et nous pouvons utiliser la commande ssh-keygen
sans aucune option et ça fonctionnera.
L'algorithme utilisé par défaut dépendra de la version de OpenSSH et le commentaire par défaut sera votrelogin@votremachine
La clé générée sera ~/.ssh/id_NOM_DE_L_ALGORITHME
.
Ajout de la clé publique
Vous devez mettre le contenu de la clé publique à la fin du fichier ~/.ssh/authorized_keys
de la machine distante.
Le plus simple est de vous connecter à la machine en question et d'éditer le fichier et copier/coller le contenu de la clé publique:
Vous pouvez aussi copier la clé via l'utilitaire scp
qui est une version sécurisée de cp
via SSH:
scp ~/.ssh/id_ed25519.pub login@tp-1a201-01:~/
ssh login@tp-1a201-01
cat ./id_ed25519.pub >> ~/.ssh/authorized_keys
rm ./id_ed25519.pub
exit
Faites attention à copier/coller correctement le contenu de votre clé publique complète, sans éléments supplémentaires.
Si le fichier ~/.ssh/authorized_keys
n’est plus de la bonne forme, l'authentification par clé ne fonctionnera plus sur cette machine.
Pour éviter ce genre de problèmes, utilisez la commande ssh-copy-id
(disponible avec les versions récentes de ssh
) qui s'occupera de modifier correctement le fichier authorized_keys
.
Par exemple:
Test de la connexion
Pour se connecter à une machine, par exemple tp-1a201-01
,
Le shell vous demandera de saisir le mot de passe de la clé privée et non plus celui de votre compte école.
SSH Agent
ssh-agent
est un programme qui gère l'authentification des clés pour vous, ne vous demandant le mot de passe qu'une seule fois pour une session donnée.
Selon les systèmes d'exploitation, ssh-agent
démarre tout seul. Il peut être démarré manuellement comme suit:
Pour éviter de taper le mot de passe de vos clés à chaque fois, ajoutez au fichier ~/.ssh/config
:
Une alternative est d'ajouter manuellement les clés:
Pour quitter une session SSH, tapez exit
ou logout
.
Utilisations de SSH
Copier des fichiers
SSH vient avec l'utilitaire scp
qui vous permet de copier des fichiers vers une machine distance via SSH. C'est très utile pour des transferts
de petits fichiers et répertoires.
L'utilitaire est très similaire à cp
, il faut juste ajouter login@machine:
avant le nom du fichier ou répertoire cible.
Copie d'un fichier:
Copie d'un répertoire:
Attention à ne pas oublier :
dans le nom de machine:
cp
et copiera juste le répertoire..
La commande marche évidemment dans les deux sens:
Note
Pour les plus avancés, vous pouvez utiliser l'utilitaire rsync
qui sait transférer des fichiers en utilisant une connexion SSH.
Il a pour avantage de ne pas transférer les fichiers qui existent à l'identique sur la machine distante.
Il sait aussi reprendre un transfert interrompu en ne transférant que les parties manquantes.
Pour démarrer avec rsync
.
Démarrer un programme
Vous pouvez démarrer automatiquement un programme ou un script suite à la connexion SSH. Par défaut le répertoire à la connexion SSH est votre répertoire utilisateur sur la machine distante.
Lancer who
pour voir qui est connecté à la machine:
Lancer un script
Vous pouvez lancer plusieurs commandes comme vu dans le chapitre terminal
Dans tous ces cas, la connexion SSH prendra fin une fois les commandes passées en paramètres exécutées.
Clés multiples
Il est possible d'avoir plus d'une paire de clé, par exemples des clés pour l'école, des clés un service externe tel que GitHub, etc...
Lors de la génération de clés, ajoutez l'option -f FICHIER
pour indiquer le nom du fichier de clé à créer:
~/.ssh/id_new_key
et ~/.ssh/id_new_key.pub
.
Suivez les étapes que précédemment pour la copie de la clé publique sur les machines cibles.
Puis, lors de la connexion, passez -i cle
à ssh:
Comme il est fastidieux de se souvenir quelle clé correspond à quel service, vous pouvez configurer cette association dans le fichier ~/.ssh/config
.
Voici un exemple d'un tel fichier
Host *
AddKeysToAgent yes
IdentitiesOnly yes
Host gitlab.enst.fr
PreferredAuthentications publickey
User git
IdentityFile ~/.ssh/id_new_key
Ce fichier indique:
- d'ajouter les clés à l'agent SSH pour toutes les destinations possibles (
Host *
) - utiliser la clé privée
id_new_key
pour GitLab (Host gitlab.enst.fr
)- en s'identifiant comme l'utilisateur
git
- en s'identifiant comme l'utilisateur
Transfert d'agent SSH
Lorsque vous vous connectez à une machine par SSH, votre répertoire personnel sur cette machine n'est vraisemblablement pas le même que le répertoire personnel sur votre machine, et vos informations de clés sont donc différentes. Si vous voulez pouvoir accéder depuis cette machine distante à un service nécessitant l'authentification par clé (autre machine via SSH, GitLab), vous n'aurez plus vos clés !
Attention
Une possibilité est de copier votre clé privée: à éviter impérativement. Moins vous avez de copies de vos clés privées, meilleure est la sécurité.
Par ailleurs, si vous partagez ce répertoire personnel avec d'autres utilisateurs, vous n'avez pas spécialement envie de communiquer votre clé privée à vos camarades !! Votre réflexe dans ce cas sera de créer une clé privée pour cet utilisateur commun pour accéder à GitLab par exemple.
Ceci est une mauvaise pratique en développement de code, car vous créez ainsi un utilisateur virtuel non identifiable et surtout utilisé par plusieurs personnes. Si une modification de code introduit un bug, vous ne pourrez plus identifier qui est à l'origine du changement et en discuter avec lui.
Fort heureusement, SSH vous permet de "transférer votre identifiants/clés" à travers une connexion sécurisée, de manière à pouvoir utiliser votre configuration SSH locale pour des authentifications par clés à partir de votre session distante.
Toutes les demandes d'authentification faite dans la session SSH distantes seront validées par le programme ssh-agent
s'exécutant sur la machine locale, sans que les clés quittent votre machine.
Pour cela, ajoutez l'option -A
lors de votre connexion initiale:
Il est possible d'activer automatiquement le transfert d'agent en ajoutant dans le fichier ~/.ssh/config
:
ForwardAgent yes
indique qu'une connexion SSH depuis la machine identifiée par Host
pourra utiliser les clés de l'agent de la machine locale.
Vous pouvez l'activer sur toutes les machines via Host *
mais ce n'est pas recommandé, en particulier si vous ne connaissez pas le niveau de sécurité de la machine distante.
Attention
Le transfert d'agent SSH pour toutes les machines distantes n'est pas la solution la plus sécurisée.
Il est recommandé d'utiliser des clés séparées, de n'exposer qu'un sous-ensemble de clés lors du transfert d'agent et de mettre des restrictions sur l'utilisation des clés via ssh-add -h
.
Perte de clés
Si par accident/vol/erreur/etc vous perdez votre clé privée, enlevez immédiatement les clés publiques correspondantes de toutes les machines et services web l'utilisant.
Lorsque vous allez vouloir vous connecter en SSH à une machine, vos clés ne seront plus correctes et la connexion sera rejetée. SSH essayera une autre méthode d'authentification et vous demandera votre login et mot de passe.
Vous pouvez forcer SSH à ne pas utiliser l'authentification par clé en tapant:
Tunnel SSH
Le VPN connecté fait virtuellement migrer votre machine dans l’école, ce qui peut vous empêcher de vous servir de certains services normalement accessibles depuis chez vous, mais interdits par l’école.
En outre, par choix de sécurité, le VPN de l'école ne vous laissera pas forcément voir toutes les machines de l'école.
Si ce cas vous arrive, vous devez utiliser la passerelle ssh.enst.fr
qui permet de voir toutes les machines.
Plutôt que de faire :
Vous pouvez directement aller à la machine cible en indiquant de passer par ssh.enst.fr
comme intermédiaire (on parlera de tunnel SSH).
Note
Le login n'est pas obligatoirement le même pour les deux machines, par exemple si la machine cible est une machine non administrée par la DSI.
Pour les plus avancés, si vous avez besoin d'un tunnel pour plusieurs connexions, vous pouvez utiliser l'outil sshuttle.