SSH#
Le Fichier de configuration est ~/.ssh/config
Le dossier ~/.ssh/ dois avoir les droit 0755
Les clees priver doivent etre en 0600
# les commentaire sont preceder de ce carracter
Include # en specifiant le path on peut mettre des includes
ForwardAgent yes|no # a specifier si on veut forward emmener notre agent ssh avec nous
# fonctionne egalement quand on utilise gpg comme agent ssh
# on peut le remplacer par -A
AddKeysToAgent yes|no # a specifier si on veut ajouter la clee qu'on utilise dans l'agent
IdentityFile <path> # a specifier pour utiliser une clees en particulier
# permet d'utiliser un clee qui n'est pas dans ~/.ssh/
# souvent utiliser avec l'option precedente
# peut etre utiliser avec des clee public aussi, avec une yubikey par exemple
IdentitiesOnly yes|no # a utiliser quand on utilise l'option precedente
StrictHostKeyChecking yes|no # a utiliser quand on veut accepter des remote host key who differ from local know_host
UserKnownHostsFile <path> # permet de specifier le path du fichier de host name /dev/null par exemple
User <name> # permet de specifier le nom d'utilisateur <name>@127.0.0.1
PasswordAuthentication yes|no # permet d'autoriser ou interdire l'utilisation de password
PreferredAuthentications <method> # permet de specifier la method d'auth a prefere
# ex: password, publickey...
Host <hostname or fqdn> # permet de specifier les conf a utiliser pour un host ou group d'host specifique
# ex:
# - ppd1-*, tout les host qui commence par 'ppd1-'
# - !ppd1-admin, ne pas utiliser pour ppd1-admin
# - ...
ProxyJump <ip or host or fqdn> # sourvent utiliser avec l'option precedente
# permet de dire que pour le host specifier on dois avant passer par un autre host
# on peut le remplacer par -J
HostName <ip or fqdn> # Permet de donner une address pour un host qui na pas de dns racrocher
ControlMaster yes|no|auto # permet de partager une seule connexion pour toutes les sessions vers un host
# 'auto' cree la master si elle n'existe pas, la reutilise sinon
ControlPath <path> # socket de la connexion partagee, indispensable pour piloter la session avec -O
# ex: ~/.ssh/cm-%r@%h:%p
ControlPersist yes|no|<time> # garde la master ouverte en arriere plan apres la fin de la session
# ex: 10m, la connexion reste dispo 10 minutes
Pour plus de documentation vous pouvez utiliser man ssh_config 5
Tunnels#
ssh -L [bind_address:]port:host:hostport # local forwarding
# le port est ouvert sur le client
# le traffic est forward par le serveur sshd vers host:hostport
ssh -R [bind_address:]port:host:hostport # remote forwarding
# le port est ouvert sur le serveur sshd
# le traffic est forward par le client vers host:hostport
# necessite 'GatewayPorts yes' dans sshd_config pour ecouter sur 0.0.0.0
ssh -D [bind_address:]port # dynamic forwarding, proxy SOCKS
ssh -N # pas de commande distante, utile pour un tunnel seul
ssh -f # passe en arriere plan
Local forwarding (-L) et remote forwarding (-R), directement et via un rebond.#
Source : @iximiuz
Controler une session passee en background#
Une session lancee avec -f n’a plus de terminal, les sequences d’echappement ne sont donc plus
disponibles. Pour garder la main il faut une connexion partagee, avec une socket de controle declaree
soit dans le fichier de config (ControlMaster + ControlPath), soit sur la ligne de commande
(-M -S <path>). C’est ensuite cette socket, et non le host, qui sert a envoyer les commandes.
# depuis une session interactive, sequences d'echappement (en debut de ligne)
~? # affiche la liste des sequences disponibles
~. # ferme la session
~& # passe la session en arriere plan
~C # ouvre une ligne de commande ssh>
# permet d'ajouter ou retirer un tunnel a chaud
# ex: -L 8080:localhost:80, -KL 8080
# on cree la master en donnant nous meme le chemin de la socket de controle
ssh -M -S <path> -fN <host> # -M force la session a etre master
# -S <path> place la socket ou on veut, sans passer par ControlPath
# ex: ssh -M -S /tmp/cm-prod -fN -L 8080:localhost:80 user@server
# ensuite on pilote la session via la socket, plus via le host
ssh -S <path> -O check dummy # verifie que la master est vivante et donne son pid
ssh -S <path> -O forward -L 8080:localhost:80 dummy # ajoute un tunnel a la session existante
ssh -S <path> -O cancel -L 8080:localhost:80 dummy # retire ce tunnel
ssh -S <path> -O stop dummy # n'accepte plus de nouvelle session, les existantes continuent
ssh -S <path> -O exit dummy # ferme la master et toutes les sessions qui en dependent
# un argument host reste obligatoire dans la syntaxe mais il est ignore quand -S est donne
# n'importe quelle valeur fait l'affaire, 'dummy' ici, aucune resolution dns n'est faite
# si on passe par ControlPath plutot que -S, la socket est le chemin apres expansion
# ControlPath ~/.ssh/cm-%r@%h:%p -> ~/.ssh/cm-user@server:22
# sans connexion partagee, il reste le pid
ps -ef | grep 'ssh -f' # ou: lsof -i :8080
kill <pid>