Connexion distante, transfert de fichiers, tunneling et gestion des clés SSH.

Sujets associés : SSH


ssh — connexion distante

# Connexion basique
ssh utilisateur@192.168.1.50
ssh utilisateur@hostname.exemple.com
 
# Connexion sur un port non standard
ssh -p 2222 utilisateur@192.168.1.50
 
# Avec une clé privée spécifique
ssh -i ~/.ssh/ma-cle.pem utilisateur@192.168.1.50
 
# Mode verbeux (débogage de connexion)
ssh -v utilisateur@serveur      # verbosité 1
ssh -vv utilisateur@serveur     # verbosité 2
ssh -vvv utilisateur@serveur    # verbosité maximale
 
# Exécuter une commande distante sans session interactive
ssh utilisateur@serveur "ls -la /var/log"
ssh utilisateur@serveur "df -h; free -h; uptime"
 
# Exécuter un script local sur le serveur distant
ssh utilisateur@serveur 'bash -s' < script_local.sh
 
# Connexion avec agent SSH (forwarding d'agent)
ssh -A utilisateur@bastion         # puis depuis bastion → serveur_interne

ssh-keygen — gestion des clés

# Générer une paire de clés ED25519 (recommandé)
ssh-keygen -t ed25519 -C "commentaire@exemple.com"
 
# Générer une paire RSA 4096 bits
ssh-keygen -t rsa -b 4096 -C "commentaire@exemple.com"
 
# Spécifier l'emplacement de la clé
ssh-keygen -t ed25519 -f ~/.ssh/ma-cle -C "production"
 
# Changer la passphrase d'une clé existante
ssh-keygen -p -f ~/.ssh/id_ed25519
 
# Afficher l'empreinte (fingerprint) d'une clé
ssh-keygen -lf ~/.ssh/id_ed25519
ssh-keygen -lf ~/.ssh/id_ed25519.pub
 
# Afficher la clé publique
cat ~/.ssh/id_ed25519.pub
 
# Récupérer la clé publique depuis une clé privée
ssh-keygen -y -f ~/.ssh/id_ed25519
 
# Convertir un format de clé (OpenSSH ↔ PEM)
ssh-keygen -p -m PEM -f ~/.ssh/id_rsa

ssh-copy-id — déployer la clé publique

# Copier la clé publique par défaut sur un serveur
ssh-copy-id utilisateur@serveur
 
# Spécifier la clé à copier
ssh-copy-id -i ~/.ssh/ma-cle.pub utilisateur@serveur
 
# Sur un port non standard
ssh-copy-id -p 2222 -i ~/.ssh/ma-cle.pub utilisateur@serveur
 
# Équivalent manuel (si ssh-copy-id non disponible)
cat ~/.ssh/id_ed25519.pub | ssh utilisateur@serveur \
    "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Tunneling SSH

Port forwarding local (L)

Redirige un port local vers un service distant via le serveur SSH.

# Accéder à une BDD distante (3306) via localhost:3307
ssh -L 3307:localhost:3306 utilisateur@bastion
 
# Accéder à un service interne via un bastion
ssh -L 8080:service-interne:80 utilisateur@bastion
# → naviguer sur http://localhost:8080 accède à service-interne:80
 
# Rendre le tunnel persistant (pas de session interactive)
ssh -N -L 3307:db-interne:3306 utilisateur@bastion
 
# En arrière-plan
ssh -f -N -L 3307:db-interne:3306 utilisateur@bastion

Port forwarding distant (R)

Expose un service local sur le serveur distant.

# Exposer localhost:8080 sur serveur:9090
ssh -R 9090:localhost:8080 utilisateur@serveur
# → depuis le serveur, curl localhost:9090 atteint ta machine locale
 
# Exposer le port 22 local sur le bastion (remote access)
ssh -R 2222:localhost:22 utilisateur@bastion
# → depuis bastion : ssh -p 2222 localhost

Dynamic proxy SOCKS5 (D)

Crée un proxy SOCKS5 local qui achemine tout le trafic via SSH.

