SSH — Secure Shell

Couche OSI : L7 — Application
Port : 22 (TCP)

SSH est un protocole d’accès distant sécurisé. Il chiffre entièrement la connexion et remplace les anciens protocoles non sécurisés (Telnet, rsh, rcp). SSH permet l’exécution de commandes, le transfert de fichiers (SFTP/SCP), et le tunneling de trafic.


Ce qu’on peut faire avec SSH

UsageCommande
Shell distantssh alice@serveur.com
Exécuter une commandessh alice@serveur.com "ls -la /var/log"
Copier des fichiers (SCP)scp fichier.zip alice@serveur.com:/home/alice/
Transfert de fichiers interactif (SFTP)sftp alice@serveur.com
Tunnel local (port forwarding)ssh -L 8080:localhost:80 alice@serveur.com
Tunnel distant (reverse)ssh -R 9090:localhost:3000 alice@serveur.com
Proxy SOCKS via SSHssh -D 1080 alice@serveur.com

Authentification : clé vs mot de passe

Mot de passe (à éviter en production)

ssh alice@203.0.113.10
# → Entrer le mot de passe à l'invite

Clé publique / privée (recommandé)

# 1. Générer une paire de clés
ssh-keygen -t ed25519 -C "alice@monentreprise.fr"
# → Crée ~/.ssh/id_ed25519 (clé PRIVÉE — ne jamais partager)
# → Crée ~/.ssh/id_ed25519.pub (clé PUBLIQUE — à déposer sur le serveur)
 
# 2. Copier la clé publique sur le serveur
ssh-copy-id alice@203.0.113.10
# → ajoute id_ed25519.pub dans ~/.ssh/authorized_keys sur le serveur
 
# 3. Se connecter sans mot de passe
ssh alice@203.0.113.10
Client                              Serveur
  │── connexion TCP:22 ────────────► │
  │◄── clé publique du serveur ────  │  le client vérifie l'identité du serveur
  │── "je veux me connecter         │
  │    avec la clé pub alice" ─────► │
  │◄── "prouve-le (challenge)" ────  │
  │── [signe le challenge avec      │
  │    la clé PRIVÉE] ─────────────► │
  │◄── "authentification OK" ──────  │  le serveur vérifie avec la clé PUBLIQUE stockée
  │════ shell chiffré ══════════════  │

Sécurisation d’un serveur SSH

Fichier de configuration : /etc/ssh/sshd_config

# Changer le port par défaut (sécurité par obscurité)
Port 2222
 
# Désactiver l'authentification par mot de passe
PasswordAuthentication no
 
# Désactiver la connexion root directe
PermitRootLogin no
 
# Autoriser uniquement certains utilisateurs
AllowUsers alice bob
 
# Limiter les algorithmes (bannir les anciens)
KexAlgorithms curve25519-sha256,ecdh-sha2-nistp256
Ciphers aes256-gcm@openssh.com,chacha20-poly1305@openssh.com
 
# Timeout de session inactive
ClientAliveInterval 300
ClientAliveCountMax 3
# Appliquer la configuration
systemctl reload sshd

Port forwarding (tunneling)

SSH permet de faire transiter d’autres protocoles à travers le tunnel chiffré.

Tunnel local — accéder à un service distant

# Accéder à une base de données PostgreSQL distante
# en local sur le port 5433
ssh -L 5433:localhost:5432 alice@203.0.113.10
 
# Désormais : psql -h localhost -p 5433 se connecte à Postgres sur le serveur distant
Laptop:5433 ──► SSH tunnel (chiffré) ──► Serveur:22 ──► localhost:5432 (Postgres)

Tunnel distant — exposer un service local

# Exposer ton serveur de dev local (port 3000) via le serveur distant (port 9090)
ssh -R 9090:localhost:3000 alice@203.0.113.10
 
# Depuis Internet : http://203.0.113.10:9090 → ton localhost:3000

Proxy SOCKS dynamique

# Tout le trafic de l'application passe par le serveur SSH
ssh -D 1080 alice@203.0.113.10
 
# Configurer le navigateur pour utiliser SOCKS5 sur localhost:1080

SSH dans le contexte DevOps / Kubernetes

# Accès à un nœud Kubernetes
ssh -i ~/.ssh/k8s-key ubuntu@10.0.1.5
 
# Tunnel vers l'API Kubernetes (si non exposée publiquement)
ssh -L 6443:localhost:6443 ubuntu@bastion.moncluster.com
 
# kubectl exec utilise un mécanisme similaire au SSH en interne
kubectl exec -it mon-pod -- /bin/bash
 
# Copier des fichiers vers/depuis un pod
kubectl cp fichier.conf mon-pod:/etc/app/config.conf

Fichiers importants

FichierRôle
~/.ssh/id_ed25519Clé privée — ne jamais partager
~/.ssh/id_ed25519.pubClé publique — à déposer sur les serveurs
~/.ssh/authorized_keysClés publiques autorisées (côté serveur)
~/.ssh/known_hostsEmpreintes des serveurs déjà visités (anti-MITM)
~/.ssh/configConfiguration client (alias, options par hôte)
/etc/ssh/sshd_configConfiguration du daemon SSH serveur
# Exemple ~/.ssh/config
Host bastion
    HostName 203.0.113.10
    User alice
    Port 2222
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 60
 
# Utilisation : ssh bastion  (au lieu de ssh -p 2222 -i ~/.ssh/id_ed25519 alice@203.0.113.10)

En relation avec

  • Protocoles OSI - Index — tous les protocoles par couche
  • TLS et SSL — SSH utilise ses propres mécanismes crypto (pas TLS, mais principes similaires)
  • FTP — SFTP est le remplacement sécurisé de FTP, intégré à SSH
  • SOCKS — SSH peut créer un proxy SOCKS dynamique
  • Paquets IP et TCP — SSH utilise TCP port 22