Appearance
SSH - Secure Shell
Sommaire
Introduction
SSH (Secure Shell) est un protocole réseau crypté qui permet de se connecter de manière sécurisée à des machines distantes. C'est l'outil fondamental pour l'administration de serveurs Linux et la gestion de systèmes à distance.
Qu'est-ce que SSH ?
Définition
SSH est un protocole de communication sécurisé qui permet :
- Connexion à distance sécurisée à un serveur
- Transfert de fichiers chiffré
- Exécution de commandes à distance
- Tunneling (redirection de ports)
Pourquoi SSH ?
Avant SSH, les protocoles comme Telnet, FTP ou RSH envoyaient les données en clair sur le réseau, incluant les mots de passe ! SSH résout ce problème en :
- Chiffrant toutes les communications
- Authentifiant les serveurs (évite les attaques man-in-the-middle)
- Compressant les données pour optimiser les transferts
- Supportant différentes méthodes d'authentification
Architecture SSH
Client SSH ←--[Canal chiffré]-→ Serveur SSH
(ssh) (sshd)Composants :
- Client SSH : Programme qui initie la connexion (commande
ssh) - Serveur SSH : Démon qui écoute les connexions entrantes (
sshd) - Clés : Paires de clés publiques/privées pour l'authentification
Installation et configuration
Installation du client SSH
Sur la plupart des distributions Linux modernes, le client SSH est déjà installé.
bash
# Vérifier si SSH est installé
$ which ssh
/usr/bin/ssh
# Version de SSH
$ ssh -V
OpenSSH_10.0p2 Debain-7, OpenSSL 3.5.1 1 Jul 2025Installation du serveur SSH
Pour permettre les connexions entrantes, il faut installer le serveur SSH :
bash
# Installation du serveur SSH (Debian/Ubuntu)
$ sudo apt install openssh-server
# Installation du serveur SSH (CentOS/RHEL/Fedora)
$ sudo dnf install openssh-server
# Démarrer et activer le service
$ sudo systemctl start ssh
$ sudo systemctl enable ssh
# Vérifier le statut
$ sudo systemctl status sshConfiguration du serveur SSH
Le fichier de configuration principal est /etc/ssh/sshd_config :
bash
# Éditer la configuration
$ sudo nano /etc/ssh/sshd_config
# Redémarrer après modification
$ sudo systemctl restart sshOptions importantes dans sshd_config :
bash
# Port d'écoute (défaut: 22)
Port 22
# Adresses d'écoute
ListenAddress 0.0.0.0 # Écoute sur toutes les interfaces
ListenAddress :: # Écoute sur IPv6
# Authentification par mot de passe
PasswordAuthentication yes
# Authentification par clé publique
PubkeyAuthentication yes
# Connexion root
PermitRootLogin no
# Utilisateurs autorisés
AllowUsers user1 user2
# Temps de connexion
LoginGraceTime 2m # Temps pour se connecter
ClientAliveInterval 300 # Garder la connexion activeUtilisation de base
Connexion SSH simple
bash
# Syntaxe de base
$ ssh utilisateur@serveur
# Exemples
$ ssh john@192.168.1.100
$ ssh admin@serveur.example.com
$ ssh root@10.0.0.5
# Utiliser un port différent
$ ssh -p 2222 user@serveur.com
# Spécifier la clé privée
$ ssh -i ~/.ssh/ma_cle user@serveur.comPremière connexion
Lors de la première connexion, SSH vous demande de vérifier l'empreinte du serveur :
bash
$ ssh user@nouveau-serveur.com
The authenticity of host 'nouveau-serveur.com (192.168.1.100)' can't be established.
ED25519 key fingerprint is SHA256:abc123def456...
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'nouveau-serveur.com' (ED25519) to the list of known hosts.
user@nouveau-serveur.com's password:Cette empreinte est stockée dans ~/.ssh/known_hosts pour les connexions futures.
Exécution de commandes à distance
bash
# Exécuter une commande simple
$ ssh user@serveur 'ls -la'
# Commandes multiples
$ ssh user@serveur 'cd /var/log && tail -f syslog'
# Commande interactive (allocation d'un pseudo-terminal)
$ ssh -t user@serveur 'sudo systemctl status apache2'
# Redirection locale
$ ssh user@serveur 'cat /etc/passwd' > users_distant.txtL'option -t est essentielle quand on exécute des commandes qui nécessitent une interaction utilisateur ou un environnement de terminal complet.
Options utiles de SSH
| Option | Description | Exemple |
|---|---|---|
-p | Port SSH | ssh -p 2222 user@host |
-i | Clé privée | ssh -i ~/.ssh/key user@host |
-t | Force l'allocation d'un pseudo-terminal | ssh -t user@host sudo command |
-f | Exécute en arrière-plan | ssh -f user@host command |
-v | Mode verbeux (debug) | ssh -v user@host |
-X | Transfert X11 (interface graphique) | ssh -X user@host |
-C | Compression | ssh -C user@host |
Se connecter sur la machine virtuelle à partir de la machine hôte
Configurez le réseau de la machine virtuelle en mode "Réseau privé hôte" (Host-Only) dans VirtualBox pour permettre la communication entre la machine hôte et la machine virtuelle.
Ajouter une redirection de port dans VirtualBox pour rediriger le port 2222 de la machine hôte vers le port 22 de la machine virtuelle.

