Client SSH
Le fichier ~/.ssh/config dans Debian (et plus généralement sous Linux/Unix) est un fichier de configuration pour le client SSH. Il permet de définir des paramètres personnalisés pour vos connexions SSH, afin d’éviter de retaper des options à chaque commande.
À quoi sert-il ?
- Simplifier les connexions SSH en définissant des alias.
- Spécifier des options par hôte (serveur) : utilisateur, port, clé privée, etc.
- Gérer plusieurs clés SSH ou serveurs sans conflit.
- Activer des fonctionnalités comme le tunnel, le proxy, ou le forwarding.
Exemple typique de contenu :
Host serveur1
HostName 192.168.1.10
User john
Port 2222
IdentityFile ~/.ssh/id_rsa
Host github
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519
Avec ce fichier : - Pour se connecter à serveur1, il suffit de taper : bash ssh serveur1 (au lieu de ssh john@192.168.1.10 -p 2222 -i ~/.ssh/id_rsa)
- Pour GitHub, Git utilisera automatiquement la bonne clé.
Voici ce que tu cherches :
✅ Options les plus utiles dans ~/.ssh/config
Chaque option peut être définie globalement ou par bloc Host.
| Option | Description |
|---|---|
Host
|
Alias pour le serveur (ex. serveur1).
|
HostName
|
Nom DNS ou IP du serveur. |
User
|
Nom d’utilisateur pour la connexion SSH. |
Port
|
Port SSH (par défaut : 22). |
IdentityFile
|
Chemin vers la clé privée à utiliser. |
ProxyJump
|
Permet de passer par un serveur intermédiaire (jump host). |
ForwardAgent
|
Active le transfert d’agent SSH (yes/no).
|
ServerAliveInterval
|
Intervalle (en secondes) pour envoyer un keep-alive et éviter la déconnexion. |
ServerAliveCountMax
|
Nombre de keep-alive avant coupure. |
StrictHostKeyChecking
|
yes = refuse les hôtes inconnus, no = accepte sans confirmation (⚠️ peu sécurisé).
|
UserKnownHostsFile
|
Fichier où sont stockées les empreintes des hôtes (par défaut ~/.ssh/known_hosts).
|
LogLevel
|
Niveau de verbosité (QUIET, INFO, VERBOSE, DEBUG).
|
Exemple complet
Host serveur1
HostName 192.168.1.10
User john
Port 2222
IdentityFile ~/.ssh/id_rsa
ServerAliveInterval 60
ServerAliveCountMax 3
Host github
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519
StrictHostKeyChecking yes
✅ Guide pour sécuriser et tester ~/.ssh/config
1. Droits d’accès
Le fichier doit être lisible uniquement par l’utilisateur :
chmod 600 ~/.ssh/config
Le dossier
~/.sshdoit avoir :chmod 700 ~/.ssh
2. Vérifier la syntaxe
SSH ne propose pas de commande dédiée, mais tu peux tester avec :
ssh -G alias
Cela affiche la configuration complète appliquée pour
alias.
3. Tester la connexion
Simplement :
ssh -v alias
(
-v= verbose, pour déboguer)
4. Bonnes pratiques
Ne jamais mettre
StrictHostKeyChecking noen production.Utiliser des clés fortes (ed25519 ou RSA ≥ 4096 bits).
Éviter les mots de passe → préférer les clés SSH.
Limiter les permissions sur les clés privées :
chmod 600 ~/.ssh/id_*
Voici un modèle ~/.ssh/config durci (sécurité renforcée) avec commentaires ligne par ligne, puis un guide pas à pas pour sécuriser et tester.
Tout est compatible Debian/OpenSSH récents (Bookworm et +).
🔐 Modèle ~/.ssh/config – sécurité renforcée + commentaires
Place ce fichier dans
~/.ssh/configet assure-toi des permissions indiquées plus bas.
# =========================
# Fichier : ~/.ssh/config
# Objectif : Sécurité renforcée + lisibilité
# =========================
# ---- Valeurs par défaut applicables à tous les hôtes ----
Host *
# N'utiliser que l'authentification par clé (pas de mot de passe)
PubkeyAuthentication yes
PreferredAuthentications publickey
PasswordAuthentication no
KbdInteractiveAuthentication no
GSSAPIAuthentication no # sauf si tu utilises Kerberos/AD
# N'offrir que les clés explicitement listées (évite l'énumération de clés)
IdentitiesOnly yes
# Ne JAMAIS transférer l'agent par défaut (réduit le risque de vol d'identité)
ForwardAgent no
ForwardX11 no
# Integrity & protection contre les attaques de type MITM
StrictHostKeyChecking yes # refuser les hôtes inconnus
HashKnownHosts yes # hash les noms dans known_hosts
UserKnownHostsFile ~/.ssh/known_hosts
UpdateHostKeys ask # facilite la rotation des clés hôte, mais te demande
# Si ton DNS est signé DNSSEC + SSHFP publié, tu peux activer :
# VerifyHostKeyDNS yes
# Robustesse (évite les déconnexions silencieuses)
ServerAliveInterval 60
ServerAliveCountMax 3
TCPKeepAlive yes
# Multiplexage (plus rapide, avec prudence)
ControlMaster auto
ControlPersist 10m
ControlPath ~/.ssh/ctl/%C # nécessite le dossier ~/.ssh/ctl (700)
# Limiter la durée/taille avant re-clé (bon hygiène crypto)
RekeyLimit 1G 1h
# Journalisation standard (utilise -vvv pour debug ponctuel)
LogLevel INFO
# N'ajoute pas automatiquement des clés à l'agent (évite les surprises)
AddKeysToAgent ask
# Nettoyer tout port forwarding hérité d'une session multiplexée
ClearAllForwardings yes
# ---- Exemple : bastion / jump host ----
Host bastion
HostName bastion.exemple.org
User john
Port 22
IdentityFile ~/.ssh/id_ed25519_bastion
# Bastion : on peut être plus strict (aucun port forwarding)
ForwardAgent no
LocalForward
RemoteForward
# ---- Exemple : serveurs internes accessibles via le bastion ----
Host intra-*.exemple.org
User admin
Port 22
IdentityFile ~/.ssh/id_ed25519_intra
ProxyJump bastion
# Optionnel : séparer les empreintes des hôtes internes
UserKnownHostsFile ~/.ssh/known_hosts_intra
# ---- Exemple : GitHub ----
Host github
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github
IdentitiesOnly yes
# Astuce : pré-semer l’empreinte GitHub dans known_hosts (voir guide)
# et tester avec : ssh -T git@github.com
# ---- Exemple : serveur spécifique avec port non standard ----
Host prod-db
HostName 203.0.113.42
User postgres
Port 2222
IdentityFile ~/.ssh/id_ed25519_prod
💡 Pourquoi on ne force pas les suites cryptographiques (
Ciphers,MACs,KexAlgorithms) ?
Les versions modernes d’OpenSSH choisissent automatiquement des algorithmes sûrs et à jour. Figer ces listes peut casser des connexions ou te priver d’améliorations de sécurité à l’avenir. Ne les borne que si tu as une politique formelle ou un audit qui l’exige.
🛡️ Guide pas-à-pas : sécuriser & tester
0) Préparer l’environnement et les droits
mkdir -p ~/.ssh/ctl
chmod 700 ~/.ssh ~/.ssh/ctl
touch ~/.ssh/config ~/.ssh/known_hosts
chmod 600 ~/.ssh/config ~/.ssh/known_hosts
1) Générer des clés modernes et protégées par passphrase
# Clé générale
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519 -C "john@$(hostname -f)"
# Clés dédiées (meilleure hygiène : une clé par usage)
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519_bastion -C "bastion"
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519_intra -C "intra"
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519_github -C "github"
chmod 600 ~/.ssh/id_ed25519*
-a 100renforce la dérivation de la passphrase (plus résistant au brute-force).
2) Pinner les hôtes (pré-semer known_hosts) avant la 1re connexion
Obtiens les empreintes publiques par un canal de confiance (fiche d’exploitation, document interne, site officiel du fournisseur, ou administrateur).
Ajoute-les sans te connecter :
# Exemple pour un hôte avec clé ed25519 ssh-keyscan -t ed25519 bastion.exemple.org | tee -a ~/.ssh/known_hosts ssh-keyscan -t ed25519 github.com | tee -a ~/.ssh/known_hosts
Vérifie les empreintes localement :
ssh-keygen -lf ~/.ssh/known_hosts | grep -E 'bastion\.exemple\.org|github\.com'
Compare avec la source officielle avant d’autoriser la connexion.
Si tu ne peux pas pré-semer, laisse
StrictHostKeyChecking yeset saisis-toi de la première empreinte uniquement après vérification hors bande.
3) Charger une clé dans l’agent à la demande
# Démarrer l'agent si besoin
eval "$(ssh-agent -s)"
# Ajouter la clé avec demande de passphrase
ssh-add ~/.ssh/id_ed25519_bastion
# Avec confirmation à chaque utilisation (plus sûr) :
ssh-add -c ~/.ssh/id_ed25519_bastion
Comme
ForwardAgent no, l’agent n’est pas exposé au serveur distant.
4) Tester la configuration et diagnostiquer
# Voir la config effective (utile pour déboguer)
ssh -G bastion | less
# Connexion verbeuse
ssh -vvv bastion
# Test GitHub sans exécuter de commande (échange SSH uniquement)
ssh -T git@github.com
5) Bonnes pratiques complémentaires
- Une clé privée par contexte sensible (prod ≠ dev ≠ perso).
- Rotation : change périodiquement les clés (
ssh-keygen -ppour changer la passphrase). - Sauvegarde chiffrée des clés privées (jamais en clair).
- Isolation des empreintes : utilise un
UserKnownHostsFileséparé pour les environnements (ex:known_hosts_intra,known_hosts_prod). - Multiplexage : purge le dossier
~/.ssh/ctl/si tu soupçonnes une session bloquée. - Éviter
StrictHostKeyChecking no: préfèreyes. Si tu dois assouplir ponctuellement :ssh -o StrictHostKeyChecking=accept-new hostune seule fois après vérification.
🧪 Check-list rapide
- ☐
~/.sshen 700, fichiers en 600
- ☐ Clés ed25519 avec passphrase
- ☐
StrictHostKeyChecking yes, empreintes pré-semées et vérifiées
- ☐
IdentitiesOnly yes,ForwardAgent no
- ☐
ProxyJumppour segmenter l’accès (bastion)
- ☐ Test avec
ssh -G,ssh -vvvetssh -T git@github.com