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 [2023/09/08 09:49] – [Connexion forcée par mot de passe] pteuinformatique:logiciels:ssh [2024/11/26 09:10] (current) – [SSH Keepalive] pteu
Line 209: 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 348: 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 355: 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 439: 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 448: 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 614: Line 605:
 =====Connexion forcée par mot de passe===== =====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. :+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> <code bash>
 ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no <SERVER> 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.1694166562.txt.gz · Last modified: 2023/09/08 09:49 by pteu