informatique:logiciels:ssh
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
informatique:logiciels:ssh [2009/01/30 18:20] – édition externe 127.0.0.1 | informatique:logiciels:ssh [2021/12/31 12:20] – [Gérer des clés] pteu | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | {{tag> | ||
- | |||
====== SSH ====== | ====== SSH ====== | ||
//recueil d' | //recueil d' | ||
Line 8: | Line 6: | ||
- | ===== Configuration du serveur ===== | + | ====== Configuration du serveur |
- | | + | <code bash> |
+ | aptitude install openssh-server | ||
+ | </ | ||
| | ||
Le fichier de configuration ''/ | Le fichier de configuration ''/ | ||
- | | + | <code bash> |
- | PermitRootLogin no | + | # désactivation du login pour le compte root |
- | # limiter les connexions au seuls utilisateurs toto, et titi depuis la machine 1.2.3.4 | + | PermitRootLogin no |
- | AllowUsers toto titi@1.2.3.4 | + | # limiter les connexions au seuls utilisateurs toto, et titi depuis la machine 1.2.3.4 |
- | + | AllowUsers toto titi@1.2.3.4 | |
- | # on n' | + | |
- | AllowGroup ssh_users | + | |
- | + | ||
- | # on veut que le serveur écoute sur un port supplémentaire | + | |
- | Port 22 2222 | + | |
- | + | ||
- | # Limiter les tentatives de login à 5 | + | |
- | MaxAuthTries 5 | + | |
- | + | ||
- | # bon, là ça rentre en conflit avec la directive ci-dessus mais c'est pour l' | + | |
- | # 10 tentatives de connexion simultanées max ; puis 30% de refus : puis 100% à la 15e | + | |
- | MaxStartups 10:30:15 | + | |
+ | # on n' | ||
+ | AllowGroup ssh_users | ||
- | On (re)lance | + | # on veut que le serveur écoute sur un port supplémentaire |
- | / | + | Port 22 2222 |
+ | # Limiter les tentatives de login à 5 | ||
+ | MaxAuthTries 5 | ||
- | ==== Mep d'une bannière ==== | + | # bon, là ça rentre en conflit avec la directive ci-dessus mais c'est pour l' |
+ | # 10 tentatives de connexion simultanées max ; puis 30% de refus : puis 100% à la 15e | ||
+ | MaxStartups 10:30:15 | ||
+ | |||
+ | # pour partager une redirection de port avec n' | ||
+ | # en gros la redirection se fait sur 0.0.0.0:x et non plus 127.0.0.1:x donc elle redirige tous | ||
+ | # les paquets arrivant sur son port x, pas seulement ceux en provenance de ma connexion SSH | ||
+ | GatewayPorts yes | ||
+ | </ | ||
+ | |||
+ | On (re)lance le service : | ||
+ | <code bash> | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ===== Mep d'une bannière | ||
Par défaut la bannière qui est utilisée est le contenu du fichier ''/ | Par défaut la bannière qui est utilisée est le contenu du fichier ''/ | ||
- | | + | <code bash> |
+ | banner <fichier> | ||
+ | </code> | ||
dans le fichier de conf. | dans le fichier de conf. | ||
- | ===== Utilisation du client ===== | + | =====Limitation d'une paire de clé===== |
+ | |||
+ | Pour ne permettre à un utilisateur s' | ||
+ | <code bash> | ||
+ | command=" | ||
+ | </ | ||
+ | |||
+ | Dans le cas précédent, | ||
+ | |||
+ | =====Afficher la liste des paramètres===== | ||
+ | |||
+ | Ceci permet d' | ||
+ | <code bash> | ||
+ | sshd -T -C user=guest | ||
+ | </ | ||
+ | ====== Utilisation du client | ||
On l' | On l' | ||
- | | + | <code bash> |
+ | ssh -p < | ||
+ | </ | ||
+ | |||
+ | Si c'est la première connexion SSH depuis ce client vers ce serveur, il vous demande si le // | ||
+ | |||
+ | |||
+ | =====Fichier ~/ | ||
+ | |||
+ | Pour éviter d' | ||
+ | |||
+ | Par exemple pour simplifier la commande : '' | ||
+ | <code bash> | ||
+ | cat ~/ | ||
+ | Host ex | ||
+ | Hostname exemple.fr | ||
+ | User toto | ||
+ | Port 2222 | ||
+ | DynamicForward 1025 | ||
+ | </ | ||
+ | |||
+ | Il suffit maintenant de saisir : | ||
+ | <code bash> | ||
+ | ssh ex | ||
+ | </ | ||
+ | ... pour se connecter au serveur. La liste exhaustive des paramètres est disponible dans le '' | ||
+ | |||
+ | |||
+ | =====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 | ||
+ | </ | ||
+ | Actuellement (en 2021) il est raisonnable d' | ||
- | Si c'est la première connexion SSH depuis ce client vers ce serveur, il vous demande si le fingerprint de la clé publique | + | Pour formater une clé publique |
+ | <code bash> | ||
+ | $ ssh-keygen -ef ~/.ssh/id_rsa -mRFC4716 | ||
+ | ---- BEGIN SSH2 PUBLIC KEY ---- | ||
+ | Comment: " | ||
+ | AAAAB3NzaC1yc2EAAAADAQABAAABAQCzU4exWqu4tsgWIJleq1AJ98cGHswD80cphWYOas | ||
+ | spBoOPgdv | ||
+ | [blabla sur quelques lignes] | ||
+ | 15ukAsdfsdgg3h5f4h6dfh3fj84tK1 | ||
+ | ---- END SSH2 PUBLIC KEY ---- | ||
+ | </ | ||
+ | Alternatives : convertir au format PEM '' | ||
- | ==== Se connecter sans mdp ==== | + | ===== Se connecter sans mdp ===== |
Sur la machine cliente : | Sur la machine cliente : | ||
* générer un couple de clé **rsa** : | * générer un couple de clé **rsa** : | ||
- | + | <code bash> | |
- | cd ~/.ssh | + | cd ~/.ssh |
- | ssh-keygen -t rsa | + | ssh-keygen -t rsa |
- | | + | |
- | | + | Enter file in which to save the key (/ |
- | | + | Enter passphrase (empty for no passphrase): |
- | | + | Enter same passphrase again: |
- | | + | Your identification has been saved in / |
- | | + | Your public key has been saved in / |
- | | + | The key fingerprint is: |
- | | + | |
+ | </code> | ||
**id_rsa** est la clé privée ; **id_rsa.pub** la clé publique | **id_rsa** est la clé privée ; **id_rsa.pub** la clé publique | ||
Line 73: | Line 143: | ||
* envoyer sa clé publique sur le serveur < | * envoyer sa clé publique sur le serveur < | ||
- | | + | <code bash> |
+ | ssh-copy-id | ||
+ | </ | ||
+ | |||
+ | ... ou moins simple en copiant à la main sa clé publique dans '' | ||
+ | <code bash> | ||
+ | cat ~/ | ||
+ | </ | ||
+ | |||
+ | NB : la commande **ssh-copy-id** ne gère pas plusieurs arguments (wtf ?!) ; donc, si le serveur SSH distant est sur un port autre que celui par défaut (tcp/22), vous devez passer les arguments entre " " ; exemple : | ||
+ | <code bash> | ||
+ | ssh-copy-id -i / | ||
+ | ssh: Could not resolve hostname 10.0.0.1: | ||
+ | |||
+ | ssh-copy-id -i / | ||
+ | ssh: Could not resolve hostname umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/ | ||
+ | |||
+ | # la solution : | ||
+ | ssh-copy-id -i / | ||
+ | </code> | ||
- | ou moins simple en copiant à la main sa clé publique dans '' | ||
- | cat ~/ | ||
On peut rencontrer des problèmes d' | On peut rencontrer des problèmes d' | ||
Pour interdire à cet utilisateur de lancer un shell, il faut ajouter '' | Pour interdire à cet utilisateur de lancer un shell, il faut ajouter '' | ||
- | | + | <code bash> |
- | no-pty ssh-dss AAAAB3NzaC..qxX/ | + | vi ~/ |
+ | no-pty ssh-dss AAAAB3NzaC..qxX/ | ||
+ | </ | ||
* si l'on utilise une passphrase, il faudra la saisir à chaque //ssh// qu'on fera. Pour ne pas avoir à la retaper à chaque fois, on utilise '' | * si l'on utilise une passphrase, il faudra la saisir à chaque //ssh// qu'on fera. Pour ne pas avoir à la retaper à chaque fois, on utilise '' | ||
- | + | <code bash> | |
- | eval ' | + | eval ' |
- | SSH_AUTH_SOCK=/ | + | SSH_AUTH_SOCK=/ |
- | SSH_AGENT_PID=5683; | + | SSH_AGENT_PID=5683; |
- | echo Agent pid 5683; | + | echo Agent pid 5683; |
- | ssh-add ~/ | + | ssh-add ~/ |
- | Enter passphrase for / | + | Enter passphrase for / |
- | Identity added: / | + | Identity added: / |
+ | </ | ||
On lance '' | On lance '' | ||
- | * pour plus de sécurité on peut restreindre l' | + | ====ssh-add==== |
- | | + | Cet outil sert à ajouter ou supprimer des identités (clés) au ssh-agent : |
- | from=" | + | * pour lister toutes les identités déjà chargées : '' |
+ | * pour ajouter une nouvelle identité : ssh-add ~/ | ||
+ | * pour supprimer une identité : '' | ||
+ | |||
+ | Par défaut le client SSH va présenter toutes les identités qu'il trouvera ; pour désactiver ce comportement (et éviter tous les //failed login// qui en découlent) : | ||
+ | <code bash ~/ | ||
+ | IdentitiesOnly yes | ||
+ | </ | ||
+ | Attention il faudra soit utiliser '' | ||
+ | |||
+ | * pour plus de sécurité on peut restreindre l' | ||
+ | <code bash> | ||
+ | cat authorized_keys | ||
+ | from=" | ||
+ | </ | ||
Ici on filtre sur le sous-domaine stuff.net | Ici on filtre sur le sous-domaine stuff.net | ||
- | ==== 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. | **Ssh CoPy** (SCP) est une commande qui permet de transférer des fichiers par une connexion SSH. | ||
Line 129: | Line 232: | ||
- | ====Tunnels SSH==== | + | =====Tunnels SSH===== |
Faire un tunnel SSH, c'est créer une connexion SSH pour y faire passer (encapsuler) des données de manière sécurisée. En lançant une connexion SSH depuis mon poste client vers serveurSSH.com, | Faire un tunnel SSH, c'est créer une connexion SSH pour y faire passer (encapsuler) des données de manière sécurisée. En lançant une connexion SSH depuis mon poste client vers serveurSSH.com, | ||
Line 158: | Line 261: | ||
- | ==== Back connexion ==== | + | ===== Back connexion |
Il existe un moyen de faire une back connexion, c'est à dire une redirection de requête via une autre machine. | Il existe un moyen de faire une back connexion, c'est à dire une redirection de requête via une autre machine. | ||
Line 172: | Line 275: | ||
- | ==== Export display ==== | + | ===== Export display |
L' | L' | ||
Line 178: | Line 281: | ||
Sur le serveur SSH, dans le fichier ''/ | Sur le serveur SSH, dans le fichier ''/ | ||
- | | + | <code bash> |
+ | X11Forwarding yes | ||
+ | </ | ||
Sur le client, qui doit être muni d'un serveur X : | Sur le client, qui doit être muni d'un serveur X : | ||
- | | + | <code bash> |
+ | ssh -X [-C] serveur | ||
+ | </ | ||
-X permet l' | -X permet l' | ||
Line 188: | Line 295: | ||
Pour les postes clients sous Windows, on peut passer par l' | Pour les postes clients sous Windows, on peut passer par l' | ||
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 | ||
- | | + | <code bash> |
+ | startxwin.sh | ||
+ | </ | ||
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 : | ||
- | | + | <code bash> |
+ | ssh -X serveur | ||
+ | </ | ||
+ | |||
+ | ====Après un su/ | ||
+ | |||
+ | Le X11 ne passe pas les '' | ||
+ | <code bash> | ||
+ | # afficher le DISPLAY avant le sudo | ||
+ | echo $DISPLAY | ||
+ | | ||
+ | |||
+ | # afficher les xauth et copier la ligne qui correspond à notre DISPLAY (ici le ": | ||
+ | xauth list | ||
+ | [..] | ||
+ | serveur/ | ||
+ | |||
+ | # ajouter l' | ||
+ | sudo -i | ||
+ | xauth add serveur/ | ||
+ | |||
+ | xclock& | ||
+ | </ | ||
+ | =====Exécuter un script local sur le serveur distant===== | ||
+ | |||
+ | Pour cela, on lance la commande bash distante, en précisant le paramètre '' | ||
+ | <code bash> | ||
+ | ssh user@remoteserver 'bash -s' < script.sh | ||
+ | </ | ||
+ | |||
+ | Si le script n'est pas dans un fichier, on peut envoyer les commandes sur plusieurs lignes en usant d'un [[informatique: | ||
+ | <code bash> | ||
+ | ssh user@remoteserver 'bash -s' << EOF | ||
+ | hostname | ||
+ | pwd | ||
+ | EOF | ||
+ | </ | ||
+ | |||
+ | ====== Tips ====== | ||
+ | |||
+ | =====Stream audio over SSH===== | ||
+ | |||
+ | Stream audio over SSH : on transmet le fichier file.mp3 dans la connexion SSH ; le flux est lu par le logiciel mpg321 sur le serveur distant. | ||
+ | |||
+ | <code bash> | ||
+ | ssh [user]@[address] " | ||
+ | </ | ||
+ | |||
+ | =====Lister les options du sshd===== | ||
+ | |||
+ | 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 ''/ | ||
+ | <code bash> | ||
+ | sshd -T | ||
+ | </ | ||
+ | |||
+ | =====Mode debug/ | ||
+ | |||
+ | Pour débugger une connexion SSH récalcitrante, | ||
+ | <code bash> | ||
+ | ssh -vv user@server | ||
+ | OpenSSH_5.3p1, | ||
+ | debug1: Reading configuration data / | ||
+ | debug1: Applying options for * | ||
+ | debug2: ssh_connect: | ||
+ | debug1: Connecting to server [10.1.1.51] port 22. | ||
+ | debug1: Connection established. | ||
+ | debug1: identity file / | ||
+ | [..] | ||
+ | </ | ||
+ | |||
+ | =====Lister les clés présentes===== | ||
+ | |||
+ | Une commande pratique pour lister les clés SSH présentent localement, et afficher leur niveau de sécurité (taille, algo, etc) : | ||
+ | <code bash> | ||
+ | for keyfile in ~/ | ||
+ | 1024 c1: | ||
+ | 2048 53: | ||
+ | </ | ||
+ | |||
+ | =====Modifier une passphrase===== | ||
+ | |||
+ | Pour changer la passphrase d'une clé SSH existante : | ||
+ | <code bash> | ||
+ | ssh-keygen -f ~/ | ||
+ | Key has comment ' | ||
+ | Enter new passphrase (empty for no passphrase): | ||
+ | Enter same passphrase again: | ||
+ | Your identification has been saved with the new passphrase. | ||
+ | </ | ||
+ | |||
+ | =====Séquence d' | ||
+ | |||
+ | Lorsqu' | ||
+ | |||
+ | La même avec le client SSH est : ''< | ||
+ | |||
+ | =====Saisir un mot de passe via SSH===== | ||
+ | |||
+ | Lorsqu' | ||
+ | |||
+ | Pour transmettre le mot de passe via la connexion SSH il faut ajouter l' | ||
+ | <code bash> | ||
+ | ssh USER@SERVER "sudo whoami" | ||
+ | USER@SERVER'' | ||
+ | sudo: pas de tty présent et pas de programme askpass spécifié | ||
+ | |||
+ | ssh -t USER@SERVER "sudo whoami" | ||
+ | USER@SERVER'' | ||
+ | [sudo] Mot de passe de USER : | ||
+ | root | ||
+ | Connection to SERVER closed. | ||
+ | </ | ||
+ | |||
+ | src : https:// | ||
+ | |||
+ | |||
+ | =====Timeout d' | ||
+ | |||
+ | Lorsqu' | ||
+ | |||
+ | On peut limiter ce timeout pour ne pas avoir à attendre 3 plombes qu'il nous rende la main, en utilisant l' | ||
+ | <code bash> | ||
+ | # réglage du temps maximal d' | ||
+ | ssh -o ConnectTimeout=5 serveur-down | ||
+ | </ | ||
+ | |||
+ | Si " | ||
+ | <code bash> | ||
+ | host serveur-down | ||
+ | | ||
+ | | ||
+ | |||
+ | # limiter les essais à une seule IP | ||
+ | ssh -o ConnectionAttempts=1 serveur-down | ||
+ | </ | ||
+ | |||
+ | |||
+ | =====Connexion SSH via webproxy===== | ||
+ | |||
+ | Pour se connecter en SSH à travers un proxy web, disons " | ||
+ | <code bash ~/ | ||
+ | Host ssh-server | ||
+ | | ||
+ | </ | ||
+ | |||
+ | Ainsi on se connectera simplement avec : '' | ||
+ | |||
+ | Depuis Windows il est plus facile d' | ||
+ | |||
+ | =====Connexion SSH par rebond===== | ||
+ | |||
+ | Pour se connecter à un serveur SSH cible par rebond, via un autre serveur SSH " | ||
+ | <code bash> | ||
+ | client ---> serveur_bastion ---> serveur_cible | ||
+ | </ | ||
+ | |||
+ | Il suffit de saisir l' | ||
+ | <code bash> | ||
+ | ssh -J bastion cible | ||
+ | </ | ||
+ | |||
+ | Sur de plus ancienne version de SSH on doit remplacer le -J par : | ||
+ | <code bash> | ||
+ | ssh -o ProxyCommand=" | ||
+ | </ | ||
+ | |||
+ | Et sur les plus anciennes versions de SSH on peut utiliser le trick ('' | ||
+ | <code bash> | ||
+ | ssh -tt bastion "ssh -tt cible" | ||
+ | </ | ||
+ | |||
+ | Pour automatiser cela il faut éditer, sur le poste client, le fichier de config perso ('' | ||
+ | <code bash ~/ | ||
+ | Host cible | ||
+ | | ||
+ | # nouvelle méthode | ||
+ | | ||
+ | # ou: | ||
+ | User login_sur_bastion | ||
+ | # | ||
+ | # on peut préciser le certificat à utiliser pour éviter le double prompt | ||
+ | # | ||
+ | | ||
+ | </ | ||
+ | |||
+ | Pour éviter de saisir plusieurs fois son mot de passe, penser à copier sa clé dans les '' | ||
+ | <code bash> | ||
+ | # si pas encore fait, générer une paire de clé sur le poste client | ||
+ | client $ ssh-keygen | ||
+ | [blabla OK OK] | ||
+ | # copier la clé sur le bastion | ||
+ | client $ ssh-copy-id user@bastion | ||
+ | </ | ||
+ | |||
+ | On peut enchainer plusieurs serveurs en enfilade pour se connecter sur le serveur cible : | ||
+ | <code bash ~/ | ||
+ | Host cible | ||
+ | # on sépare les serveurs intermédiaires par une virgule | ||
+ | | ||
+ | # | ||
+ | # ou avec l' | ||
+ | | ||
+ | Host bastion2 | ||
+ | | ||
+ | </ | ||
+ | |||
+ | =====Connexion SSH par rebonds via webproxy===== | ||
+ | |||
+ | On mixe les astuces : on veut se connecter à CIBLE via un premier webproxy, puis un bastion SSH : | ||
+ | < | ||
+ | CLIENT ----- WEBPROXY(SOCKS 5) ----- BASTION ----- CIBLE | ||
+ | </ | ||
+ | |||
+ | <code bash> | ||
+ | # on défini le mode de connexino à BASTION (via WEBPROXY sur le port 3128) | ||
+ | Host BASTION | ||
+ | Hostname BASTION.FQDN | ||
+ | ProxyCommand /bin/nc -X connect -x WEBPROXY: | ||
+ | # on défini le mode de connexion à CIBLE (via BASTION en passant la commande ProxyCommand) | ||
+ | Host CIBLE | ||
+ | Hostname CIBLE.FQDN | ||
+ | ProxyCommand ssh BASTION -W %h:%p | ||
+ | ProxyJump BASTION | ||
+ | </ | ||
+ | |||
+ | Depuis Windows, je n'ai pas trouvé de solution avec Putty qui ne gère pas '' | ||
+ | |||
+ | =====Unable to negotiate...===== | ||
+ | |||
+ | Certains clients récents ne sont plus compatibles avec les paramètres négociés avec les serveurs trop vieux (ou inversement...). En effet les anciennes versions sont vulnérables à différentes failles de sécurité. C'est donc une bonne chose de désactiver par défaut la possibilité d' | ||
+ | |||
+ | Cependant avec certains vieux équipements, | ||
+ | <code bash> | ||
+ | ssh admin@upgrayedd | ||
+ | Unable to negotiate with 10.0.2.240 port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1 | ||
+ | </ | ||
+ | |||
+ | Il faut donc forcer le client SSH a accepter ces protocoles: | ||
+ | <code bash> | ||
+ | ssh -o KexAlgorithms=+diffie-hellman-group1-sha1 upgrayedd | ||
+ | </ | ||
+ | |||
+ | ou, plus pérenne, dans le fichier de préférences du client SSH : | ||
+ | <code bash ~/ | ||
+ | Host upgrayedd | ||
+ | KexAlgorithms +diffie-hellman-group1-sha1 | ||
+ | # dans mon cas je doit aussi ajouter ça : | ||
+ | HostKeyAlgorithms +ssh-dss | ||
+ | </ | ||
+ | Il existe une page qui décrit les méthodes pour contourner les problèmes de compatibilité SSH : [[http:// | ||
+ | |||
+ | src: https:// | ||
- | (il parait que ça marche aussi avec putty, en activant le //X11 Forwarding//, | + | =====key_verify failed===== |
+ | Les vieilles croûtes - les vieilles machines - qui utilisent des vieilles implémentations de SSH peuvent bloquer votre client SSH : | ||
+ | <code bash> | ||
+ | ssh_rsa_verify: | ||
+ | key_verify failed for server_host_key | ||
+ | </ | ||
- | ===== Liens ===== | + | Pour bypasser ce prérequis de sécurité (ce n'est pas conseillé mais on n'a pas toujours le choix), il faut préciser l' |
+ | <code bash> | ||
+ | ssh -1 vieille-croute | ||
+ | </ | ||
+ | ====== Liens ====== | ||
[[http:// | [[http:// |
informatique/logiciels/ssh.txt · Last modified: 2024/04/05 06:59 by pteu