Skip to content

Tutoriel sur SSH en français - Guide pratique pour sécuriser vos connexions distantes avec exemples concrets et bonnes pratiques de sécurité

License

Notifications You must be signed in to change notification settings

NDXDeveloper/ssh-tutorial-fr

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

📚 Tutoriel sur SSH

License Language


📋 Table des matières


🔍 Introduction à SSH

SSH (Secure Shell) est un protocole de réseau cryptographique qui permet d'accéder en toute sécurité à un ordinateur distant. Il remplace les anciens protocoles non sécurisés comme Telnet et rlogin qui transmettaient les données en clair.

Pourquoi utiliser SSH ?

  • Sécurité : Chiffrement de bout en bout de toutes les communications
  • Authentification : Plusieurs méthodes d'authentification (mot de passe, clés publiques, certificats)
  • Flexibilité : Transfert de fichiers, tunneling, port forwarding, X11 forwarding
  • Automatisation : Exécution de scripts et tâches automatisées sans interaction humaine
  • Polyvalence : Compatible avec tous les systèmes d'exploitation majeurs

Concepts de base

  • Client SSH : Machine qui initie la connexion (votre ordinateur)
  • Serveur SSH : Machine qui accepte les connexions (serveur distant, port 22 par défaut)
  • Clés SSH : Paire de clés cryptographiques (publique/privée) pour l'authentification sans mot de passe
  • Known Hosts : Fichier contenant les empreintes des serveurs connus pour éviter les attaques MITM
  • Agent SSH : Programme qui garde en mémoire les clés privées déchiffrées

⚙️ Installation de SSH

Sur Linux (Debian/Ubuntu)

# Installation du client SSH
sudo apt update
sudo apt install openssh-client

# Installation du serveur SSH (si nécessaire)
sudo apt install openssh-server

# Démarrer et activer le service
sudo systemctl start ssh
sudo systemctl enable ssh

Sur Linux (RHEL/CentOS/Fedora)

# Installation du client SSH
sudo dnf install openssh-clients

# Installation du serveur SSH
sudo dnf install openssh-server

# Démarrer et activer le service
sudo systemctl start sshd
sudo systemctl enable sshd

Sur macOS

SSH est préinstallé sur macOS. Vérifiez la version :

ssh -V

Pour activer le serveur SSH :

  1. Préférences Système → Partage
  2. Cocher "Session à distance"

Sur Windows

Option 1 : OpenSSH (Windows 10/11 - Recommandé)

  1. Paramètres → Applications → Fonctionnalités optionnelles
  2. Ajouter une fonctionnalité → OpenSSH Client
  3. Pour le serveur : OpenSSH Server

Option 2 : Git Bash

Option 3 : WSL (Windows Subsystem for Linux)

  • Installez WSL2 et une distribution Linux

Option 4 : PuTTY (Interface graphique)


🔑 Génération de clés SSH

Étape 1 : Créer une paire de clés

# Algorithme Ed25519 (recommandé - plus rapide et plus sécurisé)
ssh-keygen -t ed25519 -C "[email protected]"

# Alternative : RSA 4096 bits (compatible avec tous les systèmes)
ssh-keygen -t rsa -b 4096 -C "[email protected]"

Options importantes :

  • -t : Type d'algorithme (ed25519, rsa, ecdsa, dsa)
  • -b : Nombre de bits (pour RSA, minimum 2048, recommandé 4096)
  • -C : Commentaire pour identifier la clé
  • -f : Chemin et nom du fichier (ex: ~/.ssh/id_github)

Lors de la génération :

  1. Appuyez sur Entrée pour accepter l'emplacement par défaut
  2. Entrez une phrase de passe forte (optionnel mais recommandé)
  3. Confirmez la phrase de passe

Étape 2 : Configurer les permissions

# Sécuriser le répertoire SSH
chmod 700 ~/.ssh

# Permissions pour la clé privée (lecture seule pour vous)
chmod 600 ~/.ssh/id_ed25519

# Permissions pour la clé publique
chmod 644 ~/.ssh/id_ed25519.pub

Étape 3 : Ajouter la clé à l'agent SSH

# Démarrer l'agent SSH
eval "$(ssh-agent -s)"

# Ajouter la clé privée à l'agent
ssh-add ~/.ssh/id_ed25519

# Vérifier les clés chargées
ssh-add -l

