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
| Usage | Commande |
|---|---|
| Shell distant | ssh alice@serveur.com |
| Exécuter une commande | ssh 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 SSH | ssh -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'inviteClé 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.10Client 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 sshdPort 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 distantLaptop: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:3000Proxy 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:1080SSH 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.confFichiers importants
| Fichier | Rôle |
|---|---|
~/.ssh/id_ed25519 | Clé privée — ne jamais partager |
~/.ssh/id_ed25519.pub | Clé publique — à déposer sur les serveurs |
~/.ssh/authorized_keys | Clés publiques autorisées (côté serveur) |
~/.ssh/known_hosts | Empreintes des serveurs déjà visités (anti-MITM) |
~/.ssh/config | Configuration client (alias, options par hôte) |
/etc/ssh/sshd_config | Configuration 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