Skip to content

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 2025

Installation 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 ssh

Configuration 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 ssh

Options 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 active

Utilisation 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.com

Premiè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.txt

L'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

OptionDescriptionExemple
-pPort SSHssh -p 2222 user@host
-iClé privéessh -i ~/.ssh/key user@host
-tForce l'allocation d'un pseudo-terminalssh -t user@host sudo command
-fExécute en arrière-planssh -f user@host command
-vMode verbeux (debug)ssh -v user@host
-XTransfert X11 (interface graphique)ssh -X user@host
-CCompressionssh -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.

Configuration ssh sur virtualbox

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@localhost

putty (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.pub

Structure 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 client

Permissions 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'agent

Configuration 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 yes

Utilisation :

bash
# Au lieu de ssh -p 2222 admin@192.168.1.100
$ ssh serveur1

# Au lieu de ssh deployer@production.example.com
$ ssh prod

Sé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.com

Transfert 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 = 600

Surveillance 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.log

Quiz 🎉

Ce quiz teste vos connaissances sur SSH, l'authentification, la sécurité et les transferts de fichiers.

0 questions - Bonne chance ! 🔒

.