Étape 4 : Copier la clé publique sur le serveur

Méthode automatique (recommandée) :

ssh-copy-id [email protected]

Méthode manuelle :

# Afficher la clé publique
cat ~/.ssh/id_ed25519.pub

# Copier manuellement sur le serveur
cat ~/.ssh/id_ed25519.pub | ssh [email protected] "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Sur le serveur distant :

# Vérifier que la clé a bien été ajoutée
cat ~/.ssh/authorized_keys

🌐 Connexion à un serveur distant

Connexion basique

# Syntaxe standard
ssh utilisateur@adresse_serveur

# Exemples
ssh [email protected]
ssh [email protected]
ssh [email protected]

Connexion avec options

# Spécifier le port
ssh -p 2222 [email protected]

# Utiliser une clé spécifique
ssh -i ~/.ssh/autre_cle [email protected]

# Mode verbose (pour débogage)
ssh -v [email protected]
ssh -vvv [email protected]  # Niveau maximum

# Compression des données
ssh -C [email protected]

# Combinaison d'options
ssh -p 2222 -i ~/.ssh/ma_cle -C [email protected]

Exécution de commandes à distance

# Exécuter une commande simple
ssh [email protected] "ls -la /home"

# Exécuter plusieurs commandes
ssh [email protected] "cd /var/www && git pull && npm install"

# Rediriger la sortie vers un fichier local
ssh [email protected] "cat /etc/os-release" > os_info.txt

# Utiliser des variables locales
VERSION=$(ssh [email protected] "cat /etc/debian_version")
echo "Version Debian: $VERSION"

Déconnexion

# Méthodes pour se déconnecter
exit
logout
# Ou Ctrl+D

⚙️ Configuration SSH avancée

Fichier de configuration ~/.ssh/config

Créez ou modifiez le fichier ~/.ssh/config :

# Configuration globale pour tous les hôtes
Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3
    TCPKeepAlive yes
    ConnectTimeout 10
    IdentitiesOnly yes
    AddKeysToAgent yes

# Serveur de production
Host prod
    HostName production.exemple.com
    User admin
    Port 2222
    IdentityFile ~/.ssh/id_ed25519_prod
    ForwardAgent no
    Compression yes

# Serveur de développement
Host dev
    HostName dev.exemple.com
    User developer
    Port 22
    IdentityFile ~/.ssh/id_ed25519_dev
    ForwardAgent yes

# Serveur local (Raspberry Pi par exemple)
Host pi
    HostName 192.168.1.100
    User pi
    IdentityFile ~/.ssh/id_ed25519_pi
    LocalForward 8080 localhost:80

# GitHub
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/github_ed25519
    IdentitiesOnly yes

# Configuration multi-comptes GitHub
Host github-perso
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_perso

Host github-travail
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_travail

# Jump Host (bastion)
Host serveur-interne
    HostName 10.0.0.50
    User internal
    ProxyJump bastion

Host bastion
    HostName bastion.exemple.com
    User jumpuser
    IdentityFile ~/.ssh/bastion_key

Utilisation avec le fichier config :

# Au lieu de : ssh -p 2222 [email protected]
# Utilisez simplement :
ssh prod

Options de configuration importantes

Option Description Valeur recommandée
ServerAliveInterval Envoie un paquet keep-alive toutes les N secondes 60
ServerAliveCountMax Nombre de paquets sans réponse avant déconnexion 3
TCPKeepAlive Maintient la connexion TCP active yes
ConnectTimeout Délai d'attente de connexion (secondes) 10
IdentitiesOnly Utilise uniquement les clés spécifiées yes
Compression Compresse les données transmises yes
ForwardAgent Transfère l'agent SSH (attention sécurité) yes/no
AddKeysToAgent Ajoute automatiquement les clés à l'agent yes

Tunneling SSH (Port Forwarding)

Port Forwarding Local :

# Accéder à un service distant via localhost
ssh -L [port_local]:[host_distant]:[port_distant] [email protected]

# Exemple : Accéder à une base de données distante
ssh -L 3306:localhost:3306 [email protected]
# Maintenant : mysql -h 127.0.0.1 -P 3306

# Exemple : Accéder à un site web interne
ssh -L 8080:localhost:80 [email protected]
# Maintenant : http://localhost:8080

Port Forwarding Distant :

# Exposer un service local sur le serveur distant
ssh -R [port_distant]:[host_local]:[port_local] [email protected]

