SSH sur Linux (Debian / Ubuntu)

Ce tutoriel explique **comment se connecter en SSH** à une machine Debian ou Ubuntu, et **comment installer, configurer et sécuriser** le service SSH côté serveur. Il couvre également la **génération de clés**, l’usage de **ssh-agent**, le **pare-feu UFW**, les **transferts de fichiers** et les **tunnels SSH**, ainsi que le **dépannage** des problèmes courants.
Prérequis rapides
- Accès administrateur à la machine distante Debian ou Ubuntu
- Ouverture du port 22 TCP sur le réseau ou le pare-feu. Si vous changez de port, adaptez les commandes
- Un utilisateur non-root sur le serveur, membre du groupe sudo de préférence
- Sur le poste client, OpenSSH déjà présent sur Linux et macOS. Sur Windows 10 et 11, l’outil ssh est intégré
1. Installer et activer le serveur SSH (OpenSSH) sur Debian / Ubuntu
Installez OpenSSH sur le serveur, activez-le au démarrage et démarrez immédiatement le service.
sudo apt update
sudo apt install -y openssh-server
sudo systemctl enable ssh --now
sudo systemctl status ssh --no-pager
Si un pare-feu UFW est utilisé, autorisez SSH. Le profil OpenSSH existe généralement par défaut.
sudo ufw allow OpenSSH
# alternative si le profil n'existe pas
sudo ufw allow 22/tcp
sudo ufw reload
sudo ufw status
Test rapide côté serveur pour vérifier qu’il écoute sur le port 22.
ss -tnlp | grep :22
2. Se connecter en SSH depuis un client
Connexion de base avec un utilisateur non-root.
ssh utilisateur@ip_ou_domaine
Spécifier une clé privée particulière.
ssh -i ~/.ssh/id_ed25519 utilisateur@ip_ou_domaine
Si le serveur écoute sur un port non standard, par exemple 2222.
ssh -p 2222 utilisateur@ip_ou_domaine
Augmenter la verbosité pour diagnostiquer un souci de connexion.
ssh -vvv utilisateur@ip_ou_domaine
3. Générer une paire de clés SSH sur le client
Générez une clé ed25519 moderne et protégée par une passphrase.
ssh-keygen -t ed25519 -a 100 -C "poste-client"
La clé publique se trouve en général dans ce fichier.
~/.ssh/id_ed25519.pub
Copiez automatiquement votre clé publique vers le serveur avec ssh-copy-id.
ssh-copy-id -i ~/.ssh/id_ed25519.pub utilisateur@ip_ou_domaine
Alternative manuelle si ssh-copy-id n’est pas disponible.
cat ~/.ssh/id_ed25519.pub | ssh utilisateur@ip_ou_domaine 'mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys'
Activez ensuite l’agent SSH sur le client et chargez votre clé pour éviter de retaper la passphrase à chaque connexion.
# Linux / macOS
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
Sous Windows PowerShell.
Start-Service ssh-agent
Get-Service ssh-agent | Set-Service -StartupType Automatic
ssh-add $env:USERPROFILE\.ssh\id_ed25519
4. Durcir la configuration du serveur SSH
Créez un fichier de configuration dédié afin d’éviter de modifier le fichier principal. Sur Debian et Ubuntu récents, les drop-ins dans sshd_config.d/ sont pris en charge.
sudo nano /etc/ssh/sshd_config.d/10-hardening.conf
Exemple de paramètres recommandés.
Port 22
Protocol 2
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
KbdInteractiveAuthentication no
ChallengeResponseAuthentication no
X11Forwarding no
AllowAgentForwarding yes
AllowTcpForwarding yes
ClientAliveInterval 300
ClientAliveCountMax 2
MaxAuthTries 3
LoginGraceTime 30
UseDNS no
# Restreindre à des comptes spécifiques si souhaité
# AllowUsers adminops deployer
Testez la syntaxe et rechargez le service sans couper les connexions existantes.
sudo sshd -t
sudo systemctl reload ssh
Important. Ne désactivez PasswordAuthentication qu’après avoir confirmé que la connexion par clé fonctionne. Gardez une session SSH ouverte pendant vos changements pour éviter un verrouillage accidentel.
5. Configurer le client SSH avec ~/.ssh/config
Créez un alias de connexion pratique côté client.
mkdir -p ~/.ssh && chmod 700 ~/.ssh
nano ~/.ssh/config
Exemple d’entrée.
Host prod-web
HostName ip_ou_domaine
User utilisateur
Port 22
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
Utilisation.
ssh prod-web
Connexion via un bastion avec ProxyJump.
Host bastion
HostName bastion.exemple.com
User ops
IdentityFile ~/.ssh/id_ed25519
Host prod-web
HostName web.interne.local
User deploy
ProxyJump bastion
6. Transférer des fichiers avec SSH
Transfert avec scp.
# vers le serveur
scp fichier.txt utilisateur@ip_ou_domaine:/home/utilisateur/
# depuis le serveur
scp utilisateur@ip_ou_domaine:/var/log/syslog ./
Transfert efficace et incrémental avec rsync sur SSH.
rsync -avz -e "ssh -p 22" ./site/ utilisateur@ip_ou_domaine:/var/www/site/
Session SFTP interactive.
sftp utilisateur@ip_ou_domaine
7. Tunnels SSH (port forwarding)
Tunnel local. Accéder à un service distant localisé sur le port 80 via http://localhost:8080.
ssh -L 8080:localhost:80 utilisateur@ip_ou_domaine
Tunnel distant. Expose un service local du client vers le serveur sur 9000.
ssh -R 9000:localhost:3000 utilisateur@ip_ou_domaine
Proxy SOCKS dynamique.
ssh -D 1080 -N utilisateur@ip_ou_domaine
8. Sécuriser davantage. UFW, Fail2ban et port non standard
Autoriser un port alternatif si vous changez 22 vers 2222 par exemple. Attention, changer de port ne remplace pas l’authentification par clé.
sudo ufw allow 2222/tcp
sudo ufw delete allow 22/tcp
sudo ufw reload
Installer Fail2ban et activer la jail sshd. Cela limite les tentatives de brute force.
sudo apt install -y fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
Extrait minimal à adapter.
[sshd]
enabled = true
bantime = 1h
findtime = 10m
maxretry = 5
Redémarrez Fail2ban.
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd
9. Vérifier l’empreinte de la clé hôte (sécurité)
Au premier contact, SSH affiche l’empreinte de la clé hôte du serveur. Comparez-la avec celle mesurée sur le serveur.
sudo ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub
Vous pouvez aussi pré-remplir known_hosts côté client.
ssh-keyscan -t ed25519 ip_ou_domaine >> ~/.ssh/known_hosts
10. Dépannage. Problèmes courants et solutions
Connexion refusée. Vérifiez service et pare-feu.
sudo systemctl status ssh
sudo ufw status
ss -tnlp | grep :22
Authentification qui échoue.
# journal d'authentification sur Debian/Ubuntu
sudo tail -f /var/log/auth.log
# diagnostic côté client
ssh -vvv utilisateur@ip_ou_domaine
Permissions trop ouvertes sur .ssh ou authorized_keys.
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
Clé privée non utilisée. Forcez l’identité.
ssh -i ~/.ssh/id_ed25519 -o IdentitiesOnly=yes utilisateur@ip_ou_domaine
Hôte derrière un cloud firewall. Ouvrez le port 22 dans la console du fournisseur en plus d’UFW local.
Conflit de port ou service déjà utilisé. Changez le port dans le drop-in et dans UFW, puis rechargez.
sudo nano /etc/ssh/sshd_config.d/10-hardening.conf
sudo sshd -t && sudo systemctl reload ssh
11. Bonnes pratiques récapitulatives
- Utiliser des clés ed25519 avec passphrase, stockées dans ~/.ssh avec permissions strictes
- Désactiver l’authentification par mot de passe une fois les clés en place
- Interdire la connexion root directe et utiliser sudo avec un utilisateur dédié
- Restreindre éventuellement avec AllowUsers ou AllowGroups
- Surveiller auth.log et activer Fail2ban
- Sauvegarder vos clés privées et mettre en place une politique de rotation si nécessaire
- Documenter tout changement de port et mettre à jour les règles réseau associées
Annexes. Cartes mémo utiles
Lister les clés côté serveur.
sudo ls -l /etc/ssh/ssh_host_*_key.pub
Imprimer l’empreinte de la clé locale.
ssh-keygen -l -f ~/.ssh/id_ed25519.pub
Exemple d’exécution d’une commande distante en une ligne.
ssh utilisateur@ip_ou_domaine 'sudo systemctl status --no-pager ssh'
Exemple de multiplexage pour accélérer les connexions répétées.
Host *
ControlMaster auto
ControlPath ~/.ssh/cm-%r@%h:%p
ControlPersist 5m
Fin du guide. Vous pouvez désormais vous connecter en SSH à vos serveurs Debian/Ubuntu, de manière fiable et sécurisée.


















