Aide-mémoire SSH
| Connexion de Base |
| Objectif | Commande |
| Connexion simple |
ssh user@hostname ssh user@192.168.1.10 ssh user@monserveur.com |
| Port personnalisé |
ssh -p 2222 user@hostname |
| Avec une clé privée spécifique |
ssh -i ~/.ssh/ma_cle_privee user@hostname |
| Exécuter une commande distante |
ssh user@hostname "commande" ssh user@hostname "ls -la /var/www" ssh user@hostname "sudo systemctl restart apache2" |
| Exécuter un script local à distance |
ssh user@hostname 'bash -s' < script_local.sh cat script.sh | ssh user@hostname bash |
| Mode verbose (debug) |
ssh -v user@hostname -- verbose ssh -vv user@hostname -- très verbose ssh -vvv user@hostname -- debug maximal |
| Sortir d'une session gelée |
~. -- séquence d'échappement pour fermer (taper ~ puis .) ~? -- aide sur les séquences d'échappement |
| Génération et Gestion des Clés |
| Générer une clé ED25519 (recommandé) |
ssh-keygen -t ed25519 -C "commentaire@exemple.com" ssh-keygen -t ed25519 -C "serveur-prod" -f ~/.ssh/id_prod
-- Fichiers générés : ~/.ssh/id_ed25519 # clé PRIVÉE (garder secrète !) ~/.ssh/id_ed25519.pub # clé PUBLIQUE (à copier sur les serveurs) |
| Générer une clé RSA (plus compatible) |
ssh-keygen -t rsa -b 4096 -C "commentaire" ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_monserveur |
| Copier la clé publique sur un serveur |
# Méthode automatique (recommandée) ssh-copy-id user@hostname ssh-copy-id -i ~/.ssh/id_ed25519.pub user@hostname ssh-copy-id -p 2222 -i ~/.ssh/id_prod.pub user@hostname
# Méthode manuelle cat ~/.ssh/id_ed25519.pub | ssh user@hostname "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# Sur le serveur distant chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys |
| Lister les clés enregistrées |
ls -la ~/.ssh/ cat ~/.ssh/authorized_keys # clés autorisées (serveur) cat ~/.ssh/known_hosts # serveurs connus (client) |
| Afficher l'empreinte d'une clé |
ssh-keygen -lf ~/.ssh/id_ed25519.pub ssh-keygen -lf ~/.ssh/id_ed25519.pub -E md5 |
| Changer la passphrase d'une clé |
ssh-keygen -p -f ~/.ssh/id_ed25519 |
| Supprimer un serveur de known_hosts |
ssh-keygen -R hostname ssh-keygen -R 192.168.1.10 |
| Droits obligatoires |
chmod 700 ~/.ssh chmod 600 ~/.ssh/id_ed25519 # clé privée chmod 644 ~/.ssh/id_ed25519.pub # clé publique chmod 600 ~/.ssh/authorized_keys chmod 600 ~/.ssh/config |
| Fichier ~/.ssh/config |
| Exemple de configuration complète |
nano ~/.ssh/config
# Serveur de production
Host prod
HostName monserveur.com
User deployer
Port 22
IdentityFile ~/.ssh/id_prod
ForwardAgent yes
# Serveur de dev
Host dev
HostName 192.168.1.50
User ubuntu
Port 2222
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
ServerAliveCountMax 3
# Bastion (jump host)
Host bastion
HostName bastion.exemple.com
User admin
IdentityFile ~/.ssh/id_bastion
# Serveur interne via bastion
Host interne
HostName 192.168.10.20
User admin
ProxyJump bastion
# Paramètres globaux
Host *
ServerAliveInterval 60
AddKeysToAgent yes
IdentityFile ~/.ssh/id_ed25519 |
| Utilisation du fichier config |
ssh prod -- connexion au serveur "prod" ssh dev -- connexion au serveur "dev" scp fichier prod:/tmp/ -- transfert vers prod rsync -avz src/ prod:/dest/ |
| Options config utiles |
HostName -- IP ou nom DNS réel User -- nom d'utilisateur Port -- port SSH (défaut 22) IdentityFile -- clé privée à utiliser ForwardAgent -- transmettre l'agent SSH ServerAliveInterval -- keepalive en secondes ServerAliveCountMax -- nb de keepalives avant déconnexion ProxyJump -- rebondir via un autre hôte (bastion) StrictHostKeyChecking no -- ne pas vérifier la clé (dev uniquement !) Compression yes -- activer la compression |
| Transfert de Fichiers |
| SCP (Secure Copy) |
# Envoyer un fichier vers le serveur scp fichier.txt user@hostname:/chemin/distant/ scp -P 2222 fichier.txt user@hostname:/tmp/
# Envoyer un dossier entier scp -r dossier/ user@hostname:/var/www/
# Récupérer un fichier depuis le serveur scp user@hostname:/var/log/apache2/error.log ./error.log
# Récupérer un dossier scp -r user@hostname:/var/www/ ./backup/
# Entre deux serveurs distants scp user1@serveur1:/fichier user2@serveur2:/destination/ |
| SFTP (interactif) |
sftp user@hostname sftp -P 2222 user@hostname
# Commandes dans la session SFTP : ls / lls -- liste distante / locale cd / lcd -- changer de dossier distant / local pwd / lpwd -- dossier courant distant / local get fichier.txt -- télécharger put fichier.txt -- envoyer mget *.log -- télécharger plusieurs fichiers mput *.php -- envoyer plusieurs fichiers mkdir / rmdir -- créer / supprimer dossier rm fichier.txt -- supprimer quit / bye -- quitter |
| RSYNC (synchronisation) |
# Options courantes : -a archive -v verbose -z compresse -P progression
# --delete : supprime les fichiers absents de la source
# Synchroniser un dossier local → serveur
rsync -avzP ./www/ user@hostname:/var/www/html/
rsync -avz --delete ./www/ user@hostname:/var/www/html/
# Récupérer depuis le serveur
rsync -avzP user@hostname:/var/www/ ./backup/
# Port SSH personnalisé
rsync -avz -e "ssh -p 2222" ./www/ user@hostname:/var/www/
# Simulation (dry-run)
rsync -avz --dry-run ./www/ user@hostname:/var/www/
# Exclure des fichiers/dossiers
rsync -avz --exclude='*.log' --exclude='node_modules/' ./www/ user@hostname:/var/www/
# Limiter la bande passante (en Ko/s)
rsync -avz --bwlimit=1000 ./www/ user@hostname:/var/www/ |
| Tunnels SSH (Port Forwarding) |
| Tunnel local (L) |
# Accéder à un port distant via un port local
# ssh -L port_local:hote_cible:port_cible user@bastion
# Accéder à une BDD MySQL distante (port 3306) via localhost:3307
ssh -L 3307:localhost:3306 user@serveur-bdd -N
# Accéder à un serveur web interne via un bastion
ssh -L 8080:serveur-interne:80 user@bastion -N
# Options :
# -N : ne pas exécuter de commande (tunnel seul)
# -f : passer en arrière-plan
# -C : activer la compression
ssh -f -N -L 3307:localhost:3306 user@serveur-bdd |
| Tunnel distant (R) |
# Exposer un port local sur le serveur distant
# ssh -R port_distant:hote_local:port_local user@serveur
# Exposer localhost:80 sur le port 8080 du serveur distant
ssh -R 8080:localhost:80 user@serveur -N
# Cas d'usage : partager son dev local avec quelqu'un ayant accès au serveur |
| Proxy SOCKS dynamique (D) |
# Créer un proxy SOCKS5 via le serveur SSH
ssh -D 1080 user@hostname -N -f
# Configurer le navigateur ou le système sur 127.0.0.1:1080 (SOCKS5)
# Tout le trafic passe alors par le serveur SSH
# curl via le proxy
curl --socks5 127.0.0.1:1080 http://exemple.interne/ |
| ProxyJump / Jump Host |
# Se connecter à un serveur interne via un bastion
ssh -J user@bastion user@serveur-interne
ssh -J user@bastion:2222 admin@192.168.10.5
# Avec le fichier config (recommandé) :
# Host interne
# ProxyJump bastion
ssh interne |
| Maintenir un tunnel en arrière-plan |
# Avec autossh (reconnexion automatique)
autossh -M 0 -f -N -L 3307:localhost:3306 user@serveur
# Installer autossh
sudo apt install autossh |
| SSH Agent |
| Démarrer et utiliser l'agent |
# Démarrer l'agent (si pas déjà actif)
eval $(ssh-agent -s)
# Ajouter une clé à l'agent (mémorise la passphrase)
ssh-add ~/.ssh/id_ed25519
ssh-add ~/.ssh/id_prod
# Lister les clés chargées
ssh-add -l
# Supprimer toutes les clés de l'agent
ssh-add -D
# Supprimer une clé spécifique
ssh-add -d ~/.ssh/id_ed25519
# Ajouter avec expiration (ex: 1h = 3600s)
ssh-add -t 3600 ~/.ssh/id_ed25519 |
| Agent Forwarding |
# Transmettre l'agent pour éviter de stocker des clés sur le serveur
ssh -A user@bastion
# Ou dans ~/.ssh/config :
# ForwardAgent yes
# Depuis le bastion, connexion à un serveur interne sans clé locale
ssh user@serveur-interne # utilise les clés de votre agent local |
| Sous Windows (Keychain / PowerShell) |
# PowerShell - activer l'agent OpenSSH
Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ed25519 |
| Sécurisation du Serveur SSH (sshd) |
| Fichier de configuration serveur |
sudo nano /etc/ssh/sshd_config
# Principale configuration de sécurité recommandée :
Port 2222 # Changer le port par défaut
ListenAddress 0.0.0.0
# Authentification
PermitRootLogin no # Interdire root
PasswordAuthentication no # Clés uniquement (recommandé !)
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PermitEmptyPasswords no
MaxAuthTries 3
LoginGraceTime 30
# Restrictions
AllowUsers deployer admin # Seuls ces users peuvent se connecter
# AllowGroups sshusers
# Sécurité des algorithmes
Protocol 2
Ciphers aes256-gcm@openssh.com,chacha20-poly1305@openssh.com
MACs hmac-sha2-512,hmac-sha2-256
KexAlgorithms curve25519-sha256,diffie-hellman-group14-sha256
# Keepalive et timeouts
ClientAliveInterval 300
ClientAliveCountMax 2
# Divers
X11Forwarding no
PrintLastLog yes
Banner /etc/issue.net |
| Redémarrer sshd après modif |
# Tester la config avant de redémarrer !
sudo sshd -t
sudo systemctl reload ssh
sudo systemctl restart ssh
sudo systemctl status ssh |
| Fail2ban (protection brute-force) |
sudo apt install fail2ban
# Config /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 2222
maxretry = 5
bantime = 3600
findtime = 600
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
sudo fail2ban-client status sshd
sudo fail2ban-client set sshd unbanip 1.2.3.4 |
| Astuces et Commandes Avancées |
| Multiplexage de connexions |
# Réutiliser une connexion existante (plus rapide)
# Dans ~/.ssh/config :
Host *
ControlMaster auto
ControlPath ~/.ssh/control/%r@%h:%p
ControlPersist 10m
mkdir -p ~/.ssh/control |
| Session tmux persistante |
# Lancer ou rattacher une session tmux
ssh user@serveur "tmux new -As masession"
# Dans tmux : Ctrl+B D pour détacher
# Plus tard :
ssh user@serveur "tmux attach -t masession" |
| Copier un fichier via SSH pipe |
# Copier un fichier sans SCP (pratique avec des hôtes relais)
ssh user@source "cat /var/log/app.log" > ./app.log
# Copier entre deux serveurs (via votre machine)
ssh user@source "cat /chemin/fichier" | ssh user@dest "cat > /chemin/fichier" |
| Montage SSHFS (système de fichiers SSH) |
sudo apt install sshfs
# Monter un répertoire distant
mkdir -p /mnt/monserveur
sshfs user@hostname:/var/www /mnt/monserveur
sshfs -p 2222 user@hostname:/home/user /mnt/monserveur
# Démonter
fusermount -u /mnt/monserveur
sudo umount /mnt/monserveur |
| Tester la latence SSH |
time ssh user@hostname exit |
| Lister les connexions actives |
who # sur le serveur w # avec les commandes en cours last # historique des connexions ss -tnp | grep :22 # connexions TCP sur le port 22 |
| Générer un fingerprint connu |
ssh-keyscan hostname 2>/dev/null | ssh-keygen -lf -
ssh-keyscan -H hostname >> ~/.ssh/known_hosts |