# Créer un proxy SOCKS5 sur le port 1080 local
ssh -D 1080 utilisateur@serveur
 
# En arrière-plan, sans session
ssh -f -N -D 1080 utilisateur@serveur
 
# Utiliser ce proxy avec curl
curl --socks5 localhost:1080 https://exemple.com
 
# Configurer le navigateur pour utiliser localhost:1080 comme proxy SOCKS5

~/.ssh/config — fichier de configuration

Évite de taper les options longues à chaque connexion.

# ~/.ssh/config

# Alias simple
Host prod
    HostName 192.168.1.50
    User deployer
    IdentityFile ~/.ssh/prod-key
    Port 2222

# Bastion / Jump Host
Host bastion
    HostName bastion.exemple.com
    User admin
    IdentityFile ~/.ssh/bastion-key

Host serveur-interne
    HostName 10.0.0.5
    User ubuntu
    ProxyJump bastion         # passe par bastion automatiquement

# Config globale
Host *
    ServerAliveInterval 60    # keepalive toutes les 60s
    ServerAliveCountMax 3     # 3 échecs → déconnexion
    AddKeysToAgent yes
    IdentityFile ~/.ssh/id_ed25519
# Utiliser les alias
ssh prod
ssh serveur-interne          # passe automatiquement par le bastion

scp et rsync — transfert de fichiers

# scp : copier un fichier local → distant
scp fichier.txt utilisateur@serveur:/home/utilisateur/
 
# scp : copier un dossier (récursif)
scp -r dossier/ utilisateur@serveur:/tmp/
 
# scp : copier distant → local
scp utilisateur@serveur:/var/log/app.log ./
 
# scp sur port non standard
scp -P 2222 fichier.txt utilisateur@serveur:/tmp/
 
# scp avec clé spécifique
scp -i ~/.ssh/ma-cle.pem fichier.txt utilisateur@serveur:/tmp/
 
# rsync : synchronisation (plus efficace que scp pour les gros transferts)
rsync -avz dossier/ utilisateur@serveur:/chemin/distant/
#      │││
#      ││└─ compresser pendant le transfert
#      │└── verbeux
#      └─── mode archive (récursif + permissions + timestamps)
 
# rsync avec suppression des fichiers absents de la source
rsync -avz --delete dossier/ utilisateur@serveur:/chemin/distant/
 
# rsync via un port SSH non standard
rsync -avz -e "ssh -p 2222" dossier/ utilisateur@serveur:/chemin/
 
# rsync en dry-run (voir ce qui serait transféré)
rsync -avzn dossier/ utilisateur@serveur:/chemin/distant/

ssh-agent — gestion des clés en mémoire

# Démarrer l'agent
eval "$(ssh-agent -s)"
 
# Ajouter une clé à l'agent
ssh-add ~/.ssh/id_ed25519
 
# Ajouter une clé pour une durée limitée (1h)
ssh-add -t 3600 ~/.ssh/id_ed25519
 
# Lister les clés chargées
ssh-add -l
 
# Supprimer une clé de l'agent
ssh-add -d ~/.ssh/id_ed25519
 
# Supprimer toutes les clés
ssh-add -D

Gestion du serveur SSH (sshd)

# Statut du service
systemctl status sshd
 
# Redémarrer SSH (après modification de config)
sudo systemctl restart sshd
 
# Vérifier la config avant de redémarrer
sudo sshd -t
 
# Fichier de configuration
sudo nano /etc/ssh/sshd_config
 
# Options importantes dans sshd_config :
# Port 22                          ← changer pour réduire les scans
# PermitRootLogin no               ← désactiver le login root
# PasswordAuthentication no        ← forcer les clés SSH
# PubkeyAuthentication yes
# AllowUsers alice bob             ← liste blanche d'utilisateurs
# MaxAuthTries 3
# ClientAliveInterval 300
 
# Voir les connexions SSH en cours
ss -tnp | grep :22
who
w
last | head -20                    # historique des connexions

En relation avec