{{tag>administration sécurité serveur}}
{{ :logo_openssh.png?120|Puffy la mascotte de OpenSSH}}
====== SSH ======
Cette page présente les usages les plus courants de SSH et sa configuration de base.
Voir la page //[[:ssh avancé|SSH Avancé]]// ou //[[:SFTP]]// pour d'autres usages.
**[[wpfr>Secure_Shell|SSH]]** est un protocole réseau permettant d'établir une communication chiffrée entre deux machines. Il est notamment utilisé pour se connecter à distance à un serveur SSH, y exécuter des commandes ou transférer des fichiers de manière sécurisée.
Par défaut, le service ''sshd'' d'un //[[:serveur]]// SSH écoute sur le port TCP ''22''. On utilise un //client// SSH pour établir une connexion avec ce serveur.
**SSH** permet de sécuriser différentes pratiques informatiques :
* Il remplace **[[wpfr>Telnet]]** en permettant d'exécuter des commandes depuis un réseau local ou Internet.
* Il permet de [[:partage|partager de fichiers]] (voir //[[:SFTP]]//), à la manière de **[[:SMB]]** ou **[[:FTP]]**, mais cette fois de manière suffisamment sécurisée pour être adaptée à Internet.
* Il sécurise n'importe quel protocole ou application réseau, en proposant d'encapsuler les communications dans un //tunnel// chiffré (voir //[[:ssh_avance#se_connecter_en_ssh_a_travers_un_mandataire_http_proxy|proxy SSH]]//). On peut donc sécuriser n'importe quel service grâce à SSH, dont des services domestiques tels que [[:partage#partage de fichiers]] (via d'autres protocoles moins sécurisés), [[:multimedia#serveurs_multimedia|service multimédia]], [[:bureau à distance]], [[:domotique]], etc., ou déporter sa [[:navigateur|navigation]] [[:Web]] à la manière d'un **[[VPN]]**.
Avec [[wpfr>Telnet]], Rlogin, [[:FTP]] et de nombreuses autres applications de communication, les données des utilisateurs et notamment les mots de passe sont par défaut transmis //en clair// sur le réseau, ce qui constitue une faille de sécurité majeure évidente (voir //[[wpfr>Analyseur_de_paquets|sniffing]]//).
Les usages de **SSH** sont entre autre :
* accéder à distance au [[:terminal]], ce qui permet d'effectuer la totalité des opérations courantes et/ou d'administration sur la machine distante
* déporter l'affichage graphique de la machine distante ([[:bureau à distance]])
* transferts de fichiers
* montage ponctuel de stockage distant, soit en ligne de commande, soit via [[:Nautilus|GNOME Fichiers]] par exemple.
* montage automatique de stockage distant
* déporter et sécuriser de nombreux autres services ou protocoles (voir [[:ssh avancé|SSH Avancé]]).
===== OpenSSH =====
**[[wpfr>OpenSSH]]** est la solution la plus utilisée pour mettre en place une communication **SSH**. Il fournit un ensemble d'outils libres dont certains sont installés par défaut sur Ubuntu.\\
Comme son nom l'indique, **OpenSSH** est développé dans le cadre du projet [[http://www.openbsd.org|OpenBSD]].\\
C'est cette solution qui est traitée sur cette page.
===== Installation =====
Pour accéder à une machine à distance (ordinateur personnel, serveur distant qu'on administre, //box//, etc.), [[:deb#installer_un_paquet_deb|installer le paquet]] ''[[apt>openssh-server]]'' sur cette machine. Elle sera le //[[:serveur]]// SSH.
La fonctionnalité //[[#Installation du client SSH|client]]// est fournie par le paquet ''[[apt>openssh-client]]'', qui est installé par défaut sur Ubuntu. Elle permet d'utiliser le [[:terminal]] local pour créer et accéder à une [[:session]] distante.
On peut vérifier ce qui est déjà installé avec la commande :
ssh -V
qui devrait retourner une ligne du type ''OpenSSH_8.2p1 Ubuntu-4ubuntu0.12, OpenSSL 1.1.1f 31 Mar 2020''.
La commande suivante permet de connaître la version de la bibliothèque [[wpfr>Transport_Layer_Security|TLS]] (anciennement SSL, le nom est resté) :
dpkg -l libssl*
=== Utilisation du serveur SSH ===
Le serveur SSH fonctionne en tant que [[:services|service]] lancé automatiquement au démarrage de la machine.
Il est notamment possible de :
* l'[[#activer]] ou l'[[#arrêter]] : pour par exemple désactiver momentanément le service
* le [[#relancer]] : utile entre autre après une modification de la configuration.
Vous trouverez en fin de cette page plus d'information sur la [[#configuration du serveur SSH]], //peu sécurisée par défaut//.
== Vérifier le status ==
Saisissez dans un [[:terminal]] la [[:commande_shell|commande]] suivante :
sudo systemctl status ssh
== Activer ==
Saisissez dans un [[:terminal]] la [[:commande_shell|commande]] suivante :
sudo systemctl start ssh
== Arrêter ==
sudo systemctl stop ssh
== Relancer ==
sudo systemctl restart ssh
==== Installation du client SSH ====
Sur Ubuntu, le client **[[wpfr>OpenSSH]]** est déjà installé par défaut. Dans le cas contraire, [[:deb#installer_un_paquet_deb|installer le paquet]] ''[[apt>openssh-client]]'', qui fournit la [[:commande shell|commande]] ''[[man>ssh]]''.
== Clients pour machines qui ne sont pas sous Linux ==
Sur Windows on peut installer Ubuntu via **[[:WSL]]**. On aura alors accès au client **[[wpfr>OpenSSH]]**.
Pour contrôler une machine distante depuis un poste équipé de Windows, on peut aussi installer et utiliser **[[https://putty.org/index.html|PuTTY]]**, qui est publié sous [[wpfr>licence MIT]].
Le client (ainsi que le serveur) **OpenSSH** sont aussi disponibles nativement sur Windows.((Voir //[[https://www.zebulon.fr/astuces/internet-reseaux/comment-installer-et-utiliser-le-client-ssh-cache-de-windows.html|Comment installer et utiliser le client SSH caché de Windows ?]]//))
Il existe aussi des clients SSH pour Android ([[https://f-droid.org/fr/packages/org.connectbot/|ConnectBot]]), iOS, et la pluaprt des systèmes d'exploitation.
Vérifiez bien qu'aucun [[:pare-feu]] n'est actif sur le serveur SSH //avant// l'installation de SSH. Sans quoi vous ne pourrez pas vous y connecter.
Pour utiliser SSH derrière un pare-feu, port standard du protocole SSH est le ''22''.
===== Utilisations de SSH=====
==== Accès au terminal à distance ====
Pour ouvrir une [[:session]] distante en SSH (se connecter à un serveur) avec la [[:commande shell|commande]] ''[[man>ssh]]'' :
ssh nom_utilisateur@hôte -p numéro_de_port
où
* ''nom_utilisateur'' est le nom d'[[:utilisateur]] à utiliser sur la machine distante
* ''hôte'' est le nom d'hôte de la machine distante, qui peut être un nom de domaine, une adresse IPv4, ou un nom [[:zeroconf#mDNS]] ou [[wpfr>NetBIOS]] en local
* ''numéro de port'' est le numéro du port sur lequel écoute le serveur.
Exemple :
ssh bernadette@example.com -p 12345
L'option ''-p //numéro_de_port//'' est facultative. Si rien n'est précisé, c'est le port ''22'' qui sera utilisé par défaut (avec le protocole [[wpfr>Transmission_Control_Protocol|TCP]]).
Pour se connecter avec SSH en [[wpfr>IPv6]] depuis un terminal :
ssh -6 nom_utilisateur@adresse_IPv6
où ''adresse_IPv6'' est l'adresse IPv6 du serveur.
Exemple :
ssh -6 bernadette@2620:2d:4000:1::28
Si vous voulez vous connecter à plusieurs machines situées derrière un routeur vous pouvez configurer celui-ci afin qu'il redirige chaque port TCP entrant vers une machine donnée. On parle de //translation NAT//.
Exemple :\\
port externe ''22001'' redirigé vers ''192.168.0.1:22''\\
port externe ''22002'' redirigé vers ''192.168.0.2:22''
Ensuite utilisez l'option ''-p 22002'' pour connecter par exemple la machine ayant pour adresse ''192.168.0.2'' sur le réseau local.
==== Outil graphique pour les connexions SSH ====
=== URL ===
Pour se connecter en SSH avec la plupart des autres outils, on utilise une [[:web#URL]].
Celle-ci ressemble un peu à la commande ''[[man>ssh]]'' du [[#accès au terminal à distance|chapitre précédent]]. Elle est de la forme :
ssh://nom_utilisateur@hôte:numéro_de_port
où
* ''nom_utilisateur'' est le nom d'[[:utilisateur]] à utiliser sur la machine distante
* ''hôte'' est le nom d'hôte de la machine distante, qui peut être un nom de domaine, une adresse IP (IPv4 ou IPv6 cette fois), ou un nom [[:zeroconf#mDNS]] ou [[wpfr>NetBIOS]] en local
* ''numéro de port'' est le numéro du port sur lequel écoute le serveur.
=== Applications clientes ===
* En plus d'afficher les bureaux à distance, [[:Remmina]] est aussi un client SSH, et donne accès au [[:terminal]].
On trouve aussi de nombreuses applications [[:Flatpak]] sur [[https://flathub.org/fr/apps/search?q=ssh|Flathub]] :
* [[https://flathub.org/fr/apps/io.github.mfat.sshpilot|SSH Pilot]]
* [[https://flathub.org/fr/apps/com.github.muriloventuroso.easyssh|EasySSH]]
* [[https://flathub.org/fr/apps/io.github.BuddySirJava.SSH-Studio|SSH Studio]]
* [[https://flathub.org/fr/apps/uk.org.greenend.chiark.sgtatham.putty|Putty]]
== Gestion de fichiers ==
Voir les [[:sftp#clients|clients SFTP]].
==== Affichage graphique déporté (Tunneling serveurX par ssh) - Accéder aux applications graphiques ====
FIXME [[:xorg|X.org]] est déprécié au profit de [[:Wayland]]. Ce chapitre n'est plus d'actualité !
La commande ''[[man>ssh]]'' offre une fonctionnalité intéressante : la possibilité d'exécuter des applications X-Window à distance, ce qui est bien pratique pour travailler à distance, partager une machine ou simplement effectuer des tâches d'administration.
Il suffit de passer l'option ''-X'' à ''[[man>ssh]]'' :
ssh -X nomtilisateur@Ipserver
L'option ''-X'' permet le déport d'applications X-Window (affichage graphique à distance). Cette possibilité est offerte grâce aux fonctions de tunneling réseau présentes dans SSH. N'oubliez pas qu'Ubuntu (Unix en général) est un système d'exploitation client/serveur, ce qui s'applique aussi à l'affichage géré par X-Window.
Et on peut lancer :
nomUtilisateur@Ipserver$ xeyes
là, l’œil de Moscou vous regarde depuis votre écran local !\\
Pour que cet exemple fonctionne il faut que le paquet //x11-apps// qui fournit //xeyes// soit installé sur le serveur.
Pour que vous puissiez afficher des applications X11 via SSH il faut que votre serveur ait la fonction ''X11Forwarding'' activée et que ''xauth'' y soit installé ! Allez [[#configuration_du_serveur_ssh|À la fin de cette page]] pour savoir comment configurer votre serveur SSH.
==== Transfert de fichiers ====
Pour copier un fichier à partir d'un ordinateur sur un autre avec SSH, on peut utiliser les commandes ''[[man>scp]]'' ou ''[[man>rcp]]'' :
scp @:
et en [[wpfr>IPv6]] :
scp -6 <élément> @[addresse ipv6]:
== Exemples ==
**Pour un fichier :**
scp fichier.txt hornbeck@192.168.1.103:/home/hornbeck
et en IPv6
scp -6 fichier.txt albertine@[2a01:e35:2431::2a34]:/home/albertine
**Pour un répertoire :**
scp -r répertoire hornbeck@192.168.1.103:/home/hornbeck/
et en IPv6
scp -6r répertoire/ albertine@[2a01:e35:2431::2a34]:/home/albertine
Vous pouvez aussi bien copier des fichiers à partir des ordinateurs à distance sur votre disque local :
scp hornbeck@192.168.1.103:/home/hornbeck/urls.txt .
Ici, le point **.** à la fin de commande indique de copier le fichier dans le répertoire courant.
Pour les noms avec des espaces :
de distant vers local
$ scp utilisateur@12.345.678.90:"le\ fichier" .
$ scp utilisateur@12.345.678.90:'"le fichier"' .
# Notez les simples ' ET doubles " guillemets ' "
$ fichier="le fichier" #ou
$ fichier=le\ fichier
$ scp utilisateur@12.345.678.90:"'$fichier'" .
$ fichier="le\ fichier"
$ scp utilisateur@12.345.678.90:"$fichier" .
Pour les noms avec des espaces :
de local vers distant c'est différent
$ scp le\ fichier utilisateur@12.345.678.90:
le fichier 100% 0 0.0KB/s 00:00
$ scp "le fichier" utilisateur@12.345.678.90:
le fichier 100% 0 0.0KB/s 00:00
$ fichier="le fichier" # ou
$ fichier=le\ fichier
$ scp "$fichier" utilisateur@12.345.678.90:
le fichier 100% 0 0.0KB/s 00:00
cf : https://forum.ubuntu-fr.org/viewtopic.php?pid=21768296#p21768296
Vous pouvez aussi le renommer en le copiant (« mon.txt ») sur le disque local (toujours dans le répertoire courant):
scp hornbeck@192.168.1.103:/home/hornbeck/urls.txt ./mon.txt
Vous pouvez très bien copier un fichier d'un ordinateur vers un autre tout en étant sur un troisième ordinateur :
scp nom@ordi1:chemin/fichier nom@ordi2:chemin/fichier
Dans le cas où le port SSH du serveur ne serait pas le port par défaut (22), il faut indiquer le port distant à utiliser :
scp -P port fichier.txt hornbeck@192.168.1.103:/home/hornbeck
Lorsque l'on copie des fichiers ou des répertoires sur d'autres machines, ne pas oublier que les fichiers ou répertoires deviendront propriété du compte avec lequel on se connecte à distance. Pour préserver les propriétaire et groupe de chaque fichier ou répertoire, il sera donc utile de recourir à un logiciel tel que [[:tar|tar]] pour enregistrer l'intégralité des informations relatives à ce que l'on transfère.
==== Transfert - synchronisation de répertoire ====
Vous pouvez sécuriser un répertoire en le dupliquant à travers le réseau en utilisant la commande [[:rsync]].
Exemple1 : Pour transférer le home d'un utilisateur ''a'' hébergé dans la machine ''b'' dont l'adresse IP est enregistrée dans le fichier ''[[:hosts|/etc/hosts]]'' en excluant quelques fichiers avec un résultat à mettre dans le répertoire ''/MAISON'' qui sera automatiquement créé.
sudo rsync -ahv --progress --stats --exclude={'.*','persistence.*'} a@b:/home/a /MAISON 2>err.log
cat err.log
==== Gestion de fichiers via SFTP ====
**[[:SFTP]]** est une autre méthode pour accéder à un support de stockage distant via **SSH**.
Il suffit de mettre en place une connexion **SSH** pour monter un serveur **SFTP**.
Voir la page dédiée à **[[:SFTP]]**.
===== Authentification =====
Si vous ouvrez votre serveur SSH sur Internet, par exemple pour y accéder depuis l'ordinateur d'un ami(e) ou lui permettre d'accéder à certains de vos fichiers, n'oubliez JAMAIS qu'Internet est parcouru par des robots qui scannent et testent en permanence tous les serveurs disponibles (SSH et autres) et qu'ils vont faire des tentatives pour trouver vos mots de passe de compte (on parle d'[[wpfr>attaque par force brute]]). L'usage des clés est donc très fortement recommandé.
Si vous ne pouvez vraiment pas faire autrement, utilisez des mots de passe longs et complexes ainsi qu'un système de protection tel que [[:fail2ban]] qui permet de bannir des adresses IP au bout d'un certain nombre de tentatives erronées.\\
Voir aussi [[:denyhosts]] notamment en cas de:
ssh_exchange_identification: read: Connection reset by peer
==== Authentification par mot de passe ====
L'authentification par mot de passe (transmis chiffré) est le mode d'identification par défaut.
==== Authentification par un système de clés publique/privée ====
=== Description ===
Autrefois tout le monde employait l'authentification typique par le principe //identifiant - mot de passe//. Cependant si quelqu'un connaît votre mot de passe ou le découvre au moyen d'une attaque la sécurité est compromise. De plus, utiliser un mot de passe différent pour chaque serveur et le saisir à chaque connexion peut s'avérer contraignant.
Pour se débarrasser des ces problèmes, SSH propose un système d'authentification par clé publique/privée au lieu des mots de passe simples.
Ceci peut permettre par exemple :
* à un administrateur de se connecter à des centaines de machines sans devoir connaître des centaines de mots de passe différents ;
* de ne pas avoir un mot de passe à saisir toutes les 2 minutes (en utilisant //ssh-agent//).
Ces clés restent des chaînes de caractères (en français courant : du texte), mais sont beaucoup plus longues et aléatoires que de simples mots de passe.
La clé privée est en principe unique : chaque utilisateur possède une clé privée qu'il peut copier sur les terminaux auxquels il accède physiquement et depuis lesquels il a besoin d'un accès SSH (via le client SSH). Cette clé se trouve généralement dans un fichier ''~/.ssh/id_xxxx''. C'est un document sensible très personnel, il faut y appliquer des droits très restrictifs : ''%%r-x --- ---%%'' (''500'') pour le répertoire .ssh et ''%%r-- --- ---%%'' (''400'') pour le fichier ''id_xxxx''.\\
Pour un maximum de sécurité il est possible de protéger cette clé privée au moyen d'un mot de passe.
De son côté la clé publique est envoyée à tous les serveurs auxquels on veut accéder à distance afin qu'ils nous identifient avec certitude en vérifiant que le client possède bien la clé privée associée. Côté serveur cette clé publique sera stockée dans le fichier ''~/.ssh/authorized_keys'', avec éventuellement des options et les clés publiques d'autres utilisateurs à raison d'une par ligne.
Localement on peut stocker une clé publique par ex. dans un fichier ''id_xxxx.pub'' qui peut aussi se trouver dans le répertoire ''~/.ssh'', ou ailleurs (ce n'est pas un document sensible).
On peut générer une nouvelle clé publique depuis une clé privée mais pas l'inverse.
=== Mise en place des clés ===
À moins que vous n'ayez déjà un couple de clés, vous devez d'abord en créer.\\
Exemple pour une clé utilisant l'algorithme de chiffrement ED25519, vous saisirez dans le [[:terminal]] du client :
ssh-keygen -t ed25519 -C "email@example.com"
On peut également utiliser l'algorithme RSA, plus ancien, moins sûr, et générant des clés plus grosses :
ssh-keygen -t rsa -b 4096 -C "email@example.com"
Il vous sera alors demandé où enregistrer la clé privée (acceptez juste l'endroit par défaut : **~/.ssh**, et ne changez pas le nom du fichier généré) puis de choisir une //passphrase// (phrase de reconnaissance).
Bien que non obligatoire, l'utilisation d'une //passphrase// est recommandée pour protéger votre clé privée. En effet toute personne qui obtiendrait l'accès à votre clé privée (non protégée) aurait alors vos permissions sur d'autres ordinateurs. Veuillez prendre un instant et choisissez une très bonne //passphrase// c'est à dire longue et complexe.
On peut tester sa passphrase sur sa clé en exécutant ssh-keygen -y -f .ssh/id_ed25519 # qui va demander la passphrase et afficher la clé publique si la saisie est correcte
Votre clef publique a été créée avec la nouvelle clef privée. Elles sont habituellement localisées dans le [[:fichier_cache|répertoire caché]] ''~/.ssh'' :
''~/.ssh/id_ed25519.pub'' pour la clé publique et ''~/.ssh/id_ed25519'' pour la clé privée ou ''~/.ssh/id_rsa.pub'' et ''~/.ssh/id_rsa'' si vous avez utilisé l'algorithme RSA.
Pour que votre ssh-agent reconnaisse cette paire de clefs, il faut utiliser la commande ssh-add :
ssh-add
#ou plus directement
ssh-add /chemin-complet/vers-la-cle/nom-cle
Vous pouvez également vérifier la liste des paires de clefs existantes avec l'option -l (-list) :
ssh-add -l
Si cette commande ressort : The agent has no identities. alors aucune clef n'est actuellement prise en compte. Il faut recommencer les étapes ci-dessus.
Si vous avez : Could not open a connection to your authentication agent. alors faire eval "$(ssh-agent)" puis de nouveau ssh-add
pistes pour débugger :
* forcer l'utilisation uniquement de clefs dans la commande ssh : ssh -o PubkeyAuthentication=yes -o PreferredAuthentications=publickey
* utiliser les options **-v** ou **-vv** ou **-vvv** dans le commande ssh
Il faut maintenant envoyer au serveur votre clé publique pour qu'il puisse vous chiffrer des messages.
**En résumé** (car les paragraphes ci-dessous utilisant des scripts peuvent sembler confus à certains)
* Coté client : Il faut que le client ait mis sa clé privée en $HOME/.ssh/ (côté client).
* Coté client : la clé doit être connue de l'agent SSH (ssh-add)
* Coté client : Le répertoire $HOME/.ssh doit appartenir au propriétaire de $HOME et les clés privées ne doivent être accessibles que par leur propriétaire (mode %%rw------%% ou 600 au maximum)
* Coté serveur : La clé publique du client doit se trouver dans le fichier $HOME/.ssh/authorized_keys du serveur.
* Coté serveur : il vaut mieux refuser l'accès par mot de passe ("PasswordAuthentication no" dans /etc/ssh/sshd_config du serveur)
L'utilisateur distant doit avoir cette clé (c'est une ligne de caractères en code ASCII) dans son fichier de clés d'autorisation situé à ''~/.ssh/authorized_keys'' sur le système distant. Employez la commande ''[[man>ssh-copy-id]]''.
''ssh-copy-id'' est un script qui utilise ssh pour se connecter à une machine à distance en utilisant le mot de passe de l'utilisateur. L'[[#authentification par mot de passe]] doit donc être autorisée dans le fichier de configuration du serveur ssh (par défaut sur Ubuntu). Il change également les permissions des répertoires **~/.ssh** et **~/.ssh/authorized_keys** de l'hôte distant pour enlever l'accès en écriture du groupe (qui vous empêcherait de vous connecter si le serveur distant ssh a "StrictModes yes" dans son fichier de configuration, ce qui est le cas par défaut sur Ubuntu).
ssh-copy-id -i ~/.ssh/id_ed25519.pub @
ou si le port est différent du port standard 22 ([[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=99785|notez les guillemets]]):
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p "@"
Vous devrez alors donner le mot de passe //utilisateur// de cet ordinateur. Après l'ajout votre clé publique, vous devenez un hôte de confiance.
Si l'[[#authentification par mot de passe est désactivée]]((donc ''PasswordAuthentication no'' dans ''/etc/ssh/sshd_config'' sur le serveur)), alors vous aurez besoin de copier-coller votre clé suivant un autre moyen.\\
Voici une ligne à copier pour ajouter sa clé publique sur le serveur distant :
ssh login@serveur "echo $(cat ~/.ssh/id_id_ed25519.pub) >> .ssh/authorized_keys"
Lancez :
ssh @ -p
Dorénavant n'utilisez plus votre mot de passe mais votre **passphrase** pour vous connecter. Celle-ci sert à déchiffrer votre //clé privée// de votre système local.
Si ça ne marche pas, c'est-à-dire que le mot de passe vous est quand même demandé, essayez sur votre serveur la commande :
tail -f /var/log/auth.log
tandis que vous essayez de vous connecter. Si on vous parle de "//vulnkey//", c'est que par malchance ''ssh-keygen'' a généré une clé vulnérable. Recommencez alors la procédure depuis [[#Authentification par un système de clés publique/privée|le début]]((donc à partir de ''ssh-keygen''))
Pour résumer, deux choses sont nécessaires pour obtenir un accès réellement sécurisant (et sécurisé ;-)) par authentification à clé publique par rapport à l'authentification par mot de passe classique :
- **Votre clé privée**, chiffrée ;
- **Votre passphrase**, utilisée pour déchiffrer votre clé privée.
Si vous choisissez de ne pas avoir de mot de passe (ce qui est possible, voyez la prochaine section), vous aurez une sécurité moindre, ainsi que si vous utilisez une authentification uniquement par mot de passe, comparé à celle que vous pouvez avoir en combinant les deux.
=== Éléments importants en lien avec l'usage des clés ===
== Authentification par mot de passe et / ou par clé ==
Vous pouvez avoir avec SSH les deux modes d'authentifications actifs en même temps, par mot de passe et par clés.
Vous pouvez vouloir neutraliser l'authentification par mot de passe pour des raisons de sécurité, pour cela il faut modifier le fichier de configuration ''/etc/ssh/sshd_config'' de la manière suivante :
- A la ligne ''PasswordAuthentication'' mettre ''no''
N'oubliez pas de [[#relancer]] le service ssh sur votre serveur après avoir changé la configuration.
== Vulnérabilité des anciennes clés ==
Au mois de mai 2008 a été découvert une faiblesse dans la génération des clés par OpenSSL des packages Debian et dérivés tels qu'Ubuntu. Pour résumer, si vous avez généré vos clés entre 2006 et mai 2008, il faut en créer de nouvelles après avoir mis à jour le système. Pensez alors à bien rediffuser vos clés.
== Mot de passe toujours demandés avec authentification par clés ==
Si, après avoir suivi ce tutoriel, un mot de passe est toujours demandé, il se peut que ce soit dû à un problème de [[:droits]] sur votre //Dossier Personnel//.\\
Sur la machine distante [[:tutoriel:comment_modifier_un_fichier|regardez le fichier]] ''/var/log/auth.log'' pour y trouver des indications et notamment si la ligne suivante apparaît :
Authentication refused: bad ownership or modes for directory /home/votre_login
Alors faites :
chmod 755 $HOME
Et tout devrait rentrer dans l'ordre.
Si ce n'est toujours pas le cas, c'est que le serveur doit être configuré en mode de sécurité strict (c'est le cas par défaut sur Ubuntu).\\
Effectuez les opérations suivantes :
Sur le serveur :
* dans le fichier ''/etc/ssh/sshd_config'', la ligne ''StrictModes yes'' indique que le serveur va être très pointilleux sur les droits du compte sur lequel on se connecte en ssh.
* saisissez ensuite les commandes suivantes
chmod go-w ~/
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
* Sur le client, dans ''/etc/ssh/ssh_config'', ajoutez la ligne ''PreferredAuthentications publickey''.
== Gestion des clés ==
Parfois les clés de vos correspondants peuvent changer (réinstallation de machine par exemple), vous aurez alors droit à ce charmant message :
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Please contact your system administrator.
Add correct host key in /home//.ssh/known_hosts to get rid of this message.
Offending key in /home//.ssh/known_hosts:4
RSA host key for has changed and you have requested strict checking.
Host key verification failed.
Soit l'information est exacte et une machine a été corrompue, ou bien il s'agit juste d'un changement de clé (réinstallation par exemple) et dans ce cas il faut effacer les entrées dans le fichier **.ssh/known_hosts** de votre compte.\\
Avant la chose était relativement simple, la clé était directement associée au nom ou à l'IP de la machine cible. Ce n'est plus le cas à présent où elle est associée par UUID rendant quasiment impossible l'identification visuelle de la ligne concernée. Mais ssh étant sympathique, il vous indique quelle est la ligne du fichier concernée.\\
Pour reprendre l'exemple précédent on peut lire la ligne Offending key in /home//.ssh/known_hosts:4 → la clé en erreur est donc située ligne 4 du fichier **.ssh/known_hosts**
Il existe cependant une méthode plus subtile en employant la commande suivante :
ssh-keygen -R
Vous pourrez ainsi effacer seulement l'adresse IP concernée et relancer un ssh.
== Connexion à un répertoire /home chiffré ==
Si vous souhaitez vous connecter par SSH avec une clef publique sur un compte dont le home est chiffré, il est important de faire attention à ce que sur le serveur le fichier/dossier **.ssh/authorized_keys** soit à la fois dans le home chiffré et déchiffré. En effet si le fichier authorized_keys est dans le home sous forme chiffré (.private), open_ssh ne pourra pas lire la clef publique attendue. Il faut donc créer un dossier .ssh et y mettre le fichier authorized_keys quand le home est démonté donc chiffré. Cependant, si vous ne le laissez pas aussi dans le home déchiffré et donc monté, la connexion SSH se fera avec la clef publique mais le home ne sera pas déchiffré automatiquement.
La meilleure solution est de créer des liens virtuels vers un dossier qui n'est pas soumis au chiffrement/déchiffrement comme expliqué [[https://rohieb.wordpress.com/2010/10/09/84/|ici]]
== Authentification SSH avec plusieurs clés privées ==
En principe chaque utilisateur possède une clé privée unique qui lui est propre, et envoie sa clé publique à autant de serveurs qu'il le souhaite.
Cependant il est techniquement faisable de posséder plusieurs clés privées (mais c'est moins pratique et ça n'est pas plus sécurisé).
Lorsqu'on se connecte à plusieurs serveurs avec des clés privées différentes, il faut pouvoir indiquer à SSH quelle clé on veut utiliser pour la connexion, sinon, on rencontre par exemple l'erreur:
git@gitlab.com: Permission denied (publickey).
Pour indiquer au client SSH la clé qu'il doit utiliser pour chacun des serveurs on peut créer un fichier ''~/.ssh/config'' (ou ''/etc/ssh/ssh_config'' pour tous les utilisateurs de la machine) dans lequel il faut spécifier pour chacun des serveurs la clé qui doit être utilisée :
Host adresse-serveur-sans-passphrase.com
User votreutilisateur
IdentityFile ~/.ssh/key-sans-passphrase
Host adresse-serveur-avec-passphrase.com
User votreutilisateur
IdentityFile ~/.ssh/key-avec-passphrase
Pour plus d'options, comme l'utilisateur ou le port à utiliser par défaut, voir le [[:man|manuel]] de **ssh_config**, cf. aussi [[https://gitlab.com/help/ssh/README#working-with-non-default-ssh-key-pair-paths|l'aide de gitlab (en)]]
== Les empreintes (fingerprint) ==
Retrouver l'empreinte de notre clef SSH, pour la communiquer à une personne qui veut se connecter et va utiliser notre clef publique :
ssh-keygen -l
Ensuite la commande demande le fichier de la clef publique. Sur un serveur on spécifiera ''/etc/ssh/ssh_host_rsa_key.pub''.
===== Configuration du serveur SSH =====
La configuration par défaut du serveur SSH sous Ubuntu est suffisante pour fonctionner correctement. Le fichier de configuration à [[:tutoriel:comment_editer_un_fichier|éditer avec les droits d'administration]] est ''/etc/ssh/sshd_config''.
Tableau des principales directives à modifier le cas échéant :
^Directive du fichier^Valeur par défaut sous Ubuntu^Valeur possible^Effet de la valeur choisie^
|''Port''|''22''| Tous les ports qui ne sont pas utilisés par un autre service | Le changement du port par défaut , souvent conseillé, n'augmentera pas la sécurité. C'est même l'inverse si vous choisissez un port non privilégié, c'est à dire supérieur à 1024 |
|''PermitRootLogin''|''without-password'' / ''prohibit-password''|''yes'' ''no'' ''without-password'' ''forced-commands-only'' ''prohibit-password''| cf [[http://manpages.ubuntu.com/manpages/lucid/man5/sshd_config.5.html| le man]] |
|''PubkeyAuthentication''|''yes''|''no''|Laisser ''yes'' si vous voulez établir l'authentification par clé comme expliqué plus haut|
|''PasswordAuthentication''|''yes''|''no''|On peut parfaitement conserver l'authentification par clé pour certains utilisateurs avec celle par mot de passe pour d'autres utilisateurs. Conserver cette valeur à yes tant que l'authentification par clé n'est pas pleinement fonctionnelle, sinon vous perdrez toute connexion en SSH|
|''X11Forwarding''|''yes''|''no''|Laisser ''yes'' pour faire de l'affichage graphique déporté|
|''#MaxStartups 10:30:60''|ligne commentée donc inactive|décommenter (enlever symbole ''#'')|Le ''10'' représente le nombre de connexions acceptées sans qu'un utilisateur ait réussi à s'identifier, si cela passe au dessus de ''10'', il y a 30% de probalités que les suivantes soient bloquées, et ce pourcentage augmente linéairement jusqu'à 100 % lorsque le //full// est atteint, à ''60'' connexions. Très utile pour éviter [[http://linuxfr.org/~dark_star/18379.html|ce genre]] de désagrément.|
|''#Banner /etc/issue.net''|Ligne commentée donc inactive|Décommenter|Lorsque vous essayez de vous connecter à votre serveur par SSH, le fichier ''/etc/issue.net'' est affiché (à vous de le personnaliser pour dire bonjour ou mettre un avertissement, un guide, etc.)|
|UsePAM|yes|no|Attention, bien lire la page de ''[[man>sshd_config|man sshd_config]]'', ce paramètre interagit avec ''ChallengeResponseAuthentication'' et ''PasswordAuthentication'' |
|''AllowUsers''|Ligne absente (autorisé à tous)|ajouter la ligne avec valeur(s) : ''AllowUsers Alice Bob'' |Spécifie les //logins// des seuls utilisateurs autorisés à se connecter. //Idéal pour ouvrir un compte FTP à un ami tout en restreignant l'accès au shell via SSH//.|
|''DenyUsers''|Ligne absente (interdit à personne)|Ajouter la ligne avec valeur(s)|Interdit l'accès à SSH aux utilisateurs listés|
|''AllowGroups''|Ligne absente (autorisé à tous les groupes)|ajouter la ligne avec valeur(s) : ''AllowGroups groupname1 groupname2''|L'authentification via SSH ne sera possible que par des utilisateurs des groupes désigné par leur nom (pas par GID)|
|''DenyGroups''|Ligne absente (interdit à aucun groupe)|Ajouter la ligne avec valeur(s)|Interdit l'accès à SSH aux utilisateurs des groupes listés|
|''ClientAliveInterval''|Ligne absente|Ajouter la ligne avec valeur en secondes : ''ClientAliveInterval 300''|Permet dans certains cas de maintenir une connexion sans coupures|
Pour plus d'informations consultez ''[[man>sshd_config|man sshd_config]]''.
===== Configuration du client SSH =====
Le client peut aussi être configuré par et pour chaque utilisateur via un fichier ''~/.ssh/config''.
Ce fichier ne requiert pas de [[:sudo|permission administrateur]] pour être créé ou édité (avec un [[:gestionnaire de fichiers]] il suffit d'afficher les [[:fichier caché|fichiers cachés]]).
* Il permet de grandement simplifier la ligne de commande.
* Il est pris en compte par [[:nautilus|GNOME Fichiers]] pour se connecter facilement en [[:SFTP]] (et par d'autres outils système).
* Il est [[:sauvegarde|sauvegardé]] avec le reste de son [[:arborescence#répertoire personnel]] (''[[:arborescence#répertoire personnel|$HOME]]'') et ainsi très simple à conserver ou à migrer d'un système à un autre.
Il est possible de configurer le client de manière indépendante pour chaque serveur (ou chaque hôte), et au passage de créer facilement des "alias" pour ces hôtes avec ces configurations, en spécifiant un ''Host'' (nom d'hôte à passer à la commande ''[[man>ssh.1|ssh]]'') différent du ''HostName'' (nom d'hôte réel).\\
Par exemple :
Host serveur-perso
HostName 192.168.1.2
User root
PreferredAuthentications password
Host serveur-cloud
HostName example.com
User moi-même
Port 2222
IdentityFile ~/chemin/orginal/id_ed25519
Il peut notamment être intéressant d'ajouter
ServerAliveInterval 240
Pour que le client envoie un rappel au serveur (ici toutes les 4 minutes) afin que ce dernier ne coupe pas la liaison, ce qui peut bloquer le terminal.
Pour les autres options, voir **(//en//)** //[[https://man.openbsd.org/ssh_config|ssh_config - OpenBSD manual page server]]//.
Dans le cas où on utilise un //wildcard// ''*'' dans le nom de l'hôte pour gérer un ensemble de serveurs sur des domaines proches par ex., l'ordre dans lequel on les déclare peut avoir son importance : il faut commencer par les plus spécifiques, sans quoi ceux-ci ne seront jamais pris en compte.\\
Par ex. :
Host db.infra
ForwardAgent yes
User moi-même
Host *.infra
User root
===== Accéder à un serveur SSH dont les ports entrants sont bloqués =====
Il peut arriver que les ports des connexions entrantes sur un serveur SSH soient bloqués ((le cas peut se présenter notamment en entreprise ou derrière une box)). Cependant, il est rare que les ports sortants soient fermés. Dans ce cas, il est possible de faire appel à du //Reverse-SSH// tel qu'expliqué sur **[[:tutoriel:reverse_ssh|cette page]]**.
===== Voir aussi =====
* [[https://www.openssh.com/|site officiel]] d'OpenSSH
* [[:cssh]] : Cluster SSH
* [[https://www.ssi.gouv.fr/uploads/2014/01/NT_OpenSSH.pdf|note ministérielle du 17 août 2015]] : Recommandations pour un usage sécurisé d'(Open)SSH
* [[https://infosec.mozilla.org/guidelines/openssh|Guide de Mozilla pour la configuration d'OpenSSH]]
* [[https://www.it-connect.fr/cours-tutoriels/administration-systemes/linux/ssh/|Tutoriels sur l'utilisation et la configuration avancée de SSH]] sur IT-Connect
* [[https://www.ssh-audit.com/hardening_guides.html|Guide de ssh-audit pour blinder la configuration]]
* [[:ssh_avance]] Fixme !
//[[:Contributeurs]] : [[:utilisateurs:sx1]], [[:utilisateurs:krodelabestiole]], [[:utilisateurs:Zer00CooL]], [[:utilisateurs:bruno]].//