| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
| ssh [Le 26/01/2025, 02:31] – [Authentification par un système de clés publique/privée] Thomas DC | ssh [Le 23/04/2026, 22:18] (Version actuelle) – [Installation du client SSH] simplification | description client | +macOS | suppr HS / doublon (parefeu) | mise en forme krodelabestiole |
|---|
| <note warning>Ce document ne traite traite pas le fonctionnement du serveur SSH de windows</note> | {{tag>administration sécurité serveur réseau partage}} |
| | |
| {{tag>administration sécurité serveur}} | |
| |
| | {{ :logo_openssh.png?120|Puffy la mascotte de OpenSSH}} |
| ====== SSH ====== | ====== SSH ====== |
| |
| <note>Cette page présente les usages les plus courants de SSH et sa configuration de base. | <note>Cette page présente les usages les plus courants de SSH et sa configuration de base. |
| |
| Voir sur [[:ssh avancé|SSH Avancé]] pour les autres usages.</note> | Voir la page //[[:ssh avancé|SSH Avancé]]// ou //[[:SFTP]]// pour d'autres usages.</note> |
| |
| {{ :logo_openssh.png|Puffy la mascotte de OpenSSH}} | **[[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. |
| |
| [[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 à ce serveur. |
| |
| | **[[wpfr>Secure_Shell|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]]**. |
| |
| Par défaut, un serveur SSH écoute sur le port TCP standard 22. Un programme client SSH est généralement utilisé pour établir des connexions avec le serveur qui exécute un démon sshd. | <note important> |
| | 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]]//). |
| | </note> |
| |
| | 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é]]). |
| |
| SSH remplace de manière sécurisée : | ===== OpenSSH ===== |
| * Telnet : vous pouvez exécuter des commandes depuis un réseau local ou Internet via SSH | |
| * FTP : si vous ne souhaitez qu'ajouter ou modifier des fichiers sur un serveur, SFTP est bien plus adapté que FTP | |
| * Et d'autres, via le « tunneling » : on peut accéder à un service réseau en le faisant circuler dans un tunnel SSH pour profiter de toutes les protections qu'il apporte. Vous pouvez donc sécuriser n'importe quel service grâce à SSH, comme VNC par exemple. | |
| |
| <note important>Beaucoup d'utilisateurs de Telnet, Rlogin, FTP, ou autres programmes de communication ne se rendent pas compte que leurs données et notamment les mots de passe sont transmis en clair sur le réseau, ce qui constitue une faille de sécurité évidente (voir //[[wpfr>Analyseur_de_paquets|sniffing]]//).</note> | **[[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. |
| |
| Les usages de SSH sont entre autre : | **OpenSSH** se compose de deux outils principaux : |
| * Accéder à distance à la console en ligne commande (shell), ce qui permet d'effectuer la totalité des opérations courantes et/ou d'administration sur la machine distante. | * Le **[[#serveur]]** doit être installé sur la machine -- distante -- //à laquelle// on souhaite se connecter, pour la contrôler, accéder à des fichiers, l'utiliser comme //[[:ssh_avance#tunneliser_sa_connexion_internet_par_ssh_sans_squid|proxy]]//, etc. (le terme //serveur// détermine aussi bien le service qui tourne sur l'ordinateur que l'ordinateur lui-même (pour plus d'information à ce sujet, voir la page //[[:Serveur]]//). Il est fourni par le paquet ''[[pu>openssh-server]]'', qui n'est généralement pas [[#Installation|installé]] par défaut. |
| * Déporter l'affichage graphique de la machine distante. | * Le **[[#client]]** est l'interface locale, avec laquelle on interagit directement, et qui permet de réaliser différentes tâches à distance. Pour **OpenSSH** il s'agit d'une application en ligne de commande fournie par le paquet ''[[pu>openssh-client]]'', installé par défaut sur Ubuntu. Celui-ci donne accès à la [[:console]] distante comme si elle était locale, via le [[:terminal]]. Mais il existe d'autres types de clients (voir l'introduction du chapitre //[[#Client]]//). |
| * Transferts de fichiers en ligne de commande. | |
| * Montage ponctuel de répertoires distants, soit en ligne de commande, soit via [[:Nautilus]] sous [[:GNOME]] par exemple. | |
| * Montage automatique de répertoires distants. | |
| * Déporter de nombreux autres services ou protocoles (voir [[:ssh avancé|SSH Avancé]]). | |
| |
| **OpenSSH** est la solution la plus utilisée pour mettre en place une communication SSH via un ensemble d'outils libres dont certains sont installés par défaut sur Ubuntu. | ===== Serveur ===== |
| Comme son nom l'indique, **OpenSSH** est développé dans le cadre du projet [[http://www.openbsd.org|OpenBSD]]. | |
| C'est cette solution que nous traiterons sur cette page. | |
| |
| ===== Installation ===== | ==== Installation ==== |
| Si vous voulez accéder à un ordinateur (votre ordinateur personnel, votre serveur local, un serveur distant dont vous effectuez l'administration, etc.). | |
| Vous devez installer **[[apt>openssh-server]]** sur la machine à joindre en SSH, cette machine sera le "serveur" SSH. | |
| |
| La partie cliente est fournie par le paquet [[apt>openssh-client]], qui est installé par défaut sous Ubuntu. | 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. |
| |
| Vous pouvez vérifier ce qui est déjà installé en tapant ces commandes : | La commande suivante permet de connaître la version de la bibliothèque [[wpfr>Transport_Layer_Security|TLS]] (anciennement SSL, le nom est resté) : |
| <code bash>ssh -V</code> | |
| qui retourne une ligne du type : | |
| <code>OpenSSH_8.2p1 Ubuntu-4ubuntu0.5, OpenSSL 1.1.1f 31 Mar 2020</code> | |
| et aussi la commande suivante pour connaître la version de la bibliothèque ssl: | |
| <code bash>dpkg -l libssl*</code> | <code bash>dpkg -l libssl*</code> |
| ==== Installation du serveur SSH ==== | |
| |
| [[:tutoriel:comment_installer_un_paquet|Installez le paquet]] **[[apt>openssh-server|openssh-server]]** sur votre poste. | ==== Utilisation ==== |
| |
| === Utilisation du serveur SSH === | Le serveur SSH fonctionne en tant que [[:services|service]] lancé automatiquement au démarrage de la machine. |
| Le serveur SSH fonctionne en tant que [[:services|service]] lancé automatiquement au démarrage de la machine.\\ | |
| Il est possible notamment de : | |
| * L'[[#activer]] ou l'[[#arrêter]] : par exemple si vous souhaitez désactiver momentanément le serveur SSH | |
| * Le [[#relancer]] : par exemple si vous faites une modification de configuration | |
| |
| Vous trouverez en fin de cette page plus d'information sur la [[#Configuration du serveur SSH]], peu sécurisée par défaut. | Il est notamment possible de : |
| | * le [[#démarrer]] 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. |
| |
| == Vérifier le status == | Vous trouverez plus bas des information sur la [[#configuration du serveur]] SSH, //peu sécurisé par défaut//. |
| | |
| | === Vérifier le status === |
| Saisissez dans un [[:terminal]] la [[:commande_shell|commande]] suivante : | Saisissez dans un [[:terminal]] la [[:commande_shell|commande]] suivante : |
| <code bash>sudo systemctl status ssh</code> | <code bash>sudo systemctl status ssh</code> |
| |
| == Activer == | === Démarrer === |
| Saisissez dans un [[:terminal]] la [[:commande_shell|commande]] suivante : | Saisissez dans un [[:terminal]] la [[:commande_shell|commande]] suivante : |
| <code bash>sudo systemctl start ssh</code> | <code bash>sudo systemctl start ssh</code> |
| |
| == Arrêter == | === Arrêter === |
| <code bash>sudo systemctl stop ssh</code> | <code bash>sudo systemctl stop ssh</code> |
| |
| == Relancer == | === Relancer === |
| <code bash>sudo systemctl restart ssh</code> | <code bash>sudo systemctl restart ssh</code> |
| |
| ==== Installation du client SSH ==== | ==== Configuration du serveur ==== |
| |
| Sur le poste client **openssh-client** est déjà installé par défaut. Dans le cas contraire [[:tutoriel:comment_installer_un_paquet|Installez le paquet]] **[[apt>openssh-client]]**.\\ | <note warning> |
| | La configuration par défaut du serveur SSH sous Ubuntu est fonctionnelle, mais n'apporte pas un niveau de sécurité suffisant pour l'exposer sur Internet ! |
| |
| == Clients pour machines qui ne sont pas sous Linux == | Pour cela il faut désactiver l'[[#authentification par mot de passe]] et forcer l'[[#authentification_par_un_systeme_de_cles_publiqueprivee|utilisation de clés]]. |
| <note tips> | |
| Sous windows10 vous pouvez installer une Ubuntu via [[wpfr>Windows_Subsystem_for_Linux|WSL]], vous aurez alors accès à un vrai client SSH :) | |
| </note> | </note> |
| |
| Si vous devez prendre le contrôle depuis un poste équipé de Windows vous pouvez installer [[http://www.chiark.greenend.org.uk/~sgtatham/putty/|PuTTY]] qui est disponible sous licence MIT (une licence libre comparable à la licence BSD), openssh est installable dans le shell Windows depuis la version 1809 https://docs.microsoft.com/fr-fr/windows-server/administration/openssh/openssh_install_firstuse. | Le fichier de configuration à [[:tutoriel:comment_editer_un_fichier|éditer avec les droits d'administration]] est ''/etc/ssh/sshd_config''. |
| |
| Si vous voulez établir une connexion SSH depuis un smartphone Blackberry(r), vous pouvez installer [[http://bbssh.org/|bbssh]], qui est sous licence libre GPLv2, les sources sont fournies. | <note tip> |
| | Bien que ce soit rarement documenté, il peut être plus fiable de créer et éditer les directives de configuration dans un fichier ''/etc/ssh/sshd_config.d/custom.conf'' plutôt que directement dans ''/etc/ssh/sshd_config''. |
| |
| Il existe aussi des clients SSH pour Android (connectbot), J2ME (téléphones portables Java), iPhone, et quasiment tous les systèmes d'exploitation trouvables. | Ce fichier surchargera les valeurs déclarées dans ''/etc/ssh/sshd_config'' sans risquer d'être écrasé par une [[:upgrade|mise à niveau majeure]]. |
| | </note> |
| |
| <note tip>Vérifiez bien que [[:UFW]], le gestionnaire de firewall standard sous Ubuntu, n'est pas actif sur le __serveur SSH__ **AVANT** l'installation de SSH. Il ne devrait pas fonctionner si vous ne l'avez pas activé.\\ | === Édition === |
| Si UFW est actif, vous avez intérêt à vérifier s'il laisse passer le port standard du protocole SSH, le 22. Si ce n'est pas le cas, vous ne pourrez pas utiliser SSH sur cette machine.\\ | |
| Voyez la page [[:UFW]] pour connaître le fonctionnement du pare-feu, ou, utilisez [[:gufw|Gufw]] l'interface graphique du pare-feu UFW. | Pour éditer le fichier ''/etc/ssh/sshd_config'' (ou plutôt ''/etc/ssh/sshd_config.d/custom.conf'', voir note ci-dessus) avec les [[:permissions administrateur]] (requiert le mot de passe), il existe deux possibilités : |
| | * utiliser un éditeur de texte "graphique" qui propose un [[:elevation_privileges#gnome_fichiers_et_gedit|mode administrateur]], par exemple : |
| | * avec l'éditeur de texte par défaut depuis la version [[:kinetic|Kinetic 22.10]] de Ubuntu ([[:GNOME]]) :<code>gted admin:///etc/ssh/sshd_config</code> |
| | * ou (pour les versions d'Ubuntu antérieures) :<code>gedit admin:///etc/ssh/sshd_config</code> |
| | * ou avec un éditeur de texte en mode [[:terminal|console]] :<code>sudoedit /etc/ssh/sshd_config</code>qui sous ×buntu équivaut à :<code>sudo nano /etc/ssh/sshd_config</code> |
| | |
| | === Directives === |
| | |
| | Tableau des principales directives à modifier si besoin : |
| | |
| | ^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]]''. |
| | |
| | ==== 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]]**. |
| | |
| | ===== Client ===== |
| | |
| | Le //client// permet d'utiliser le [[:terminal]] local pour créer et accéder à une [[:session utilisateur|session]] distante. On interagit directement avec lui, et il permet de réaliser différentes tâches à distance. |
| | |
| | Il existe plusieurs sortes de clients : |
| | * Pour **OpenSSH** il s'agit de la commande ''[[man>ssh]]'' fournie par le paquet ''[[pu>openssh-client]]'', installé par défaut sur Ubuntu. Celle-ci donne accès à la [[:console]] distante, comme si elle était locale, via le [[:terminal]]. Voir //[[#Accès au terminal à distance]]//. |
| | * On peut aussi utiliser **SSH** via le gestionnaire de fichiers grâce à [[:SFTP]], voir le chapitre //[[:sftp#clients|clients SFTP]]//. Pour [[:nautilus|GNOME Fichiers]] en particulier, voir le chapitre //[[:sftp#GNOME Fichiers]]//. |
| | * On peut aussi télécharger, téléverser ou synchroniser des fichiers grâce à [[#transferts_en_ligne_de_commande|différentes commandes]], ou à **[[:rclone]]**. |
| | * D'autres cas d'utilisation ([[:ssh_avance#se_connecter_en_ssh_a_travers_un_mandataire_http_proxy|proxy]] par ex.) sont décrits sur la page //[[:SSH avancé]]//. |
| | |
| | ==== Installation du client en ligne de commande ==== |
| | |
| | La fonctionnalité //[[#Installation du client SSH|client]]// (en ligne de commande) est fournie par le paquet ''[[apt>openssh-client]]'', qui est installé par défaut sur Ubuntu (et sur la plupart des [[:distributions]] Linux). |
| | |
| | Dans le cas contraire, [[:deb#installer_un_paquet_deb|installer le paquet]] ''[[apt>openssh-client]]'', qui fournit la [[:commande shell|commande]] ''[[man>ssh]]''. |
| | |
| | <note tip> |
| | On peut vérifier la version installée avec l'option ''-V'' : |
| | <code bash>ssh -V</code> |
| </note> | </note> |
| |
| ===== Utilisations de SSH===== | === Autres systèmes d'exploitation === |
| |
| ==== Accès à distance à la console en ligne de commande (shell ssh) ==== | == Windows == |
| |
| Pour ouvrir une session distant ayant un serveur SSH, vous devez écrire quelque chose comme ceci : | <note tips> |
| <code>ssh <nom_utilisateur>@<ipaddress> -p <num_port></code> | Sur Windows on peut installer Ubuntu via **[[:WSL]]**. On aura alors accès au client **[[wpfr>OpenSSH]]**. |
| __Exemple__ : | </note> |
| <code>ssh phyrex@192.168.23.42 -p 12345</code> | |
| L'option **-p <num_port>** qui précise le port utilisé par le serveur est facultative. Si rien n'est précisé, c'est le port 22 qui sera utilisé par défaut (protocole TCP). | |
| |
| Pour se connecter avec SSH en IPV6 depuis un terminal, écrire sans crochet : | Pour contrôler une machine distante depuis un poste équipé de Windows, 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 ?]]//)) |
| <code>ssh -6 <nom_utilisateur>@<adresse ipv6> </code> | |
| __Exemple__ : | |
| par exemple pour un lien Internet : | |
| <code>ssh -6 alfred@2a01:e35:2431::2e57</code> | |
| |
| | On peut aussi installer et utiliser **[[https://putty.org/index.html|PuTTY]]**, qui est publié sous [[wpfr>licence MIT]]. |
| | |
| | == macOS == |
| | |
| | macOS inclut un client SSH disponible depuis le terminal. |
| | |
| | Il existe aussi [[https://sshpilot.app/|SSH Pilot]] ([[wpfr>logiciel libre|libre]]) et [[https://termius.com|Termius]] -- qui sont d'ailleurs aussi disponibles sur Linux((Par exemple en [[:Flatpak]] : [[https://flathub.org/fr/apps/io.github.mfat.sshpilot|SSH Pilot]] / [[https://flathub.org/fr/apps/com.termius.Termius|Termius]])). |
| | |
| | == Smartphones == |
| | |
| | Il existe aussi des clients SSH pour **Android** (voir le dépôt d'applications [[wpfr>logiciel libre|libres]] [[https://search.f-droid.org/?q=ssh&lang=fr|F-Droid]]), **iOS**, et la plupart des systèmes d'exploitation. |
| | |
| | ==== Utilisations des clients ==== |
| | |
| | === Accès au terminal à distance === |
| | |
| | Pour ouvrir une [[:session utilisateur|session]] distante en SSH (se connecter à un serveur) avec la [[:commande shell|commande]] ''[[man>ssh]]'' : |
| | <code bash>ssh nom_utilisateur@hôte -p numéro_de_port</code> |
| | où |
| | * ''nom_utilisateur'' est le nom d'[[:utilisateur]] à utiliser sur la machine distante |
| | * ''hôte'' est le [[:réseau#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 (voir //[[:réseau#Nom d'hôte]]//) |
| | * ''numéro de port'' est le numéro du port sur lequel écoute le serveur. |
| | |
| | Exemple : |
| | <code bash>ssh bernadette@example.com -p 12345</code> |
| | 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 : |
| | <code bash>ssh -6 nom_utilisateur@adresse_IPv6</code> |
| | où ''adresse_IPv6'' est l'adresse IPv6 du serveur. |
| | |
| | Exemple : |
| | <code bash>ssh -6 bernadette@2620:2d:4000:1::28</code> |
| |
| <note tip> | <note tip> |
| Vous pouvez aussi appeler un ordinateur par son nom : | 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//. |
| <code>ssh utilisateur@nom_machine</code> | |
| à partir du moment où celui-ci est résolu en adresse IP par votre machine. | Exemple :\\ |
| | port externe ''22001'' redirigé vers ''192.168.0.1:22''\\ |
| | port externe ''22002'' redirigé vers ''192.168.0.2:22'' |
| |
| Cela peut se faire sur le réseau local par le fichier **/etc/hosts** (ou bien, pour passer par une interface graphique, en tapant dans un terminal <code>network-admin</code> puis en allant dans l'onglet "Hôtes", continuer en déverrouillant les droits administration en cliquant sur le cadenas, et enfin, en cliquant sur le bouton "ajouter"), éventuellement distribué d'un serveur vers les clients locaux au travers de [[wpfr>Network_Information_Service|NIS]], ou bien par un service de [[wpfr>Domain_Name_System|DNS]] si vous accédez à une machine distante (serveur loué) pour lequel vous avez enregistré un nom de domaine. | Ensuite utilisez l'option ''-p 22002'' pour connecter par exemple la machine ayant pour adresse ''192.168.0.2'' sur le réseau local. |
| </note> | </note> |
| <note tip>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.\\ __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</note> | |
| |
| ==== Outil graphique pour les connexions SSH ==== | === Outil graphique pour les connexions SSH === |
| |
| [[:remmina|Remmina]] est actuellement l'outil le plus complet pour la gestion des bureaux à distance. | == URL == |
| |
| ==== Affichage graphique déporté (Tunneling serveurX par ssh) - Accéder aux applications graphiques ==== | Pour se connecter en SSH avec la plupart des autres outils, on utilise une [[:web#URL]]. |
| |
| La commande 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. | 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 [[:réseau#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 (voir //[[:réseau#Nom d'hôte]]//) |
| | * ''numéro de port'' est le numéro du port sur lequel écoute le serveur. |
| |
| Il suffit de passer l'option -X à ssh : | == Applications clientes == |
| <code>ssh -X nomtilisateur@Ipserver</code> | |
| |
| <note>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.</note> | * En plus d'afficher les bureaux à distance, [[:Remmina]] est aussi un client SSH, et donne accès au [[:terminal]]. |
| |
| Et on peut lancer : | On trouve aussi de nombreuses applications [[:Flatpak]] sur [[https://flathub.org/fr/apps/search?q=ssh|Flathub]] : |
| <code>nomUtilisateur@Ipserver$ xeyes</code> | * [[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]] |
| |
| là, l’œil de Moscou vous regarde depuis votre écran local ! \\ | === Affichage graphique déporté (Tunneling serveurX par ssh) - Accéder aux applications graphiques === |
| N.B. : pour que cet exemple fonctionne il faut que le paquet //x11-apps// qui fournit //xeyes// soit installé sur le serveur. | |
| |
| <note important>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.</note> | <note important> |
| | FIXME [[:xorg|X.org]] est déprécié au profit de [[:Wayland]]. Ce chapitre n'est plus d'actualité ! |
| | </note> |
| |
| | 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. |
| |
| ==== Transfert - copie de fichiers ==== | Il suffit de passer l'option ''-X'' à ''[[man>ssh]]'' : |
| | <code bash>ssh -X nomtilisateur@Ipserver</code> |
| |
| Pour copier un fichier à partir d'un ordinateur sur un autre avec SSH, vous devrez utiliser la commande **scp** ou **rcp**. Cela ressemblera à ceci : | <note>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.</note> |
| <code>scp <fichier> <username>@<ipaddressDistant>:<DestinationDirectory></code> | |
| et en IPv6 | |
| <code>scp -6 <élément> <nom>@[addresse ipv6]:<destination></code> | |
| |
| ==Exemples == | Et on peut lancer : |
| //__Pour un fichier:__// | <code bash>nomUtilisateur@Ipserver$ xeyes</code> |
| |
| <code>scp fichier.txt hornbeck@192.168.1.103:/home/hornbeck</code> | là, l’œil de Moscou vous regarde depuis votre écran local !\\ |
| et en IPv6 | <note>Pour que cet exemple fonctionne il faut que le paquet //x11-apps// qui fournit //xeyes// soit installé sur le serveur.</note> |
| <code>scp -6 fichier.txt albertine@[2a01:e35:2431::2a34]:/home/albertine</code> | |
| |
| //__Pour un répertoire:__// | <note important>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.</note> |
| |
| <code>scp -r répertoire hornbeck@192.168.1.103:/home/hornbeck/</code> | === Gestion des fichiers === |
| et en IPv6 | |
| <code>scp -6r répertoire/ albertine@[2a01:e35:2431::2a34]:/home/albertine</code> | == Transferts en ligne de commande == |
| | |
| | Pour copier un fichier à partir d'un ordinateur sur un autre avec SSH, on peut utiliser les commandes ''[[man>scp]]'' ou ''[[man>rcp]]'' : |
| | <code bash>scp <fichier> <username>@<ipaddressDistant>:<DestinationDirectory></code> |
| | et en [[wpfr>IPv6]] : |
| | <code bash>scp -6 <élément> <nom>@[addresse ipv6]:<destination></code> |
| | |
| | Exemples : |
| | * Pour un **fichier** :<code bash>scp fichier.txt hornbeck@192.168.1.103:/home/hornbeck</code>et en IPv6<code bash>scp -6 fichier.txt albertine@[2a01:e35:2431::2a34]:/home/albertine</code> |
| | * Pour un **répertoire** :<code bash>scp -r répertoire hornbeck@192.168.1.103:/home/hornbeck/</code>et en IPv6<code bash>scp -6r répertoire/ albertine@[2a01:e35:2431::2a34]:/home/albertine</code> |
| |
| Vous pouvez aussi bien copier des fichiers à partir des ordinateurs à distance sur votre disque local : | Vous pouvez aussi bien copier des fichiers à partir des ordinateurs à distance sur votre disque local : |
| <code>scp hornbeck@192.168.1.103:/home/hornbeck/urls.txt .</code> | <code bash>scp hornbeck@192.168.1.103:/home/hornbeck/urls.txt .</code> |
| Ici, le point **.** à la fin de commande indique de copier le fichier dans le répertoire courant. | Ici, le point ''.'' à la fin de commande indique de copier le fichier dans le répertoire courant. |
| |
| <note tip> | <note tip> |
| Pour les noms avec des espaces : | Pour les noms avec des espaces : |
| de distant vers local | de distant vers local |
| <code> | <code bash> |
| $ scp utilisateur@12.345.678.90:"le\ fichier" . | $ scp utilisateur@12.345.678.90:"le\ fichier" . |
| $ scp utilisateur@12.345.678.90:'"le fichier"' . | $ scp utilisateur@12.345.678.90:'"le fichier"' . |
| # Notez les simples ' ET doubles " guillemets ' " | # Notez les simples ' ET doubles " guillemets ' " |
| </code> | </code> |
| <code> | <code bash> |
| $ fichier="le fichier" #ou | $ fichier="le fichier" #ou |
| $ fichier=le\ fichier | $ fichier=le\ fichier |
| |
| de local vers distant c'est différent | de local vers distant c'est différent |
| <code> | <code bash> |
| $ scp le\ fichier utilisateur@12.345.678.90: | $ scp le\ fichier utilisateur@12.345.678.90: |
| le fichier 100% 0 0.0KB/s 00:00 | le fichier 100% 0 0.0KB/s 00:00 |
| le fichier 100% 0 0.0KB/s 00:00 | le fichier 100% 0 0.0KB/s 00:00 |
| </code> | </code> |
| <code> | <code bash> |
| $ fichier="le fichier" # ou | $ fichier="le fichier" # ou |
| $ fichier=le\ fichier | $ fichier=le\ fichier |
| </note> | </note> |
| |
| Vous pouvez aussi le renommer en le copiant (« mon.txt ») sur le disque local (toujours dans le répertoire courant): | Vous pouvez aussi le renommer en le copiant (''mon.txt'') sur le disque local (toujours dans le répertoire courant): |
| <code>scp hornbeck@192.168.1.103:/home/hornbeck/urls.txt ./mon.txt</code> | <code bash>scp hornbeck@192.168.1.103:/home/hornbeck/urls.txt ./mon.txt</code> |
| |
| Vous pouvez très bien copier un fichier d'un ordinateur vers un autre tout en étant sur un troisième ordinateur : | Vous pouvez très bien copier un fichier d'un ordinateur vers un autre tout en étant sur un troisième ordinateur : |
| <code>scp nom@ordi1:chemin/fichier nom@ordi2:chemin/fichier</code> | <code bash>scp nom@ordi1:chemin/fichier nom@ordi2:chemin/fichier</code> |
| |
| 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 : | 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 : |
| <code>scp -P port fichier.txt hornbeck@192.168.1.103:/home/hornbeck</code> | <code bash>scp -P port fichier.txt hornbeck@192.168.1.103:/home/hornbeck</code> |
| |
| <note important>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.</note> | <note important>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.</note> |
| ==== Transfert - synchronisation de répertoire ==== | |
| Vous pouvez sécuriser un répertoire en le dupliquant à travers le réseau en utilisant la commande [[:rsync|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éé. | === 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éé. |
| <code bash> sudo rsync -ahv --progress --stats --exclude={'.*','persistence.*'} a@b:/home/a /MAISON 2>err.log | <code bash> sudo rsync -ahv --progress --stats --exclude={'.*','persistence.*'} a@b:/home/a /MAISON 2>err.log |
| cat err.log</code> | cat err.log</code> |
| |
| | === Gestion de fichiers via SFTP === |
| |
| ==== Monter un répertoire distant, navigation via SFTP (Secure File Transfer Protocol) ==== | **[[:SFTP]]** est une autre méthode pour accéder à un support de stockage distant via **SSH**. |
| |
| [[wpfr>SSH_file_transfer_protocol|SFTP]] est une autre méthode pour accéder à ses fichiers via SSH. Au lieu de travailler fichier par fichier, il est possible grâce à cette méthode de naviguer dans ses fichiers depuis un client SFTP. Ce type d'accès est possible grâce à des outils comme [[#Nautilus]], [[#Konqueror]], [[#Dolphin]], [[#WinSCP]], [[#Pcmanfm]] ou [[#FileZilla]], dont la mise en œuvre est décrite dans les sections suivantes. | Il suffit de mettre en place une connexion **SSH** pour monter un serveur **SFTP**. |
| |
| === Nautilus === | <note> |
| | Voir la page dédiée à **[[:SFTP]]**, en particulier [[:sftp#clients|clients SFTP]]. |
| | </note> |
| |
| En utilisant le [[:gestionnaire de fichiers]] **[[:Nautilus]]**, vous pouvez également accéder aux emplacements à distance par l'intermédiaire de SSH pour passer en revue, modifier et copier des fichiers.\\ | ==== Configuration du client SSH ==== |
| Ouvrez Nautilus, puis dans la fenêtre emplacement (Ctrl + L), entrez l'URL suivante en remplaçant ''nom_utilisateur'', ''hostname'' et ''port'' en conséquence : | |
| <code>ssh://nom_utilisateur@hostname:port</code> | |
| |
| La copie de fichier se fait avec le glisser-déposer dans la fenêtre de Nautilus comme sur votre système de fichiers local. | Le client peut aussi être configuré par et pour chaque utilisateur via un fichier ''~/.ssh/config''. |
| |
| Pour accéder directement à un répertoire donné (pratique avec l'utilisation des signets), il suffit de rajouter le chemin en fin d'URL : | 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]]). |
| <code>ssh://username@hostname:port/le/chemin/voulu/</code> | * 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 également possible d'y avoir accès dans Nautilus par le menu //Fichiers -> Autres emplacements -> Se connecter à un serveur...// et choisir le ''Type de service'' « ssh ». | 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'' ([[:réseau#nom d'hôte]] à passer à la commande ''[[man>ssh.1|ssh]]'') différent du ''HostName'' ([[:réseau#nom d'hôte]] réel).\\ |
| | Par exemple : |
| | <file> |
| | Host serveur-perso |
| | HostName 192.168.1.2 |
| | User root |
| | PreferredAuthentications password |
| |
| === Dolphin ou Konqueror === | Host serveur-cloud |
| | HostName example.com |
| | User moi-même |
| | Port 2222 |
| | IdentityFile ~/chemin/orginal/id_ed25519 |
| | </file> |
| |
| Le principe est similaire à celui utilisé par [[#Nautilus]], à l'exception du nom de protocole : ''sftp''.\\ | Il peut notamment être intéressant d'ajouter |
| Dans la barre d'adresse, tapez : | <file> |
| <code>sftp://<nom_utilisateur>@<hostname></code> | ServerAliveInterval 240 |
| Une boîte de dialogue apparaîtra et demandera le mot de passe. | </file> |
| | 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. |
| |
| **Attention:** Si vous ne mentionnez pas le nom d'utilisateur, c'est l'utilisateur courant sur la machine locale qui aura la main. | Pour les autres options, voir **(//en//)** //[[https://man.openbsd.org/ssh_config|ssh_config - OpenBSD manual page server]]//. |
| |
| === Dolphin === | <note> |
| | Dans le cas où on utilise un //wildcard// ''*'' dans la valeur de ''Host'' 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.\\ |
| Le nouveau navigateur de [[:KDE]] permet de faire ça très simplement.\\ | Par ex. : |
| Cliquez sur le raccourci ''Réseau'', puis ''Ajoutez un dossier réseau''. Remplissez ensuite les champs demandés. Pensez à mettre la racine (dossier **/**) comme dossier d'accès pour pouvoir rentrer sur l'intégralité de l'ordinateur distant. | <file> |
| | Host db.infra |
| | ForwardAgent yes |
| | User moi-même |
| |
| Il est également possible de rentrer l'adresse et d'enregistrer le lien dans ses emplacements favoris : | Host *.infra |
| <code>sftp://nom_utilisateur@hostname:port</code> | User root |
| | </file> |
| === WinSCP === | </note> |
| | |
| Parce qu'il est parfois nécessaire de faire un transfert de fichier à partir d'une machine sous MS Windows, il existe un logiciel libre nommé ''WinSCP'' qui permet de faire du SFTP avec une interface semblable à celle des clients FTP. | |
| | |
| [[https://winscp.net/eng/docs/lang:fr|Site officiel du logiciel WinSCP]] | |
| | |
| === FileZilla === | |
| | |
| Sans avoir à chercher trop loin, [[:filezilla|FileZilla]], le client FTP compatible Linux, Windows et Mac OS X, permet aussi la connexion à un serveur SFTP (SSH File Transfer Protocol) depuis la version 3. | |
| | |
| === PCManFM === | |
| | |
| Dans la barre d'adresse de [[:PCManFM|PCManFM]], rentrez ceci : | |
| <code>sftp://nom_utilisateur_distant@IPduSERVEUR/dossier/que/je/veux</code> | |
| | |
| ==== Monter un répertoire distant de manière automatique (SFTP grâce à SSHFS) ==== | |
| | |
| **SSHFS** est un outil permettant d'utiliser le protocole **SSH** comme un système de fichier et ainsi monter un répertoire distant à travers le protocole SSH pour y accéder comme n'importe quel répertoire local à la manière d'un partage [[:nfs|NFS]]; mais sécurisé ! \\ | |
| Voir la page [[:sshfs|SSH Filesystem]]. | |
| |
| ===== Authentification ===== | ===== Authentification ===== |
| |
| L'authentification par mot de passe (transmis chiffré) est le mode d'identification par défaut. | 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 ==== | ==== Authentification par un système de clés publique/privée ==== |
| 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. | 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 ». | 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 : | Ceci peut permettre par exemple : |
| 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. | 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.\\ | 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. | Pour un maximum de sécurité il est possible de protéger cette clé privée au moyen d'un mot de passe. |
| |
| À moins que vous n'ayez déjà un couple de clés, vous devez d'abord en créer.\\ | À 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 : | Exemple pour une clé utilisant l'algorithme de chiffrement ED25519, vous saisirez dans le [[:terminal]] du client : |
| <code>ssh-keygen -t ed25519 -C "email@example.com"</code> | <code bash>ssh-keygen -t ed25519 -C "email@example.com"</code> |
| |
| On peut également utiliser l'algorithme RSA, plus ancien, moins sûr, et générant des clés plus grosses : | On peut également utiliser l'algorithme RSA, plus ancien, moins sûr, et générant des clés plus grosses : |
| <code>ssh-keygen -t rsa -b 4096 -C "email@example.com"</code> | <code bash>ssh-keygen -t rsa -b 4096 -C "email@example.com"</code> |
| | |
| 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). | |
| <note warning>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.</note> | |
| |
| Votre clef publique a été créée avec la nouvelle clef privée. Elles sont habituellement localisées dans le [[:fichier_cache|dossier caché]] **~/.ssh**: | 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). |
| | <note warning>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 <code bash>ssh-keygen -y -f .ssh/id_ed25519 # qui va demander la passphrase et afficher la clé publique si la saisie est correcte</code></note> |
| |
| **~/.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. | 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 : | Pour que votre ssh-agent reconnaisse cette paire de clefs, il faut utiliser la commande ssh-add : |
| <code>ssh-add | <code bash>ssh-add |
| #ou plus directement | #ou plus directement |
| ssh-add /chemin-complet/vers-la-cle/nom-cle</code> | ssh-add /chemin-complet/vers-la-cle/nom-cle</code> |
| Vous pouvez également vérifier la liste des paires de clefs existantes avec l'option -l (-list) : | Vous pouvez également vérifier la liste des paires de clefs existantes avec l'option -l (-list) : |
| <code>ssh-add -l</code> | <code bash>ssh-add -l</code> |
| <note tip>Si cette commande ressort : <code>The agent has no identities.</code> alors aucune clef n'est actuellement prise en compte. Il faut recommencer les étapes ci-dessus. | <note tip>Si cette commande ressort : <code>The agent has no identities.</code> alors aucune clef n'est actuellement prise en compte. Il faut recommencer les étapes ci-dessus. |
| |
| Si vous avez : <code>Could not open a connection to your authentication agent.</code> alors faire <code>eval "$(ssh-agent)"</code> puis de nouveau <code>ssh-add</code> | Si vous avez : <code>Could not open a connection to your authentication agent.</code> alors faire <code bash>eval "$(ssh-agent)"</code> puis de nouveau <code bash>ssh-add</code> |
| </note> | </note> |
| <note tip>pistes pour débugger : | <note tip>pistes pour débugger : |
| * forcer l'utilisation uniquement de clefs dans la commande ssh : <code>ssh -o PubkeyAuthentication=yes -o PreferredAuthentications=publickey</code> | * forcer l'utilisation uniquement de clefs dans la commande ssh : <code bash>ssh -o PubkeyAuthentication=yes -o PreferredAuthentications=publickey</code> |
| * utiliser les options **-v** ou **-vv** ou **-vvv** dans le commande ssh | * utiliser les options ''-v'' ou ''-vv'' ou ''-vvv'' dans le commande ssh |
| </note> | </note> |
| Il faut maintenant envoyer au serveur votre clé publique pour qu'il puisse vous chiffrer des messages. | Il faut maintenant envoyer au serveur votre clé publique pour qu'il puisse vous chiffrer des messages. |
| |
| <note>**En résumé** (car les paragraphes ci-dessous utilisant des scripts peuvent sembler confus à certains) | <note> |
| * Coté client : Il faut que le client ait mis sa clé privée en $HOME/.ssh/ (côté client). | **En résumé** (car les paragraphes ci-dessous utilisant des scripts peuvent sembler confus à certains) |
| * Coté client : la clé doit être connue de l'agent ssh (ssh-add) | * Coté client : Il faut que le client ait mis sa clé privée en ''$HOME/.ssh/'' (côté client). |
| * 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é client : la clé doit être connue de l'agent SSH (''[[man>ssh-add]]''). |
| * Coté serveur : La clé publique du client doit se trouver dans le fichier $HOME/.ssh/authorized_keys du serveur. | * 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 : il vaut mieux refuser l'accès par mot de passe ("PasswordAuthentication no" dans /etc/ssh/sshd_config du serveur) | * 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). |
| </note> | </note> |
| |
| 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 //ssh-copy-id//. | 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'' 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). |
| <code>ssh-copy-id -i ~/.ssh/id_ed25519.pub <username>@<ipaddress></code> | <code bash>ssh-copy-id -i ~/.ssh/id_ed25519.pub <username>@<ipaddress></code> |
| ou si le port est différent du port standard 22 ([[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=99785|notez les guillemets]]): | ou si le port est différent du port standard 22 ([[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=99785|notez les guillemets]]): |
| <code>ssh-copy-id -i ~/.ssh/id_ed25519.pub -p <num_port> "<username>@<ipaddress>"</code> | <code bash>ssh-copy-id -i ~/.ssh/id_ed25519.pub -p <num_port> "<username>@<ipaddress>"</code> |
| |
| 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. | 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.\\ | 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 : | Voici une ligne à copier pour ajouter sa clé publique sur le serveur distant : |
| <code>ssh login@serveur "echo $(cat ~/.ssh/id_id_ed25519.pub) >> .ssh/authorized_keys"</code> | <code bash>ssh login@serveur "echo $(cat ~/.ssh/id_id_ed25519.pub) >> .ssh/authorized_keys"</code> |
| Lancez : | Lancez : |
| <code>ssh <username>@<ipaddress> -p <num_port></code> | <code bash>ssh <username>@<ipaddress> -p <num_port></code> |
| 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. | 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 : | 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 : |
| <code>tail -f /var/log/auth.log</code> | <code bash>tail -f /var/log/auth.log</code> |
| 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'')) | 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 : | 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** clé privée**, chiffrée ; |
| - **Votre passphrase**, utilisée pour déchiffrer votre clé privé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. | 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. |
| |
| == Authentification par mot de passe et / ou par clé == | == 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 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 : | 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'' | - A la ligne ''PasswordAuthentication'' mettre ''no'' |
| |
| 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//.\\ | 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 : | 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 : |
| <file>Authentication refused: bad ownership or modes for directory /home/votre_login</file> | <file>Authentication refused: bad ownership or modes for directory /home/votre_login</file> |
| Alors faites : | Alors faites : |
| <code>chmod 755 $HOME</code> | <code bash>chmod 755 $HOME</code> |
| Et tout devrait rentrer dans l'ordre. | Et tout devrait rentrer dans l'ordre. |
| |
| Effectuez les opérations suivantes : | Effectuez les opérations suivantes : |
| |
| Sur le serveur : \\ | 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.\\ | * 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 | * saisissez ensuite les commandes suivantes |
| <code>chmod go-w ~/ | <code bash>chmod go-w ~/ |
| chmod 700 ~/.ssh | chmod 700 ~/.ssh |
| chmod 600 ~/.ssh/authorized_keys</code> | chmod 600 ~/.ssh/authorized_keys</code> |
| |
| * Sur le client, dans **/etc/ssh/ssh_config**, rajoutez la ligne ''PreferredAuthentications publickey''.\\ | * Sur le client, dans ''/etc/ssh/ssh_config'', ajoutez la ligne ''PreferredAuthentications publickey''. |
| |
| == Gestion des clés == | == Gestion des clés == |
| </code> | </code> |
| | |
| 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.\\ | 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.\\ | 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/<vous>/.ssh/known_hosts:4 → la clé en erreur est donc située ligne 4 du fichier **.ssh/known_hosts** | Pour reprendre l'exemple précédent on peut lire la ligne ''Offending key in /home/<vous>/.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 : | Il existe cependant une méthode plus subtile en employant la commande suivante : |
| <code>ssh-keygen -R <ip></code> | <code bash>ssh-keygen -R <ip></code> |
| | |
| Vous pourrez ainsi effacer seulement l'adresse IP concernée et relancer un ssh. | Vous pourrez ainsi effacer seulement l'adresse IP concernée et relancer un ssh. |
| == Connexion à un répertoire /home chiffré == | == 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. | 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/répertoire ''.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 répertoire ''.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]] | 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 == | == Authentification SSH avec plusieurs clés privées == |
| |
| 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: | 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: |
| <code bash>git@gitlab.com: Permission denied (publickey).</code> | <code>git@gitlab.com: Permission denied (publickey).</code> |
| |
| 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 : | 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 : |
| <file> | <file> |
| Host adresse-serveur-sans-passphrase.com | Host adresse-serveur-sans-passphrase.com |
| </file> | </file> |
| |
| 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)]] | 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) == | == 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 : | Retrouver l'empreinte de notre clef SSH, pour la communiquer à une personne qui veut se connecter et va utiliser notre clef publique : |
| <code>ssh-keygen -l</code> | <code bash>ssh-keygen -l</code> |
| Ensuite la commande demande le fichier de la clef publique. Sur un serveur on spécifiera **/etc/ssh/ssh_host_rsa_key.pub**. | 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 : | ===== Problèmes courants ===== |
| |
| ^Directive du fichier^Valeur par défaut sous Ubuntu^Valeur possible^Effet de la valeur choisie^ | Lorsqu'on a des difficultés à se connecter, on peut utiliser l'option ''-v'', ''-vv'' ou ''-vvv'' avec le client ''[[man>ssh.1|ssh]]'' pour afficher davantage d'informations (mode **v**erbeux). Le degré de verbosité dépend du nombre de ''v'' (''-vvv'' est très bavard). |
| |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, 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''. | <note>Voir aussi le chapitre //[[:ssh_avance#Problèmes et solutions]]//.</note> |
| | |
| | ==== Messages d'erreur ==== |
| | |
| | Même sans le mode verbeux, le message d'erreur final donne des indices sur la cause du problème : |
| | |
| | === No route to host === |
| | |
| | ''No route to host'' (pas de route vers l'[[:réseau#nom d'hôte|hôte]]) indique que la machine visée (le serveur) est introuvable : |
| | * soit elle n'est pas à cette [[:réseau#nom d'hôte|adresse]] |
| | * soit elle est éteinte |
| | * soit elle n'est pas accessible : |
| | * l'une des deux machines (client ou serveur) n'est pas connectée |
| | * elles ne sont pas sur le même [[:réseau]] ou sous-réseau |
| | * ou un [[:pare-feu]] bloque la connexion. |
| | |
| | On peut dans ce cas vérifier sa configuration [[:réseau]] et utiliser la commande ''[[man>ping]]'' pour surveiller l'accès au serveur : |
| | ping hôte |
| | où ''hôte'' est le [[:réseau#nom d'hôte]] ou l'adresse IP du serveur (''Ctrl''+''C'' pour quitter), |
| | |
| | ou la commande ''[[man>nc]]'' ([[wpfr>netcat]]) pour tester l'accès par le bon port (ici le port ''22'') : |
| | nc -zv hôte 22 |
| | |
| | === Connection refused === |
| | |
| | ''Connection refused'' indique que la machine existe, mais |
| | * soit que l'application de serveur SSH n'est pas lancée |
| | * soit qu'elle écoute sur un autre port. |
| | |
| | == Côté serveur == |
| | |
| | On peut dans ce cas vérifier l'état du //daemon// côté serveur : |
| | systemctl status ssh |
| | pour savoir si il est lancé, ou |
| | sudo systemctl status ssh |
| | pour afficher en plus un extrait du journal. |
| | |
| | On peut aussi connaître le numéro des ports en écoute avec la commande ''[[man>ss]]'' : |
| | ss -t |
| | ou vérifier celui déclaré dans la [[#configuration du serveur SSH]] : |
| | sudo grep -i port /etc/ssh/sshd_config |
| | |
| | == Côté client == |
| | |
| | Si on n'a pas accès au serveur, on peut éventuellement utiliser ''[[man>nmap]]'' depuis le client pour scanner les ports disponibles : |
| | nmap -p- hôte |
| | où ''hôte'' est le [[:réseau#nom d'hôte]] ou l'adresse IP du serveur. |
| | |
| | === Permission denied === |
| | |
| | ''Permission denied'' indique que le serveur est bien opérationnel à cette adresse et sur ce port, mais qu'on n'a pas réussi à s'y authentifier et que la permission de se connecter nous est donc refusée. |
| | |
| | Le message est suivi d'une indication sur les méthodes d'authentification proposées par le serveur : par ex. ''Permission denied (publickey)'' ou ''Permission denied (publickey,password)''. |
| | |
| | Il faut dans ce cas vérifier sa configuration concernant l'[[#authentification]]. L'utilisation du mode verbeux ''-vvv'' peut aider à ce niveau, en décrivant par exemple des problèmes de [[:permissions]] dans le répertoire ''~/.ssh'', ou des discordances entre les méthodes d'authentification proposées par le serveur et celle présentée par le client... |
| |
| ===== Configuration du client SSH ===== | |
| Le client peut aussi être configuré… via le fichier **/etc/ssh/ssh_config** | |
| Il est notamment intéressant d'ajouter | |
| <code> | |
| ServerAliveInterval 240 | |
| </code> | |
| Pour que le client envoie des infos au server (ici toute les 4 minutes) et que ce dernier ne coupe pas la liaison, ce qui bloque (fige) le terminal. | |
| Pour voir les autres options: [[https://man.openbsd.org/ssh_config]] (en) | |
| ===== 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é dans **[[:tutoriel:reverse_ssh|cette page]]** | |
| ===== Voir aussi ===== | ===== Voir aussi ===== |
| * [[https://www.openssh.com/|site officiel]] | |
| | * [[https://www.openssh.com/|site officiel]] d'OpenSSH |
| * [[:cssh]] : Cluster SSH | * [[: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://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 |
| * [[:ssh_avance]] Fixme ! | * [[:ssh_avance]] Fixme ! |
| |
| //Contributeurs: [[:utilisateurs:sx1]], [[:utilisateurs:krodelabestiole]], [[:utilisateurs:Zer00CooL]], [[:utilisateurs:bruno]]// | ----- |
| | //[[:Contributeurs]] : [[:utilisateurs:sx1]], [[:utilisateurs:krodelabestiole]], [[:utilisateurs:Zer00CooL]], [[:utilisateurs:bruno]].// |