Outils pour utilisateurs

Outils du site


all:bibles:linux:reseau:ssh

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
all:bibles:linux:reseau:ssh [2024/07/23 11:45] omeylhocall:bibles:linux:reseau:ssh [2025/02/19 10:48] (Version actuelle) – [Lenteur de connexion] omeylhoc
Ligne 1: Ligne 1:
 +====== SSH ======
 +
 +----
 +
 +<note tip>Pour éviter de confirmer l'ajout du fingerprint au fichier known_hosts ajouter l'option :
 +  ssh <user>@<serveur> -o StrictHostKeyChecking=no
 +</note>
 +----
 +
 +===== Configuration =====
 +
 +==== Fichier de configuration générale ====
 +
 +<color #00a2e8>**/etc/ssh/sshd_config**</color>
 +
 +<code>
 +ListenAddress 192.168.0.50 N’écoute que depuis ces interfaces.
 +ListenAddress 192.168.1.50
 +LoginGraceTime 20 Si pas de connexion avant 20s le serveur se déconnecte
 +PermitRootLogin no Interdiction de se connecter en tant que root
 +PasswordAuthentication no Pas d’identification par mot de passe
 +UseDNS no Pas de reverse DNS lors de la connexion
 +# ajouter à la fin du fichier :
 +AllowUsers administrateur autoriser uniquement les utilisateurs listés
 +AddressFamily inet uniquement IPV4
 +</code>
 +
 +==== Fichier de configuration par serveur ====
 +
 +<color #00a2e8>**~/.ssh/config**</color>
 +
 +<code>
 +Host <nom_host>
 +        Hostname <adressIP>
 +        User <user>
 +        IdentityFile <chemin vers clef ssh privée au format openssh>
 +        Port <port>
 +</code>
 +
 +Avec la configuration de ce fichier on pourra remplacer la commande :
 +
 +<code bash>
 +ssh -i <chemin vers clef ssh privée au format openssh> <user>@<adresseIP> 
 +</code>
 +
 +par 
 +
 +<code bash>
 +ssh <nom_host> 
 +</code>
 +
 +<note tip>Le fichier de configuration sera pris en compte par la commande rsync.</note>
 +
 +==== Echange de clefs ====
 +
 +=== Génération de la clef ===
 +
 +<code bash>
 +ssh-keygen –t rsa [-C commentaire]
 +</code>
 +
 +Le paramètre -C permet l'ajout d'un commentaire en fin de ligne pour distinguer les clefs dans le fichier authorized_keys. Par défaut il s'agit souvent d'un username@hostname.
 +
 +=== Transfert de la clef ===
 +
 +Copier la clef générée (~/.ssh/id_rsa.pub) vers la machine à laquelle on veut donner l'accès (dans le fichier ~/.ssh/authorized_keys).
 +
 +<note warning>Le répertoire .ssh ne doit pas être accessible par un autre utilisateur. Si le répertoire est créé manuellement penser à corriger les droits d'accès par un chmod</note>
 +
 +Possibilité d'utiliser directement la commande :
 +
 +<code bash>
 +ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
 +</code>
 +
 +----
 +
 +[[all:bibles:linux:reseau:ssh|Haut de page]]
 +
 +===== Accès sftp resteint =====
 +
 +==== Création utilisateur ====
 +
 +<code bash>
 +sudo groupadd pproject
 +sudo useradd -g pproject -d /home/pproject -m -s /bin/false pproject
 +sudo passwd pproject
 +sudo chown root:pproject /home/pproject
 +sudo chmod 755 /home/pproject
 +sudo mkdir /home/pproject/11-Projects
 +chown pproject:pproject /home/pproject/11-Projects
 +chmod 755 /home/pproject/11-Projects
 +</code>
 +
 +==== Configuration SSH ====
 +
 +Dans le fichier <color #00a2e8>/etc/ssh/sshd_config</color> mettre en commentaire la ligne :
 +  #Subsystem sftp /usr/lib/openssh/sftp-server
 +
 +Ajouter à la <color #ed1c24>**fin**</color> du fichier :
 +
 +<code>
 +Subsystem sftp internal-sftp
 +Match User pproject
 +  ChrootDirectory %h
 +  ForceCommand internal-sftp
 +  X11Forwarding no
 +  AllowTCPForwarding no
 +</code>
 +
 +<note important>Tout ce qui suit la ligne Match jusqu'à la fin du fichier ou la prochaine occurrence de Match concerne cette restriction.</note>
 +
 +<note warning>ChrootDirectory : le répertoire doit appartenir à root:root avec droits 755. Le contenu appartient à l’utilisateur avec droits 775.</note>
 +
 +==== Dépannage ====
 +
 +En cas de problème consulter les erreurs dans le fichier <color #00a2e8>/var/log/auth.log</color>.
 +
 +----
 +
 +[[all:bibles:linux:reseau:ssh|Haut de page]]
 +
 +===== Tunnel SSH =====
 +
 +La machine A ne peut pas accéder directement à la machine C mais  accède à la machine B qui elle peut accéder à la machine C.
 +
 +==== Création du tunnel ====
 +
 +Sur la machine B créer un tunnel vers C en utilisant un port pour la redirection :
 +  ssh –L <Serveur B>:<port>:<Serveur C>:22 <user>@<Serveur C>
 +
 +Possibilité d'ajouter les options suivantes :
 +<code>
 +-N : pour ne pas passer de commande sur la machine cible.
 +-f : la commande est exécuté en tâche de fond et on récupère la main.
 +</code>
 +
 +<note tip>Si on lance en tâche de fond avec l'option -f il faudra killer le process pour fermer le tunnel</note>
 +
 +==== Maintien du tunnel ====
 +
 +  * **ServerAliveInterval** : durée en secondes après laquelle si aucune donnée n'a été reçue du serveur, un message sera envoyé au serveur. Par défaut 0 indiquant pas d'envoi de messages. Uniquement version 2 du protocole.
 +  * **ServerAliveCountMax** : valeur par défaut 3. Si ServerAliveInterval=15 et ServerAliveCountMax=3, si le serveur ne répond plus, il y aura déconnexion au bout de 45s. Uniquement version 2 du protocole.
 +
 +==== Exemples ====
 +
 +=== Redirige le port mySQL 3306 local sur le port 3306 de la machine distante ===
 +
 +<code bash>
 +#! /bin/bash
 +while : 
 +do
 +    echo "Ouverture du tunnel $(date)"
 +    ssh -L 3306:127.0.0.1:3306 -N -o ServerAliveInterval=5 -o ServerAliveCountMax=2 <user>@<IP address>
 +    echo "Fermeture du tunnel $(date)"
 +    sleep 1
 +done
 +</code>
 +
 +=== Tunnel inverse ===
 +
 +Imaginons que la machine B n'accède pas à la machine A mais la machine A accède à la machine B.
 +
 +  * Sur machine A : ouverture d'un tunnel depuis la machine B via le port 30022 distant sur le port 22 local
 +
 +<code bash>
 +ssh -fN -R 30022:localhost:22 <user B>@<machine B>
 +</code>
 +
 +  * Sur machine B : connexion en ssh sur machine A
 +
 +<code bash>
 +ssh -p 30022 <user A>@localhost
 +</code>
 +
 +==== Vérification ====
 +
 +On pourra vérifier l'ouverture du port par la commande netstat ou ss :
 +
 +<code bash>
 +netstat -tlna
 +ss -tlna
 +</code>
 +
 +==== Connexion via le tunnel ====
 +
 +Sur la machine A accéder à C au travers de B et du port choisi :
 +  ssh <Serveur B> -p <port>
 +
 +==== Tunnel ssh via Putty ====
 +
 +Dans cet exemple on va se connecter en http (port 80) sur un serveur distant en passant outre un éventuel firewall qui bloquerait le http.
 +
 +  * Dans la fenêtre putty renseigner les éléments habituels (IP, port, ...)
 +  * Aller dans la rubrique « Connection / SSH /Tunnels »
 +  * Renseigner « Source port » avec un port qui va être utilisé localement pour le rediriger (ex 8080)
 +  * Renseigner « Destination » avec l'adresse locale distance (exemple 127.0.0.1 ou une adresse privée accessible de la machine distante)
 +  * Ajouter derrière cette adresse le numéro de port (par exemple :80)
 +  * Cliquer sur le bouton « Add » puis lancer la session
 +
 +{{ :all:bibles:linux:reseau:putty_tunnel_ssh.jpg?400 |}}
 +
 +  * Le tunnel est ouvert il suffit de lancer un navigateur avec l'url http://localhost:8080
 +
 +<note important>L'utilisation des port jusqu'à 1024 nécessite des droits administrateur</note>
 +
 +----
 +
 +[[all:bibles:linux:reseau:ssh|Haut de page]]
 +
 +===== Montage réseau au travers de SSH =====
 +
 +==== Prérequis ====
 +
 +L'utilisateur doit appartenir au groupe fuse :
 +
 +<code bash>
 +adduser <utilisateur> fuse
 +</code>
 +
 +==== Utilisation ====
 +
 +=== Montage ===
 +
 +<code bash>
 +sshfs <@IP>:<chemin> <point de montage>
 +</code>
 +
 +=== Démontage ===
 +
 +<code bash>
 +fusermount -u <point de montage>
 +</code>
 +
 +----
 +
 +[[all:bibles:linux:reseau:ssh|Haut de page]]
 +
 +===== Putty à partir de Windows =====
 +
 +==== Connexion par clef ====
 +
 +=== Génération clef ===
 +
 +Génération de clef avec puttygen.exe. Sauvegarde clef privée et clef publique.
 +Copier/coller de la clef publique depuis la zone pour OpenSSH dans le fichier **~/.ssh/authorized_keys**
 +
 +=== Utilisation de la clef ===
 +
 +Change Settings…/Connection/Data remplir Auto-login username avec le nom d'utilisateur/
 +Change Settings…/Connection/SSH/Auth indiquer le chemin pour accéder au fichier de la clef privée clef.ppk
 +
 +Utilisation possible en ligne de commande avec psftp pour faire du transfert de fichiers sécurisé en sftp avec nom de session mémorisé :
 +  psftp <nom session>
 +
 +==== X11 forwarding ====
 +
 +Dans Connection/SSH/X11 cocher « Enable X11 forwarding » et mettre 127.0.0.1:0.0 pour « X display location ».
 +
 +Lancer X-Ming avec « Multiple windows » / « Start no client » puis « Suivant » et « Terminer ».
 +
 +----
 +
 +[[all:bibles:linux:reseau:ssh|Haut de page]]
 +
 +===== Convertir format clef =====
 +
 +==== Installation outils ====
 +
 +<code bash>
 +sudo apt install putty-tools
 +</code>
 +
 +==== Utilisation ====
 +
 +=== Putty vers openssh ===
 +
 +  * Générer la clef privée
 +
 +<code bash>
 +puttygen clef.ppk -O private-openssh -o id_dsa
 +</code>
 +
 +  * Générer la clef publique
 +
 +<code bash>
 +puttygen clef.ppk -O public-openssh -o id_dsa.pub
 +</code>
 +
 +=== openssh vers Putty ===
 +
 +<code bash>
 +puttygen id_rsa -o cleprive.ppk
 +</code>
 +
 +----
 +
 +[[all:bibles:linux:reseau:ssh|Haut de page]]
 +
 +===== Dépannage =====
 +
 +==== Debug ====
 +
 +=== Côté client ===
 +
 +Pour obtenir plus d'information ajouter l'option verbose :
 +  ssh -v <@IP>
 +
 +=== Côté serveur ===
 +
 +Ajouter la ligne suivante dans le fichier **/etc/ssh/sshd_config** 
 +
 +  LogLevel VERBOSE
 +
 +<note tip>Les valeurs possibles sont QUIET, FATAL, ERROR, INFO, VERBOSE, DEBUG, DEBUG1, DEBUG2, and DEBUG3.</note>
 +
 +Les informations sont dans le fichier de log :
 +  tail -f /var/log/secure ⇒ Redhat/CentOS
 +  tail -f /var/log/syslog ⇒ Debian/Ubuntu
 +
 +==== L'identification par clef ne fonctionne pas ====
 +
 +=== Restriction d'accès aux clefs ===
 +
 +Vérifier que le droits d'accès au répertoire ~/.ssh sont bien restreints au seul propriétaire. Corriger par la commande :
 +  chmod 0700 ~/.ssh
 +
 +=== Restriction à la console ===
 +
 +Vérifier l'absence de la ligne suivante dans le fichier **/etc/default/login**
 +
 +  CONSOLE=/dev/ 
 +
 +sinon l'accès ne peut se faire que depuis la console système.
 +
 +=== ping ne fonctionne pas ===
 +
 +Si même le ping ne fonctionne pas, vérifier les fichiers **/etc/hosts**, **/etc/ethers** et **dhcpd.conf** qui peuvent contenir des informations contradictoires et, dans le doute, interdire la connexion par sécurité.
 +
 +=== En désespoir de cause ===
 +
 +Supprimer le répertoire ~/.ssh et faire un ssh-keygen pour laisser le système créer le répertoire avec les droits restreints.
 +
 +==== Lenteur de connexion ====
 +
 +Lors de connexion le serveur ssh distant lance une résolution DNS inverse qui peut être longue (surtout si aucun serveur DNS n'est accessible). \\
 +Pour gagner du temps il est possible de désactiver cette procédure en ajoutant la ligne suivante dans le fichier **/etc/ssh/sshd_config** :
 +
 +<code bash>
 +UseDNS no
 +</code>
 +
 +Redémarrer le service ssh.
 +
 +Si les symptômes persistent ajouter également la ligne suivante :
 +
 +<code bash>
 +GSSAPIAuthentication no
 +</code>
 +
 +ou bien en ligne de commande
 +
 +<code bash>
 +ssh -o GSSAPIAuthentication=no user@serveur
 +</code>
 +
 +==== no matching host key type found. Their offer: ssh-dss ====
 +
 +=== Connexion sur OS6850 ===
 +
 +Ajouter les options suivantes :
 +  ssh -o HostKeyAlgorithms=+ssh-dss -m hmac-md5 <@IP>
 +
 +=== Connexion sur OA C7000 ===
 +
 +Créer un fichier **~/.ssh/config**
 +
 +<code>
 +Host 10.35.132.9
 +        HostkeyAlgorithms +ssh-dss
 +
 +</code>
 +
 +==== Connexion aléatoire ====
 +
 +=== Problème ===
 +
 +La connexion ssh fonctionne de façon aléatoire en Wifi (voir pas du tout) alors que cela fonctionne en filaire. Par ailleurs les requêtes http passent sans problème en Wifi. Problème rencontré sur Raspberry Pi.
 +
 +=== Désactiver la mise en veille du Wifi ===
 +
 +Interroger l'interface sans fil
 +
 +<code bash>
 +iwconfig
 +</code>
 +
 +Vérifier la ligne Power Management (on ou off) ou interroger directement :
 +
 +<code bash>
 +iw wlan0 get power_save
 +</code>
 +
 +Désactiver la mise en veille :
 +
 +<code bash>
 +iw wlan0 set power_save off
 +</code>
 +
 +A positionner éventuellement dans le fichier <color #00a2e8>/etc/rc.local</color>.
 +
 +=== Baisser la mtu sur l'interface ===
 +
 +Essayer de baisser la mtu sur l'interface :
 +
 +<code bash>
 +ifconfig wlan0 mtu 1200
 +</code>
 +
 +A positionner éventuellement dans le fichier <color #00a2e8>/etc/rc.local</color>.
 +
 +=== Qualité de service ===
 +
 +Ajouter la ligne suivante dans le fichier <color #00a2e8>/etc/ssh/sshd_config</color>
 +
 +<code bash>
 +IPQoS cs0 cs0
 +</code>
 +
 +puis redémarrer le service :
 +
 +<code bash>
 +systemctl restart sshd
 +</code>
 +
 +==== Déconnexion ====
 +
 +En cas de déconnexion trop rapide il est possible de customiser le délai.
 +
 +=== sshd_config ===
 +
 +Dans le fichier <color #00a2e8>/etc/ssh/sshd_config</color> modifier les 2 variables suivantes :
 +
 +<code bash>
 +ClientAliveInterval 1200
 +ClientAliveCountMax 3
 +</code>
 +
 +La valeur du délai d'expiration sera de 1200 secondes * 3 soit 1 h. On peut obtenir le même résultat en spécifiant le paramètre ClientAliveInterval seul :
 +
 +<code bash>
 +ClientAliveInterval 3600
 +#ClientAliveCountMax 3
 +</code>
 +
 +=== Putty ===
 +
 +Avec Putty il est également possible de spécifier le paramètre « Seconds beetween keepalives (0 to to turn off) » dans la catégorie « Connection » pour maintenir la session ouverte.
 +
 +{{:all:bibles:linux:reseau:ssh.png?400|}}
 +
 +==== Pseudo-terminal will not be allocated because stdin is not a terminal ====
 +
 +Solution : essayer ssh avec l'option -t
 +
 +----
 +
 +[[all:bibles:linux:reseau:ssh|Haut de page]]
 +