User Tools

Site Tools


informatique:logiciels:ssh

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
informatique:logiciels:ssh [2021/09/29 14:17] – [Afficher la liste des paramètres] pteuinformatique:logiciels:ssh [2024/11/26 09:10] (current) – [SSH Keepalive] pteu
Line 99: Line 99:
  
  
 +=====Gérer des clés=====
 +
 +Pour générer une paire de clés sécurisées utiliser les valeurs par défaut :
 +<code bash>
 +$ ssh-keygen
 +</code>
 +Actuellement (en 2021) il est raisonnable d'utiliser au moins du chiffrement RSA 4096 bits (''-t rsa -b 4096''), et dans l'idéal du ED25519 (''-t ed25519'') qui utilise une variante de chiffrement par courbes elliptiques.
 +
 +Pour formater une clé publique au format RFC 4716 :
 +<code bash>
 +$ ssh-keygen -ef ~/.ssh/id_rsa -mRFC4716
 +---- BEGIN SSH2 PUBLIC KEY ----
 +Comment: "4096-bit RSA, converted by dude@technodrome from OpenSSH"
 +AAAAB3NzaC1yc2EAAAADAQABAAABAQCzU4exWqu4tsgWIJleq1AJ98cGHswD80cphWYOas
 +spBoOPgdv
 +[blabla sur quelques lignes]
 +15ukAsdfsdgg3h5f4h6dfh3fj84tK1
 +---- END SSH2 PUBLIC KEY ----
 +</code>
 +
 +Alternatives : convertir au format PEM ''-mPEM'' ou PKCS8 ''-mPKCS8''.
  
 ===== Se connecter sans mdp ===== ===== Se connecter sans mdp =====
Line 188: Line 209:
 ===== Transfert de fichier avec SCP ===== ===== Transfert de fichier avec SCP =====
  
