Le client ssh est la porte d'entrée de tout serveur Linux, et le fichier ~/.ssh/config transforme des commandes longues et répétitives en simples alias. La connexion basique ssh utilisateur@serveur suffit pour débuter, mais dès que vous gérez plusieurs serveurs, plusieurs clés ou un bastion, la configuration du client devient indispensable. Ce guide couvre tout : de la première connexion aux techniques du quotidien (ProxyJump, ControlMaster, diagnostic), avec des sorties réelles capturées sur un lab de deux machines. Public visé : administrateurs et DevOps à l'aise avec le terminal.
Ce guide couvre un objectif direct LFCS (domaine Networking, « Configure the OpenSSH server and client ») et RHCSA (domaine Manage Security, « Configure key-based authentication for SSH »).
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Établir une connexion SSH de base avec utilisateur, port et clé.
- Créer un fichier
~/.ssh/configavec des alias de connexion. - Rebondir sur un serveur interne via un bastion avec
ProxyJump. - Accélérer les reconnexions avec
ControlMaster. - Diagnostiquer une connexion qui échoue avec
-v. - Gérer les empreintes avec
known_hostset éviter les faux positifs MitM.
Prérequis
Section intitulée « Prérequis »Ce guide suppose que vous disposez déjà d'une clé SSH. Si ce n'est pas le cas, commencez par créer et gérer des clés SSH : l'authentification par clé est la base de tout ce qui suit, et elle remplace avantageusement le mot de passe.
Dans quel contexte utiliser quoi
Section intitulée « Dans quel contexte utiliser quoi »Chaque technique de ce guide répond à un besoin précis. Ce tableau vous oriente vers la bonne section selon votre situation.
| Situation | Technique |
|---|---|
| Se connecter à dix serveurs aux ports et clés différents | ~/.ssh/config avec alias |
| Atteindre un serveur interne via un bastion public | ProxyJump |
| Lancer des scripts Ansible ou rsync sans saisir de mot de passe | clé SSH + ssh-agent |
| Enchaîner des connexions répétées lors d'un déploiement | ControlMaster (multiplexage) |
| Connexion refusée après reconstruction d'une VM | nettoyer known_hosts |
| Déboguer un refus d'authentification | ssh -vvv utilisateur@serveur |
Connexion de base
Section intitulée « Connexion de base »La forme minimale
Section intitulée « La forme minimale »La commande la plus simple précise l'utilisateur et l'hôte :
ssh bob@192.168.10.77SSH se connecte sur le port 22 avec l'utilisateur bob. S'il trouve une clé correspondante, il l'utilise ; sinon il demande le mot de passe. Une fois connecté, vérifiez que vous êtes bien où vous croyez :
hostname # le nom de la machine distantewhoami # l'utilisateur effectifLes options courantes à la volée
Section intitulée « Les options courantes à la volée »Trois options couvrent l'essentiel des cas particuliers, sans fichier de configuration :
# Port non standardssh -p 2222 bob@192.168.10.77
# Clé privée spécifiquessh -i ~/.ssh/id_ed25519_backup bob@backup.exemple.fr
# Mode verbeux, pour comprendre ce qui se passessh -v bob@192.168.10.77Accepter l'empreinte au premier contact
Section intitulée « Accepter l'empreinte au premier contact »Au premier contact, SSH affiche l'empreinte du serveur et vous demande de la valider :
The authenticity of host '192.168.10.77' can't be established.ED25519 key fingerprint is SHA256:NqZlPkE/wI00lVSvf+jI6/ENp5tIeqiwM4P5nhuuBtE.Are you sure you want to continue connecting (yes/no/[fingerprint])?Répondez yes pour mémoriser l'empreinte dans ~/.ssh/known_hosts. À partir de là, SSH refusera la connexion si l'empreinte change : c'est intentionnel, c'est la protection contre les attaques de type man-in-the-middle (voir plus bas).
Configurer ~/.ssh/config
Section intitulée « Configurer ~/.ssh/config »Le fichier ~/.ssh/config définit des alias de connexion avec tous leurs paramètres. C'est la façon propre de gérer plusieurs serveurs, et le premier réflexe professionnel à acquérir.
La structure de base
Section intitulée « La structure de base »Chaque bloc Host déclare un alias et ses options :
Host webserver HostName 192.168.10.20 User deploy Port 2222 IdentityFile ~/.ssh/id_ed25519_deploy
Host db HostName 10.0.1.5 User dbadmin IdentityFile ~/.ssh/id_ed25519_dbAvec cette configuration, un simple ssh webserver équivaut à ssh -p 2222 -i ~/.ssh/id_ed25519_deploy deploy@192.168.10.20. Le gain est immédiat : sur le lab qui sert ce guide, l'alias bastion répond directement.
ssh bastion 'echo "connecte sur $(hostname), utilisateur $(whoami)"'connecte sur lab-bastion, utilisateur labuserLa configuration globale avec Host *
Section intitulée « La configuration globale avec Host * »Le bloc Host * applique des options à tous les hôtes, sauf surcharge par un bloc plus spécifique :
Host * ServerAliveInterval 60 ServerAliveCountMax 3 Compression yesServerAliveInterval 60 envoie un signal de vie toutes les 60 secondes et évite les déconnexions sur les sessions inactives. C'est le réglage qui vous épargne les « Broken pipe » agaçants sur une session laissée ouverte.
Les principales directives
Section intitulée « Les principales directives »Ces directives couvrent la quasi-totalité des besoins d'administration :
| Directive | Rôle |
|---|---|
Host | Alias de connexion |
HostName | Adresse réelle ou nom complet (FQDN) |
User | Utilisateur distant |
Port | Port SSH (défaut : 22) |
IdentityFile | Chemin de la clé privée |
ServerAliveInterval | Signal de vie (secondes) |
ProxyJump | Rebond via un bastion |
ControlMaster | Multiplexage de connexion |
StrictHostKeyChecking | Politique de vérification d'empreinte |
ProxyJump, rebondir via un bastion
Section intitulée « ProxyJump, rebondir via un bastion »Dans une architecture saine, les serveurs internes ne sont pas accessibles directement depuis Internet. On passe par un bastion (aussi appelé jump host), seul point d'entrée exposé et durci.
[poste de travail] --> [bastion:22] --> [serveur interne:22]La configuration dans ~/.ssh/config
Section intitulée « La configuration dans ~/.ssh/config »La directive ProxyJump automatise le rebond : vous déclarez le bastion, puis vous le référencez dans le bloc du serveur interne.
Host bastion HostName 192.168.10.77 User labuser IdentityFile ~/.ssh/id_ed25519
Host interne HostName 192.168.10.210 User labuser IdentityFile ~/.ssh/id_ed25519 ProxyJump bastionUn simple ssh interne établit alors la connexion au bastion, puis rebondit automatiquement vers le serveur interne :
ssh interne 'echo "connecte sur $(hostname), utilisateur $(whoami)"'connecte sur lab-interne, utilisateur labuserLa force de ProxyJump tient dans un détail de sécurité : votre clé privée ne quitte jamais votre poste. Le mode verbeux le prouve, avec sa ligne (via proxy) :
ssh -v interne truedebug1: Connecting to 192.168.10.77 [192.168.10.77] port 22.Authenticated to 192.168.10.77 ([192.168.10.77]:22) using "publickey".Authenticated to 192.168.10.210 (via proxy) using "publickey".Vous vous authentifiez d'abord sur le bastion, puis sur le serveur interne à travers lui, chaque fois avec votre clé. Le bastion ne fait que relayer le trafic chiffré ; il ne voit jamais votre clé.
En une ligne, sans fichier de configuration
Section intitulée « En une ligne, sans fichier de configuration »Pour un rebond ponctuel, l'option -J fait la même chose sans rien configurer :
ssh -J labuser@192.168.10.77 labuser@192.168.10.210Et pour une chaîne de plusieurs sauts, on enchaîne les bastions séparés par des virgules : ProxyJump bastion1,bastion2.
ControlMaster, multiplexer les connexions
Section intitulée « ControlMaster, multiplexer les connexions »Lors d'un déploiement ou d'une série de commandes, SSH établit une nouvelle connexion TCP et une nouvelle authentification à chaque appel. ControlMaster réutilise une connexion existante : la première ouvre un socket, les suivantes l'empruntent au lieu de tout recommencer.
Host *.exemple.fr ControlMaster auto ControlPath ~/.ssh/cm-%r@%h:%p ControlPersist 2mControlMaster auto: réutilise une connexion si possible, en crée une sinon.ControlPath: chemin du socket Unix (variables%rutilisateur,%hhôte,%pport).ControlPersist 2m: le socket reste ouvert 2 minutes après la dernière session.
Le gain est mesurable. Sur le lab, une connexion qui réutilise le master contre une connexion neuve :
== connexion via master réutilisé ==real 0m0,034s== connexion neuve ==real 0m0,166sSur un réseau local, l'écart paraît modeste (34 ms contre 166 ms), mais il explose dès que l'authentification est coûteuse (bastion, clé sur carte à puce, latence WAN). C'est ce qui rend rsync, scp ou ansible quasi instantanés sur un même hôte après la première connexion.
Gérer known_hosts
Section intitulée « Gérer known_hosts »Le fichier ~/.ssh/known_hosts mémorise l'empreinte de chaque serveur visité. C'est ce qui permet à SSH de détecter qu'un serveur n'est plus celui qu'il prétend être.
L'avertissement MitM après une reconstruction
Section intitulée « L'avertissement MitM après une reconstruction »Quand une VM est reconstruite ou une IP réaffectée, la clé d'hôte change. SSH le détecte et bloque la connexion avec un avertissement spectaculaire, capturé ici sur le lab :
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!Someone could be eavesdropping on you right now (man-in-the-middle attack)!...Offending ED25519 key in /home/bob/.ssh/known_hosts:1Host key verification failed.Ne désactivez pas ce contrôle par réflexe : c'est exactement la protection qui vous alerterait d'une vraie attaque. Si vous savez que la machine a légitimement changé, supprimez l'ancienne entrée. SSH vous donne même la commande exacte :
ssh-keygen -f ~/.ssh/known_hosts -R 192.168.10.77# Host 192.168.10.77 found: line 1known_hosts updated.Original contents retained as known_hosts.oldLa prochaine connexion redemandera de valider la nouvelle empreinte.
Pré-remplir known_hosts sans se connecter
Section intitulée « Pré-remplir known_hosts sans se connecter »Dans un script d'automatisation, on ne veut pas de question interactive au premier contact. La commande ssh-keyscan récupère l'empreinte à l'avance :
ssh-keyscan -H 192.168.10.77 >> ~/.ssh/known_hostsDésactiver la vérification (environnements éphémères uniquement)
Section intitulée « Désactiver la vérification (environnements éphémères uniquement) »Pour des VM jetables recréées en boucle, la vérification devient un frein. On la désactive alors par plage d'IP, jamais globalement :
Host 192.168.122.* StrictHostKeyChecking no UserKnownHostsFile /dev/nullDiagnostiquer une connexion
Section intitulée « Diagnostiquer une connexion »Les niveaux de verbosité
Section intitulée « Les niveaux de verbosité »Quand une connexion échoue, la première commande à lancer est ssh -v. Trois niveaux existent, du plus utile au plus bavard :
ssh -v bob@192.168.10.77 # diagnostic de base, suffisant 9 fois sur 10ssh -vv bob@192.168.10.77 # détail du handshakessh -vvv bob@192.168.10.77 # tout, réservé aux cas extrêmesSur une connexion qui réussit par clé publique, les lignes clés ressemblent à ceci :
debug1: Reading configuration data ~/.ssh/configdebug1: Connecting to 192.168.10.77 [192.168.10.77] port 22.debug1: Authenticating to 192.168.10.77:22 as 'labuser'debug1: Offering public key: ~/.ssh/id_ed25519 ED25519 SHA256:NqZl... explicitdebug1: Server accepts key: ~/.ssh/id_ed25519 ED25519 SHA256:NqZl... explicitdebug1: Entering interactive session.Si Server accepts key n'apparaît pas, le problème est côté serveur : clé absente de authorized_keys, ou permissions incorrectes.
Les permissions côté client
Section intitulée « Les permissions côté client »Des permissions trop larges sur ~/.ssh/ font silencieusement échouer l'authentification par clé. SSH refuse d'utiliser une clé privée que d'autres pourraient lire :
chmod 700 ~/.sshchmod 600 ~/.ssh/id_ed25519chmod 644 ~/.ssh/id_ed25519.pubchmod 600 ~/.ssh/configLire les journaux côté serveur
Section intitulée « Lire les journaux côté serveur »Quand le client ne suffit pas, les journaux du serveur donnent la raison exacte du refus :
# Sur Debian/Ubuntu, le service s'appelle "ssh"sudo journalctl -u ssh -n 50
# Sur RHEL/Fedora/AlmaLinux, il s'appelle "sshd"sudo journalctl -u sshd -n 50Tableau de dépannage
Section intitulée « Tableau de dépannage »| Symptôme | Cause probable | Action |
|---|---|---|
Connection refused | Port 22 fermé ou sshd arrêté | sudo systemctl status ssh côté serveur |
Permission denied (publickey) | Mauvaise clé ou authorized_keys absent | Vérifier avec -v, corriger les permissions |
REMOTE HOST IDENTIFICATION HAS CHANGED | VM reconstruite, IP réaffectée | ssh-keygen -R <ip> |
Host key verification failed | Empreinte inconnue en mode strict | Vérifier avant d'accepter, ou ssh-keyscan |
| Timeout sans message | Pare-feu bloque le port 22 | nc -zv <hôte> 22 |
| Déconnexion après inactivité | Pas de signal de vie | Ajouter ServerAliveInterval 60 |
Sécurité et points de vigilance
Section intitulée « Sécurité et points de vigilance »Le client SSH est aussi une surface d'exposition : quelques réflexes le durcissent sans effort.
- Une clé par usage, pas une clé unique partout : une clé compromise ne doit pas ouvrir tout le parc.
ProxyJumpplutôt qu'un agent transféré : évitezForwardAgent yesvers un bastion non maîtrisé, où votre agent pourrait être détourné.- Chiffrez vos clés privées avec une phrase de passe, et déléguez sa saisie à
ssh-agent. ControlPathdans un répertoire privé : le socket de multiplexage est une porte ouverte tant qu'il vit.
Validation du guide
Section intitulée « Validation du guide »Vous maîtrisez ce guide si vous savez, sans documentation : écrire un bloc Host avec HostName, User et IdentityFile ; atteindre un serveur interne par ProxyJump ; lire une sortie ssh -v pour repérer où l'authentification échoue ; et corriger un known_hosts après reconstruction d'une machine.
Contrôle de connaissances
Section intitulée « Contrôle de connaissances »Vérifiez que l'essentiel du guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
À retenir
Section intitulée « À retenir »~/.ssh/configcentralise les paramètres de connexion : un alias remplace une commande longue et fragile.ProxyJumprebondit via un bastion sans jamais exposer votre clé : la ligne(via proxy)en-vle prouve.ControlMasterrend instantanées les connexions répétées d'ansible,rsyncouscp.ssh -vest la première commande à lancer quand une connexion échoue.- Les permissions de
~/.ssh/ne sont pas optionnelles : SSH refuse silencieusement si elles sont trop larges. - L'avertissement
REMOTE HOST IDENTIFICATION HAS CHANGEDest une protection, pas un bug : comprenez-le avant de purgerknown_hosts.
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Créer et gérer des clés SSH : la brique en amont de tout ce guide, de
ssh-keygenàssh-copy-id. - Exécuter des commandes distantes via SSH :
ssh user@host cmd, pipes distants et collecte multi-serveurs. - Tunnels SSH : -L, -R, -D et ProxyJump : redirection de port locale, distante et dynamique (proxy SOCKS).
- Durcir l'accès SSH :
sshd_config, désactivation de root, authentification par clé uniquement, fail2ban.