Démarrer la machine virtuelle, puis depuis la machine hôte (votre ordinateur), utilisez la commande suivante pour vous connecter à la machine virtuelle via SSH :
bash
ssh -p 2222 user@localhostputty (Windows - connexion interface graphique)
Putty est un client SSH populaire pour Windows. Il permet de se connecter à des serveurs SSH via une interface graphique.
Authentification par clés
À la place d'utiliser des mots de passe, SSH permet une authentification plus sécurisée via des paires de clés publiques/privées.
INFO
Si vous avec un compte gitlab ou github, vous avez probablement déjà une paire de clés SSH configurée pour vos dépôts si vous utilisez git en SSH.
Dans la configuration de ssh (/etc/ssh/sshd_config), assurez-vous que PubkeyAuthentication yes est activé et désactivez PasswordAuthentication no pour forcer l'usage des clés.
Principe des clés SSH
L'authentification par clés est plus sécurisée que les mots de passe :
- Clé privée : Gardée secrète sur votre machine
- Clé publique : Partagée avec les serveurs
- Algorithmes : RSA, ECDSA, Ed25519
Génération d'une paire de clés
bash
# Générer une clé Ed25519 (recommandé)
$ ssh-keygen -t ed25519 -C "votre.email@example.com"
# Générer une clé RSA 4096 bits
$ ssh-keygen -t rsa -b 4096 -C "votre.email@example.com"
# Processus interactif :
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519): [ENTER]
Enter passphrase (empty for no passphrase): [mot_de_passe_optionnel]
Enter same passphrase again: [mot_de_passe_optionnel]
Your identification has been saved in /home/user/.ssh/id_ed25519
Your public key has been saved in /home/user/.ssh/id_ed25519.pubStructure des fichiers SSH
bash
$ ls -la ~/.ssh/
-rw------- 1 user user 464 Oct 9 10:30 id_ed25519 # Clé privée
-rw-r--r-- 1 user user 108 Oct 9 10:30 id_ed25519.pub # Clé publique
-rw-r--r-- 1 user user 1337 Oct 9 10:25 known_hosts # Serveurs connus
-rw-r--r-- 1 user user 356 Oct 9 10:32 authorized_keys # Clés autorisées
-rw-r--r-- 1 user user 123 Oct 9 10:35 config # Configuration clientPermissions importantes :
~/.ssh/: 700 (rwx------)- Clés privées : 600 (rw-------)
- Clés publiques : 644 (rw-r--r--)
authorized_keys: 600 (rw-------)
Déploiement de la clé publique vers le serveur
bash
# Méthode automatique (recommandée)
$ ssh-copy-id user@serveur.com
# Méthode manuelle - copier le contenu de la clé publique
$ cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3Nza... votre.email@example.com
# Sur le serveur distant, ajouter dans ~/.ssh/authorized_keys
$ echo "ssh-ed25519 AAAAC3Nza... votre.email@example.com" >> ~/.ssh/authorized_keys
# Ou avec une commande en une ligne
$ cat ~/.ssh/id_ed25519.pub | ssh user@serveur 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys'Utilisation des clés
bash
# Connexion avec clé par défaut
$ ssh user@serveur
# Connexion avec clé spécifique
$ ssh -i ~/.ssh/ma_cle_speciale user@serveur
# Agent SSH pour gérer les clés
$ ssh-add ~/.ssh/id_ed25519
$ ssh-add -l # Lister les clés chargées
$ ssh-add -D # Supprimer toutes les clés de l'agentConfiguration avancée
Fichier de configuration client
Créer ~/.ssh/config pour simplifier les connexions :
bash
# Configuration pour plusieurs serveurs
Host serveur1
HostName 192.168.1.100
User admin
Port 2222
IdentityFile ~/.ssh/serveur1_key
Host prod
HostName production.example.com
User deployer
IdentityFile ~/.ssh/prod_key
ServerAliveInterval 60
Host *.example.com
User john
IdentityFile ~/.ssh/company_key
Compression yes
# Configuration par défaut
Host *
ServerAliveInterval 300
ServerAliveCountMax 2
TCPKeepAlive yesUtilisation :
bash
# Au lieu de ssh -p 2222 admin@192.168.1.100
$ ssh serveur1
# Au lieu de ssh deployer@production.example.com
$ ssh prodSécurisation du serveur SSH
Bonnes pratiques dans /etc/ssh/sshd_config :
bash
# Changer le port par défaut
Port 2222
# Désactiver l'authentification par mot de passe
PasswordAuthentication no
PubkeyAuthentication yes
# Désactiver la connexion root
PermitRootLogin no
# Limiter les utilisateurs
AllowUsers john jane admin
# Limiter les tentatives de connexion
MaxAuthTries 3
MaxStartups 3
# Déconnexion automatique
ClientAliveInterval 300
ClientAliveCountMax 2
# Désactiver les fonctionnalités non nécessaires
X11Forwarding no
AllowTcpForwarding no
GatewayPorts no
# Utiliser seulement des algorithmes sécurisés
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group16-sha512
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.comTransfert de fichiers
SCP (Secure Copy)
bash
# Copier un fichier local vers un serveur distant
$ scp fichier.txt user@serveur:/chemin/destination/
# Copier un fichier distant vers la machine locale
$ scp user@serveur:/chemin/fichier.txt ./
# Copier un répertoire (récursif)
$ scp -r dossier/ user@serveur:/destination/
# Copier avec options
$ scp -P 2222 -i ~/.ssh/cle fichier.txt user@serveur:/tmp/
# Copier entre deux serveurs distants
$ scp user1@serveur1:/fichier.txt user2@serveur2:/destination/Sécurité avancée
Protection contre les attaques
Fail2ban
Fail2ban surveille les logs et bannit les IP après plusieurs tentatives de connexion échouées.
bash
# Installation
$ sudo apt install fail2ban
# Configuration SSH dans /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600Surveillance et monitoring
bash
# Connexions actives
$ who
$ w
$ last
# Tentatives de connexion
$ sudo grep "Failed password" /var/log/auth.log
$ sudo grep "Invalid user" /var/log/auth.logQuiz 🎉
Ce quiz teste vos connaissances sur SSH, l'authentification, la sécurité et les transferts de fichiers.
0 questions - Bonne chance ! 🔒