-**Ssh CoPy** (SCP) est une commande qui permet de transférer des fichiers par une connexion SSH. +[[informatique:linux:commandes_linux#scp|commandes_linux:scp]]
-Sous Windows il existe les programmes ''pscp'' (en ligne de commande) et l'excellent [[http://fr.wikipedia.org/wiki/WinSCP|WinSCP]]. +
-Sous Linux, il est possible d'utiliser [[http://fr.wikipedia.org/wiki/GFTP|gFTP]] si l'on veut un interface graphique. +
-Sous Mac j'utilise [[http://rsug.itd.umich.edu/software/fugu/|Fugu]]+
- +
-La syntaxe est la suivante : +
-  scp fichier_local user@serveur.com:/path +
-Il faut noter qu'un //path// relatif (sans le "/") est par défaut la home de l'utilisateur sous lequel on s'est connecté (voir 1er exemple). +
- +
-exemple 1 : uploader //test.txt// (qui est un fichier local) dans la home de l'utilisateur toto sur //serveur.com//+
-  scp test.txt toto@serveur.com: +
- +
-exemple 2 : télécharger dans le répertoire courant (.) //test.txt//, qui se trouve sur //serveur.com// +
-  scp toto@serveur.com:test.txt . +
- +
-exemple 3 : uploader l'intégralité (récursivement avec //-r//) du sous-répertoire test du répertoire courant vers le sous répertoire incoming de la home de l'utilisateur toto de la machine serveur.com : +
-  scp -r test toto@serveur.com:incoming +
- +
-Les paramètres disponibles sont : +
-  * ''-P port'' pour préciser un port spécifique +
-  * ''-r'' pour les transfert récursifs (copier le contenu d'un dossier par exemple) +
- +
 =====Tunnels SSH===== =====Tunnels SSH=====
  
Line 260: Line 259:
  
 Sur le serveur SSH, dans le fichier ''/etc/ssh/sshd_config'', vérifier la présence de la directive Sur le serveur SSH, dans le fichier ''/etc/ssh/sshd_config'', vérifier la présence de la directive
-  X11Forwarding yes+<code bash> 
 +X11Forwarding yes 
 +</code>
  
 Sur le client, qui doit être muni d'un serveur X : Sur le client, qui doit être muni d'un serveur X :
-  ssh -X [-C] serveur+<code bash> 
 +ssh -X [-C] serveur 
 +</code>
 -X permet l'export display et -C (facultatif) permet d'activer la compression des données (permet un gain de bande passante au détriment de la consommation CPU). -X permet l'export display et -C (facultatif) permet d'activer la compression des données (permet un gain de bande passante au détriment de la consommation CPU).
  
Line 270: Line 273:
 Pour les postes clients sous Windows, on peut passer par l'installation de Cygwin avec un serveur X ([[http://cygwin.com/ Cygwin]] ou [[http://x.cygwin.com/ Cygwin/X]]). Pour les postes clients sous Windows, on peut passer par l'installation de Cygwin avec un serveur X ([[http://cygwin.com/ Cygwin]] ou [[http://x.cygwin.com/ Cygwin/X]]).
 Dans le cas de Cygwin/X : on le lance, on lance le serveur X Dans le cas de Cygwin/X : on le lance, on lance le serveur X
-  startxwin.sh+<code bash> 
 +startxwin.sh 
 +</code>
  
 Cela lance un xterm (et une icone dans la taskbar). Ensuite on procède comme normalement : Cela lance un xterm (et une icone dans la taskbar). Ensuite on procède comme normalement :
-  ssh -X serveur+<code bash> 
 +ssh -X serveur 
 +</code>
  
-(il parait que ça marche aussi avec putty, en activant le //X11 Forwarding//, mais ça ne marche pas chez moi : normal il n'y a pas de serveur X lancé sans Cygwin !..)+====Après un su/sudo====
  
 +Le X11 ne passe pas les ''su'' et ''sudo'' ; pour créer la continuité de l'affichage, il faut :
 +<code bash>
 +# afficher le DISPLAY avant le sudo
 +echo $DISPLAY
 + localhost:10.0
  
 +# afficher les xauth et copier la ligne qui correspond à notre DISPLAY (ici le ":10")
 +xauth list
 +[..]
 +serveur/unix:10  MIT-MAGIC-COOKIE-1  58ff4f8de36bdddb68ad47bc0e29ac4d
 +
 +# ajouter l'xauth dans la session du su/sudo
 +sudo -i
 +xauth add serveur/unix:10  MIT-MAGIC-COOKIE-1  58ff4f8de36bdddb68ad47bc0e29ac4d
 +
 +xclock&
 +</code>
 =====Exécuter un script local sur le serveur distant===== =====Exécuter un script local sur le serveur distant=====
  
Line 303: Line 326:
 </code> </code>
  
-=====Lister les options du sshd=====+=====Lister les options du ssh=====
  
 Pour lister les paramètres effectifs avec lesquels se lance le démon **sshd** (c'est utile notamment pour voir la valeur des paramètres non spécifiés dans le fichier de configuration ''/etc/ssh/sshd_config'') : Pour lister les paramètres effectifs avec lesquels se lance le démon **sshd** (c'est utile notamment pour voir la valeur des paramètres non spécifiés dans le fichier de configuration ''/etc/ssh/sshd_config'') :
Line 310: Line 333:
 </code> </code>
  
 +Côté client, on peut afficher les paramètres courants avec l'option ''-G'' :
 +<code bash>
 +ssh -G <serveur>
 +</code>
 =====Mode debug/verbose===== =====Mode debug/verbose=====
  
Line 349: Line 376:
 Lorsqu'une connexion telnet est bloquée, on peut taper une séquence d'échappement qui permet de sortir de telnet et récupérer la main sur son terminal : ''Ctrl °'' (le ''°'' se saisit avec ''AltGr'' + '')'' ) (souvent suivi de ''quit''). Lorsqu'une connexion telnet est bloquée, on peut taper une séquence d'échappement qui permet de sortir de telnet et récupérer la main sur son terminal : ''Ctrl °'' (le ''°'' se saisit avec ''AltGr'' + '')'' ) (souvent suivi de ''quit'').
  
-La même avec le client SSH est : ''<enter>'' ''~'' ''.'' ; elle permet de quitter le client SSH et rendre la main avec le terminal.+La même avec le client SSH est : ''~.'' (''<Enter>~ + .''; elle permet de fermer la connexion et de rendre la main sur le terminal.
  
 =====Saisir un mot de passe via SSH===== =====Saisir un mot de passe via SSH=====
Line 394: Line 421:
 =====Connexion SSH via webproxy===== =====Connexion SSH via webproxy=====
  
-Pour se connecter en SSH à travers un proxy web, disons "proxy.corp" port "80" pour l'exemple, il faut ajouter l'option **ProxyCommand** à la commande de connexion : ''ssh -o "ProxyCommand=nc -X connect -x proxy.corp:80 %h %p" ssh-user@ssh-server''. Pour ne pas se fatiguer à le préciser à chaque fois, on peut l'ajouter à son ssh config :+Pour se connecter en SSH à travers un proxy web, disons "proxy.corp" port "80" pour l'exemple, il faut utiliser l'option **ProxyCommand** : ''ssh -o "ProxyCommand=nc -X connect -x proxy.corp:80 %h %p" ssh-user@ssh-server''. Pour ne pas se fatiguer à le préciser à chaque fois, on peut l'ajouter à son ssh config :
 <code bash ~/.ssh/config> <code bash ~/.ssh/config>
 Host ssh-server Host ssh-server
Line 403: Line 430:
  
 Depuis Windows il est plus facile d'utiliser le petit [[informatique:logiciels:putty|Putty]], en renseignant le menu Connection/Proxy (remplir le Proxy hostname et Port), il fera le taf tout seul. Depuis Windows il est plus facile d'utiliser le petit [[informatique:logiciels:putty|Putty]], en renseignant le menu Connection/Proxy (remplir le Proxy hostname et Port), il fera le taf tout seul.
 +
 +<WRAP center round important 80%>
 +Certaines versions de netcat (nc) ne possèdent pas l'option **-X** et provoquent l'erreur : ''/bin/nc: invalid option <nowiki>--</nowiki> 'X' ''
 +C'est le cas sous CentOS/Rocky Linux par exemple. On peut le contourner avec d'autres options :
 +<code bash>
 +ProxyCommand nc --proxy-type http --proxy proxy.corp:80 %h %p
 +</code>
 +</WRAP>
 +
  
 =====Connexion SSH par rebond===== =====Connexion SSH par rebond=====
Line 497: Line 533:
 </code> </code>
  
-ou, plus pérenne, dans le fichier de préférences du client SSH :+Ou, plus pérenne, dans le fichier de préférences du client SSH : 
 +<code bash ~/.ssh/config> 
 +Host upgrayedd 
 +  KexAlgorithms +diffie-hellman-group1-sha1 
 +</code> 
 + 
 +Dans mon cas j'avais également ce paramètre qui bloquait : 
 +<code bash> 
 +ssh admin@upgrayedd 
 +Unable to negotiate with 10.0.2.240 port 22: no matching host key type found. Their offer: ssh-dss 
 +</code> 
 <code bash ~/.ssh/config> <code bash ~/.ssh/config>
 Host upgrayedd Host upgrayedd
   KexAlgorithms +diffie-hellman-group1-sha1   KexAlgorithms +diffie-hellman-group1-sha1
-  # dans mon cas je doit aussi ajouter ça : 
   HostKeyAlgorithms +ssh-dss   HostKeyAlgorithms +ssh-dss
 </code> </code>
Line 520: Line 566:
 <code bash> <code bash>
 ssh -1 vieille-croute ssh -1 vieille-croute
 +</code>
 +
 +=====Connexion en arrière-plan=====
 +
 +Dans certains cas il peut être utile de lancer la connexion SSH en background, ce qui permet au terminal de rendre la main tout en conservant la connexion active. Cela se fait avec l'option ''-f'' :
 +<code bash>
 +ssh -f host xterm
 +</code>
 +
 +Pour faire une redirection de port, il faut ajouter ''-N'' pour préciser que l'on n'exécute aucune commande distante :
 +<code bash>
 +# sans -N
 +ssh -f -L 5901:127.0.0.1:5901 <host>
 + Cannot fork into background without a command to execute.
 +
 +ssh -f -N -L 5901:127.0.0.1:5901 <server>
 +</code>
 +
 +Et si l'on veut fermer la connexion après utilisation ? On ne peut pas, fallait réfléchir avant.
 +
 +Bon, en fait, il suffit de killer le process SSH qui écoute sur le port redirigé localement, sur le client :
 +<code bash>
 +kill -9 $(ss -lnpt | awk ' $4 ~ /:5901$/ {sub(/.*pid=/,"",$6); sub(/,.*$/,"",$6); print $6}')''
 +</code>
 +
 +Mais openssh permet de faire les choses proprement, de (au moins) 2 manières :
 +  - ne pas utiliser ''-N'', et lancer la commande ''sleep 60''. Cela a pour effet de maintenir le tunnel ouvert 60 secondes, et si aucune connexion ne l'utilise au bout de cette durée, de fermer le tunnel. En revanche, si une appli utilise le tunnel (par exemple un ''vncviewer127.0.0.1:5901:1''), alors le client SSH attend la fermeture de cette dernière (= la libération du tunnel) puis ferme le tunnel.
 +  - utiliser une connexion SSH en mode "master", qui permet d'utiliser un socket (fichier) de contrôle pour lui envoyer une commande de fermeture de connexion (exit) :
 +<code bash>
 +ssh -f -N -M -S <path-to-socket> -L 5901:127.0.0.1:5901 <server>
 +# (utilisation de la connexion...) puis fermeture :
 +ssh -S <path-to-socket> -O exit <server>
 +</code>
 +
 +source: [[https://unix.stackexchange.com/questions/83806/how-to-kill-ssh-session-that-was-started-with-the-f-option-run-in-background|How to kill SSH session that was started with the -f option (run in background) ?]] sur StackExchange
 +
 +
 +=====Connexion forcée par mot de passe=====
 +
 +Pour forcer l'authentification par mot de passe (afin d'éviter un "failed login" avec une mauvaise clé publique par exemple), lancer le client SSH avec l'option ''PreferredAuthentications=password'', afin de privilégier l'authentification par mot de passe (par défaut l'ordre de préférence est "gssapi-with-mic, hostbased, publickey, keyboard-interactive, password") ; il faut vérifier que cette option ne soit pas désactivée sur le serveur.
 +
 +On peut l'agrémenter de ''PubkeyAuthentication=no'' afin de désactiver l'auth par clé publique (idem pour les autres modes d'authentification).
 +
 +<code bash>
 +ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no <SERVER>
 +</code>
 +
 +Ces options peuvent se positionner dans le fichier de conf : **~/.ssh/config** pour ne pas avoir à les saisir à chaque fois.
 +
 +=====Comment transmettre un quote en SSH=====
 +
 +C'est toujours une galère en informatique pour utiliser les caractères interprétés, que ça soit les parenthèses ''( )'', les guillemets ''"'' ou les apostrophes ''<nowiki>'</nowiki>''.
 +
 +Pour transmettre une apostrophe (ou simple quote en anglais) dans une commande SSH, on ne peut pas juste l'échapper (la préfixer par un ''\'') :
 +<code bash>
 +ssh serveur ls /tmp/fic\'.test
 +
 +bash: -c: ligne 1: fin de fichier (EOF) prématurée lors de la recherche du « ' » correspondant
 +</code>
 +
 +Il faut utiliser :
 +  * soit un triple backslash (on "double échappe" le quote) : ''<nowiki>\'</nowiki>'' -> ''<nowiki>\\\'</nowiki>''
 +  * un [[https://fr.wikipedia.org/wiki/Here_document|heredoc]], plus lisible (surtout quand il y a beaucoup de caractères spéciaux) :
 +<code bash>
 +ssh serveur <<END
 +ls /tmp/fic\'.test
 +END
 +
 +/tmp/fic'.test
 +</code>
 +
 +=====Notification sur Signal d'un login SSH=====
 +
 +Pour recevoir une notification lorsqu'un utilisateur se log en SSH sur un serveur, [[https://aussedatlo.me/posts/14-ssh-signal-notifications|voici un article]] qui décrit la mise en place de :
 +  * une ligne de configuration dans **pam.d** pour catcher l'événement login
 +  * un script générant le message de notification et l'appel REST vers...
 +  * un conteneur docker : [[https://github.com/bbernhard/signal-cli-rest-api|bbernhard/signal-cli-rest-api]] servant de passerelle vers Signal via une API REST
 +Ce dernier nécessite l’appairage avec un compte Signal existant.
 +
 +NB : j'ai rencontré des erreurs avec la version **signal-cli-rest-api:latest** actuelle (17/09/2024) de l'image docker, aussi [[https://github.com/bbernhard/signal-cli-rest-api/issues/564|sur recommandation de l'auteur bbernhard]] j'ai utilisé la version **0.167-dev**, qui génère une erreur mais envoie quand même le message ! En personnalisant également le réseau du conteneur, ça donne ce compose :
 +<code yaml docker-compose.yml>
 +version: "3"
 +services:
 +  signal-cli-rest-api:
 +#    image: bbernhard/signal-cli-rest-api:latest
 +    image: bbernhard/signal-cli-rest-api:0.167-dev
 +    container_name: signal-cli-rest-api
 +    networks:
 +      - br-sig
 +    environment:
 +      - MODE=native #supported modes: json-rpc, native, normal (by speed order)
 +    ports:
 +      - "8081:8080" #map docker port 8081 to host port 8080.
 +    volumes:
 +      - "../../data/signal-cli-rest-api:/home/.local/share/signal-cli"
 +
 +networks:
 +  br-sig:
 +    external: true
 +</code>
 +
 +Ce script basique :
 +<code bash /root/login.sh>
 +#!/bin/sh
 +# envoyer une notif signal lors d'un login
 +NUMBER="+336xxxxxxxx"
 +URL=http://localhost:8081
 +MESSAGE="New connexion by ${PAM_USER} on $(hostname -s)\nDate: $(date +"%d/%m/%Y %H:%M:%S"), Ip: ${PAM_RHOST}"
 +
 +if [ "$PAM_TYPE" != "close_session" ]; then
 +        curl -X POST -H "Content-Type: application/json" "${URL}/v2/send" \
 +                -d "{\"message\": \"${MESSAGE}\", \"number\": \"${NUMBER}\", \"recipients\": [ \"${NUMBER}\" ]}"&
 +fi
 +</code>
 +
 +Et ce "hook" (ajouter le ligne à la fin du fichier **/etc/pam.d/sshd**) :
 +<code bash /etc/pam.d/sshd>
 +session optional pam_exec.so seteuid /root/login.sh
 +</code>
 +
 +=====SSH Keepalive=====
 +
 +Afin d'éviter les coupures de connexion SSH, il est possible de définir des "keepalive", des messages vides envoyés à intervalles réguliers dans le but de détecter une coupure de connexion mais aussi d'éviter à celle-ci de tomber en timeout pour inactivité. On peut définir l'intervalle d'envoi de ces messages (AliveInterval) ainsi que le nombre de message que l'on peut perdre avant de considérer que la connexion est tombée (AliveCountMax).
 +
 +Cela peut se configurer côté client, dans le fichier **~/.ssh/config** pour une portée discrète (uniquement la connexion vers le serveur "serveur-ssh" ou dans le fichier **/etc/ssh/ssh_config** pour une portée globale (cela affectera toutes les connexions SSH) :
 +<code bash ~/.ssh/config>
 +Host serveur-ssh
 +   ServerAliveInterval 300
 +   ServerAliveCountMax 2
 +</code>
 +
 +Comme d'hab les paramètres peuvent aussi se définir au moment de la commande SSH avec l'option ''-o'' :
 +<code bash>
 +ssh -o ServerAliveInterval=300 -o ServerAliveCountMax=2 serveur-ssh   
 +</code>
 +
 +Côté serveur, cela se définit dans le fichier **/etc/ssh/sshd_config** ; c'est assez ressemblant, et cela affectera tous les clients :
 +<code bash /etc/ssh/sshd_config>
 +ClientAliveInterval 300
 +ClientAliveCountMax 2
 </code> </code>
 ====== Liens ====== ====== Liens ======
  
 [[http://people.via.ecp.fr/~alexis/formation-linux/export-display.html|formation Linux]] [[http://people.via.ecp.fr/~alexis/formation-linux/export-display.html|formation Linux]]
informatique/logiciels/ssh.1632925025.txt.gz · Last modified: 2021/09/29 14:17 by pteu