Skip to content
Learni
View all tutorials
Administration Système

Comment configurer SSH sécurisé de A à Z en 2026

Introduction

SSH (Secure Shell) est le protocole standard pour accéder à distance à un serveur de manière sécurisée, remplaçant les protocoles obsolètes comme Telnet. En 2026, avec la multiplication des attaques par force brute et les vulnérabilités zero-day, maîtriser SSH n'est plus optionnel : c'est essentiel pour tout développeur, admin sys ou DevOps. Ce tutoriel beginner vous guide pas à pas, de l'installation à la configuration avancée, avec des exemples concrets sous Linux (Ubuntu/Debian), macOS et Windows (via WSL ou OpenSSH). Vous apprendrez à générer des clés ED25519 (plus sécurisées que RSA), à désactiver les mots de passe, et à implémenter le tunneling pour des connexions proxy. À la fin, vous configurerez un serveur SSH impénétrable, prêt pour la prod. Temps estimé : 20 minutes. Pourquoi c'est crucial ? 80% des breaches serveur passent par des creds SSH faibles (source : Verizon DBIR 2025). Bookmarkez ce guide : il est votre référence actionnable.

Prérequis

  • Un ordinateur client : Linux (Ubuntu 24.04+), macOS Ventura+, ou Windows 11 avec WSL2.
  • Un serveur distant : VPS Ubuntu 24.04 (ex: DigitalOcean droplet à 6$/mois) avec accès root/mot de passe initial.
  • Terminal : GNOME Terminal, iTerm2 ou PowerShell.
  • Connaissances basiques de ligne de commande (cd, ls).
  • Firewall autorisant le port 22 (ufw allow 22).

Installer OpenSSH client et serveur

terminal
# Sur le client (Linux/macOS)
sudo apt update && sudo apt install openssh-client -y

# Sur le serveur (Ubuntu/Debian)
sudo apt update && sudo apt install openssh-server -y
sudo systemctl enable ssh
sudo systemctl start ssh

# Vérifier le statut
sudo systemctl status ssh

# Sur Windows (via PowerShell en admin)
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Start-Service sshd
Set-Service -Name sshd -StartupType 'Automatic'

Ces commandes installent et activent OpenSSH. Sur serveur, systemctl enable assure le démarrage auto au boot. Vérifiez avec status : vous devez voir 'active (running)'. Piège : sur Windows, exécutez en admin ; sinon, la feature échoue silencieusement.

Vérifier l'installation et première connexion

Testez la connexion basique avec mot de passe : ssh user@ip_serveur. Si cela fonctionne, vous êtes prêt pour les clés. Imaginez SSH comme une porte blindée : les mots de passe sont la serrure basique, les clés sont la biométrie.

Générer une paire de clés ED25519

terminal
cd ~/.ssh
ssh-keygen -t ed25519 -C "votre-email@example.com" -f id_ed25519

# Passphrase recommandée (optionnelle mais sécurisée)
# Entrez une passphrase forte (ex: 20+ chars avec chiffres/symboles)

# Lister les clés générées
ls -la

# Contenu de la clé publique (à copier)
cat ~/.ssh/id_ed25519.pub

ED25519 est plus rapide et résistant aux attaques quantiques que RSA. La -C ajoute un commentaire pour identification. Piège : sans passphrase, une clé volée compromet tout ; utilisez un gestionnaire comme ssh-agent pour l'éviter au quotidien.

Copier la clé publique sur le serveur

Utilisez ssh-copy-id pour automatiser : il crée ~/.ssh/authorized_keys avec les bonnes permissions (600/644).

Copier la clé et tester connexion sans mot de passe

terminal
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@ip_serveur

# Tester la connexion
ssh -i ~/.ssh/id_ed25519 user@ip_serveur

# Sur le serveur, vérifier permissions
echo "Permissions authorized_keys :"
ls -la ~/.ssh/authorized_keys

# Corriger si besoin
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

ssh-copy-id append la clé publique au fichier authorized_keys. Testez : vous devriez vous connecter sans prompt mot de passe. Piège : permissions trop ouvertes (777) bloquent SSH par sécurité ; corrigez toujours avec chmod.

Configurer le serveur SSH pour plus de sécurité