# Exemple : Exposer votre serveur web local
ssh -R 9000:localhost:3000 [email protected]
# Le serveur peut maintenant accéder à localhost:9000

Dynamic Port Forwarding (Proxy SOCKS) :

# Créer un proxy SOCKS
ssh -D 1080 [email protected]

# Configurer votre navigateur pour utiliser :
# Proxy SOCKS5: localhost:1080

Tunnel en arrière-plan :

# Option -f : exécute SSH en arrière-plan
# Option -N : ne pas exécuter de commande distante
ssh -f -N -L 8080:localhost:80 [email protected]

📦 Transfert de fichiers avec SCP et SFTP

SCP (Secure Copy)

Copier vers le serveur :

# Fichier unique
scp fichier.txt [email protected]:/chemin/destination/

# Dossier complet (récursif)
scp -r mon_dossier/ [email protected]:/chemin/destination/

# Plusieurs fichiers
scp fichier1.txt fichier2.txt [email protected]:/chemin/

Copier depuis le serveur :

# Fichier unique
scp [email protected]:/chemin/fichier.txt .

# Dossier complet
scp -r [email protected]:/chemin/dossier/ .

Options SCP utiles :

# Port personnalisé
scp -P 2222 fichier.txt [email protected]:/chemin/

# Avec compression
scp -C gros_fichier.tar.gz [email protected]:/chemin/

# Limiter la bande passante (en Kbit/s)
scp -l 1000 fichier.txt [email protected]:/chemin/

# Mode verbose
scp -v fichier.txt [email protected]:/chemin/

# Préserver les métadonnées
scp -p fichier.txt [email protected]:/chemin/

SFTP (SSH File Transfer Protocol)

Mode interactif :

# Se connecter au serveur
sftp [email protected]

# Commandes SFTP
sftp> ls                  # Lister les fichiers distants
sftp> lls                 # Lister les fichiers locaux
sftp> pwd                 # Afficher le répertoire distant
sftp> lpwd                # Afficher le répertoire local
sftp> cd /chemin          # Changer de répertoire distant
sftp> lcd /chemin         # Changer de répertoire local
sftp> get fichier.txt     # Télécharger un fichier
sftp> put fichier.txt     # Envoyer un fichier
sftp> get -r dossier/     # Télécharger un dossier
sftp> put -r dossier/     # Envoyer un dossier
sftp> rm fichier.txt      # Supprimer un fichier distant
sftp> mkdir nouveau       # Créer un répertoire distant
sftp> exit                # Quitter

Mode batch (automatique) :

# Créer un fichier de commandes batch
cat > commandes_sftp.txt << EOF
cd /var/www
put index.html
put style.css
chmod 644 index.html
bye
EOF

# Exécuter les commandes
sftp -b commandes_sftp.txt [email protected]

🛡️ Bonnes pratiques de sécurité

1. Configuration du serveur SSH (/etc/ssh/sshd_config)

# Changer le port par défaut
Port 2222

# Désactiver la connexion root
PermitRootLogin no

# Désactiver l'authentification par mot de passe
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no

# Autoriser uniquement certains utilisateurs
AllowUsers utilisateur1 utilisateur2
# Ou interdire certains utilisateurs
DenyUsers utilisateur_suspect root

# Limiter les tentatives de connexion
MaxAuthTries 3
MaxSessions 2

# Timeout de connexion
LoginGraceTime 30

# Protocole SSH version 2 uniquement
Protocol 2

# Désactiver le transfert X11 si non nécessaire
X11Forwarding no

# Désactiver les tunnels si non nécessaires
AllowTcpForwarding no
GatewayPorts no

# Algorithmes cryptographiques forts uniquement
KexAlgorithms curve25519-sha256,[email protected]
Ciphers [email protected],[email protected]
MACs [email protected],[email protected]

Après modification, redémarrer SSH :

# Tester la configuration
sudo sshd -t

# Redémarrer le service
sudo systemctl restart sshd

2. Configuration du pare-feu

UFW (Ubuntu) :

# Autoriser SSH sur le nouveau port
sudo ufw allow 2222/tcp

# Bloquer l'ancien port si changé
sudo ufw deny 22/tcp

# Activer le pare-feu
sudo ufw enable

# Vérifier les règles
sudo ufw status

Firewalld (RHEL/CentOS) :