/etc/ssh/sshd_config contrôle le daemon. Éditez-le avec sudo nano, puis redémarrez : sudo systemctl restart ssh.

Configuration serveur sshd_config sécurisée

/etc/ssh/sshd_config
Port 2222
Protocol 2
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key

PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no

UsePAM no
X11Forwarding no
PrintMotd no
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server

Match User root
    PermitRootLogin no

LogLevel VERBOSE

Ce config : change port (anti-scan), désactive mots de passe/root, force clés. Match User root bloque root même en clé. Après édition, testez connexion avant restart ; sinon, vous vous verrouillez dehors.

Configurer le client pour des connexions aliasées

Créez ~/.ssh/config pour des raccourcis : ssh prod au lieu de ssh -p 2222 -i key user@ip.

Configuration client ~/.ssh/config

~/.ssh/config
Host prod
    HostName 192.0.2.1
    User ubuntu
    Port 2222
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes
    Compression yes

Host dev
    HostName dev.example.com
    User devuser
    Port 22
    IdentityFile ~/.ssh/id_ed25519
    ForwardAgent yes

Host *
    AddKeysToAgent yes
    UseKeychain yes  # macOS
    ServerAliveInterval 60

Les blocs Host simplifient les connexions récurrentes. IdentitiesOnly yes évite d'essayer toutes les clés (ralentit). ServerAliveInterval garde la session vivante. Permissions : chmod 600 ~/.ssh/config.

Exemple de tunneling SSH (port forwarding)

terminal
# Tunneling local : expose port 8080 serveur sur localhost:3000 client
ssh -L 3000:localhost:8080 prod

# Tunneling distant : expose localhost:3000 client sur serveur:8080
ssh -R 8080:localhost:3000 prod

# Avec compression pour connexions lentes
ssh -C -L 3000:localhost:8080 -N prod

# Fermer tunnel proprement : Ctrl+C

-L forward local (accès DB distante), -R distant (exposer service local). -N no command, juste tunnel. Utile pour debugger via localhost:3000. Piège : oubliez -N et le shell bloque.

Script bash pour connexion automatisée

connect.sh
#!/bin/bash

SERVER=$1
if [ -z "$SERVER" ]; then
  echo "Usage: ./connect.sh <prod|dev>"
  exit 1
fi

ssh-add ~/.ssh/id_ed25519 > /dev/null 2>&1
ssh "$SERVER" -o ConnectTimeout=10 -o StrictHostKeyChecking=accept-new

# Fonctionnalités :
# - Ajoute clé à agent
# - Timeout 10s
# - Accepte nouvelle clé host auto

Ce script rend les connexions one-liner : ./connect.sh prod. ssh-add charge la clé en agent. StrictHostKeyChecking=accept-new gère les nouveaux serveurs sans manual MITM check. Rendez exécutable : chmod +x connect.sh.

Bonnes pratiques

  • Changez toujours le port par défaut (22) pour réduire les scans automatisés (millions/jour).
  • Utilisez ED25519 ou ECDSA, évitez RSA < 4096 bits.
  • Fail2ban : installez pour bannir IPs après 3 fails ( sudo apt install fail2ban ).
  • Audit logs : grep 'Failed password' /var/log/auth.log quotidiennement.
  • 2FA : via Google Authenticator avec google-authenticator et ChallengeResponseAuthentication yes.

Erreurs courantes à éviter

  • Permissions authorized_keys 644+ : SSH refuse avec 'permissions too open'. Fix : chmod 600.
  • Oubli de restart ssh après config : changements ignorés. Toujours systemctl restart ssh.
  • Clés sans passphrase sur laptop : vol = compromission. Utilisez ssh-agent + PIN.
  • Root login activé : 99% des hacks. Forcez sudo après login user non-root.

Pour aller plus loin

  • Documentation officielle : man ssh_config(5).
  • Outils avancés : Mosh (sur SSH pour mobilité), Teleport (SSH zero-trust).
  • Formations : Découvrez nos formations DevOps et sécurité chez Learni pour maîtriser Kubernetes avec SSH intégré.
  • Projet pratique : Configurez un cluster Raspberry Pi avec SSH keys swarm.