# Ajouter le nouveau port
sudo firewall-cmd --permanent --add-port=2222/tcp

# Retirer l'ancien port
sudo firewall-cmd --permanent --remove-service=ssh

# Recharger
sudo firewall-cmd --reload

3. Fail2Ban - Protection contre les attaques par force brute

# Installation
sudo apt install fail2ban

# Configuration SSH
sudo nano /etc/fail2ban/jail.local

Ajoutez :

[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
# Redémarrer Fail2Ban
sudo systemctl restart fail2ban

# Vérifier les bannissements
sudo fail2ban-client status sshd

4. Surveillance et audit

Vérifier les connexions actives :

# Utilisateurs connectés
who
w

# Historique des connexions
last
last -a | grep still  # Connexions actives

# Tentatives de connexion échouées
sudo lastb

Surveiller les logs :

# En temps réel
sudo tail -f /var/log/auth.log

# Avec systemd
sudo journalctl -u sshd -f

# Analyser les tentatives de connexion
sudo grep "Failed password" /var/log/auth.log
sudo grep "Accepted publickey" /var/log/auth.log

5. Gestion des clés SSH

Bonnes pratiques :

  • ✅ Utilisez des phrases de passe fortes pour vos clés
  • ✅ Rotation régulière des clés (tous les 6-12 mois)
  • ✅ Une clé par service (GitHub, serveur1, serveur2, etc.)
  • ✅ Sauvegardez vos clés dans un endroit sûr (coffre-fort de mots de passe)
  • ✅ Révoquez immédiatement les clés compromises
  • ❌ Ne partagez jamais vos clés privées
  • ❌ Ne commitez jamais de clés dans Git

Révoquer une clé compromise :

# Sur le serveur, éditez authorized_keys
nano ~/.ssh/authorized_keys
# Supprimez la ligne contenant la clé compromise

# Ou automatiquement
sed -i '/clé_compromise/d' ~/.ssh/authorized_keys

6. Authentification à deux facteurs (2FA)

# Installation de Google Authenticator
sudo apt install libpam-google-authenticator

# Configuration pour l'utilisateur
google-authenticator

# Modifier PAM
sudo nano /etc/pam.d/sshd
# Ajouter : auth required pam_google_authenticator.so

# Modifier sshd_config
sudo nano /etc/ssh/sshd_config
# Définir : ChallengeResponseAuthentication yes

# Redémarrer SSH
sudo systemctl restart sshd

7. Checklist de sécurité

  • Port SSH modifié (différent de 22)
  • Authentification par clés uniquement
  • Connexion root désactivée
  • Fail2Ban installé et configuré
  • Pare-feu configuré
  • Logs surveillés régulièrement
  • Clés SSH avec phrases de passe
  • Permissions correctes sur ~/.ssh
  • Mise à jour régulière du système
  • Algorithmes cryptographiques forts
  • 2FA activé (optionnel mais recommandé)

❓ FAQ et dépannage

Problème : "Permission denied (publickey)"

Causes possibles et solutions :

  1. Permissions incorrectes :

    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/id_ed25519
    chmod 644 ~/.ssh/id_ed25519.pub
    
    # Sur le serveur
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
  2. Clé publique non présente sur le serveur :

    # Vérifier sur le serveur
    cat ~/.ssh/authorized_keys
    
    # Ajouter votre clé
    ssh-copy-id [email protected]
  3. Mauvaise clé utilisée :

    # Spécifier explicitement la clé
    ssh -i ~/.ssh/id_ed25519 [email protected]
    
    # Mode verbose pour diagnostic
    ssh -v [email protected]
  4. Configuration serveur :

    # Sur le serveur, vérifier sshd_config
    sudo grep "PubkeyAuthentication" /etc/ssh/sshd_config
    # Doit être : PubkeyAuthentication yes

Problème : "Connection timed out"

Solutions :

  1. Vérifier la connectivité réseau :

    ping serveur.com
  2. Vérifier que le port est ouvert :

    telnet serveur.com 22
    # Ou
    nc -zv serveur.com 22
    # Ou
    nmap -p 22 serveur.com
  3. Vérifier le pare-feu local :

    # Linux
    sudo iptables -L
    sudo ufw status
    
    # Windows
    # Panneau de configuration → Pare-feu Windows
  4. Augmenter le timeout :

    # Dans ~/.ssh/config
    Host *
        ConnectTimeout 30

Problème : "Host key verification failed"

Cause : L'empreinte du serveur a changé (réinstallation, attaque MITM)

Solution :

# Supprimer l'ancienne empreinte
ssh-keygen -R serveur.com

# Ou pour un port spécifique
ssh-keygen -R [serveur.com]:2222

# Ou éditer manuellement
nano ~/.ssh/known_hosts

Problème : "Too many authentication failures"

Cause : L'agent SSH essaie trop de clés

Solutions :

# Option 1 : Spécifier la clé exacte
ssh -o IdentitiesOnly=yes -i ~/.ssh/cle_correcte [email protected]

# Option 2 : Vider l'agent SSH
ssh-add -D
ssh-add ~/.ssh/cle_correcte

# Option 3 : Configuration permanente dans ~/.ssh/config
Host serveur
    IdentitiesOnly yes
    IdentityFile ~/.ssh/cle_correcte

Problème : L'agent SSH ne fonctionne pas

Solutions :

# Vérifier si l'agent tourne
ps aux | grep ssh-agent

# Redémarrer l'agent
eval "$(ssh-agent -s)"

# Ajouter les clés
ssh-add ~/.ssh/id_ed25519

# Lister les clés chargées
ssh-add -l

# Problème de démarrage automatique ?
# Ajouter dans ~/.bashrc ou ~/.zshrc
if [ -z "$SSH_AUTH_SOCK" ]; then
   eval "$(ssh-agent -s)"
   ssh-add ~/.ssh/id_ed25519 2>/dev/null
fi

Problème : "Could not open a connection to your authentication agent"

Solution :

# Démarrer l'agent
eval "$(ssh-agent)"

Comment vérifier la version de SSH ?

ssh -V
# Exemple : OpenSSH_9.0p1, OpenSSL 3.0.2

# Version du serveur
ssh -v serveur.com 2>&1 | grep "remote software version"

Comment tester une connexion SSH ?

# Test basique
ssh -T [email protected]

# Avec verbosité maximale
ssh -vvv [email protected]

# Tester la configuration sans se connecter
ssh -G [email protected]

Problème : Session SSH se déconnecte fréquemment

Solutions :

# Dans ~/.ssh/config
Host *
    ServerAliveInterval 30
    ServerAliveCountMax 5
    TCPKeepAlive yes

📚 Ressources complémentaires

Documentation officielle

Outils recommandés

Clients SSH :

  • Termius : Client SSH multiplateforme avec synchronisation cloud
  • MobaXterm : Terminal avancé pour Windows avec X11
  • PuTTY : Client SSH classique pour Windows
  • iTerm2 : Terminal avancé pour macOS

Outils de configuration :

Sécurité et monitoring :

  • Fail2Ban : Protection contre les attaques par force brute
  • OSSEC : Système de détection d'intrusion
  • Denyhosts : Alternative à Fail2Ban
  • SSHGuard : Protection temps réel contre les attaques SSH

Gestion des clés :

Tutoriels et guides avancés

Commandes utiles

Consultez le fichier ssh_commands.md pour une référence complète des commandes SSH les plus utiles.

Exemples pratiques

Consultez le fichier EXAMPLES.md pour des cas d'usage concrets et des scénarios d'utilisation.


📄 Licence

Ce tutoriel est distribué sous licence MIT.

Vous êtes libre de :

  • ✅ Utiliser ce tutoriel à des fins personnelles ou commerciales
  • ✅ Modifier et adapter le contenu
  • ✅ Distribuer et partager

👤 À propos de l'auteur

Nicolas Deoux


🔄 Historique des versions

  • v1.0.0 (14 novembre 2025) : Version initiale du tutoriel

💡 Conseil final : La sécurité SSH est un processus continu. Restez informé des dernières vulnérabilités, mettez à jour régulièrement vos systèmes, et n'hésitez pas à consulter la documentation officielle pour des cas d'usage spécifiques.

⚠️ Avertissement : Testez toujours les configurations dans un environnement de développement avant de les appliquer en production. Une mauvaise configuration SSH peut vous verrouiller hors de votre serveur !

About

Tutoriel sur SSH en français - Guide pratique pour sécuriser vos connexions distantes avec exemples concrets et bonnes pratiques de sécurité

Topics

Resources

License

Stars

Watchers

Forks