ToDo : fusionner (et traduire) cette page avec la version anglaise (+1 La page fr semble en avance sur la version anglaise.)

Introduction

SSH1Secure SHell ») est un protocole de communication sécurisé. Il permet, entre autres, de se connecter à un hôte à distance de façon sécurisée sur un réseau qui ne l'est pas forcément. Rendez-vous sur Wikipedia - Secure Shell pour plus d'informations, ainsi que ssh, lsh-client ou dropbear pour découvrir quelques implémentations du protocole SSH présentes dans Debian, avec bien sûr OpenSSH qui est probablement la plus populaire2. SSH remplace et améliore telnet,rlogin et rsh, qui sont tous des protocoles de communication à distance mais n'incluant aucune couche de sécurité.

Dans ce document nous allons utiliser la suite OpenSSH, et il sera également supposé que les deux variables suivantes seront définies :

hôte_distant=<l'ordinateur à distance>
utilisateur_distant=<nom d'utilisateur sur $hôte_distant>

Par conséquent, pour reproduire les commandes ci-dessous, veillez à bien remplacer ces valeurs par celles qui vous intéressent. Notez aussi que « hôte_distant » peut être une adresse IP.

Installation

Installation du client

Normalement, le client est installé par défaut, sinon il suffit de saisir en tant que superutilisateur :

apt install openssh-client

Installation du serveur

La partie serveur permet à des hôtes distants de se connecter à votre système et sera installée comme suit en tant que superutilisateur :

apt install openssh-server

Fichiers de configuration

Les principaux fichiers de configuration sont dans le répertoire /etc/ssh :

De plus, ce répertoire contient les couples de clés privées/publiques identifiant vos hôtes :

Depuis OpenSSH 5.73, une nouvelle paire de clés a fait son apparition :

Depuis OpenSSH 6.54, une nouvelle paire de clés a fait son apparition :

Régénérer les clés hôte

rm /etc/ssh/ssh_host_*
dpkg-reconfigure openssh-server

Accès sur une machine distante

Avec mot de passe

Si vous voulez vous connectez à la machine $hôte_distant avec l'utilisateur $utilisateur_distant, saisissez simplement

ssh $utilisateur_distant@$hôte_distant

et saisir votre mot de passe.

Si le nom d'utilisateur sur le système local et la machine distante sont les mêmes, vous pouvez omettre la partie $utilisateur_distant@ et saisir simplement

ssh $hôte_distant

Si c'est la première fois que vous vous connectez à l'hôte distant, le client ssh va vous demander si vous êtes certain de vouloir vous connecter à la machine distante. Répondez « oui » après avoir vérifié l'empreinte du serveur et entrez votre mot de passe, ainsi, ssh vous connectera à l'hôte distant.

Utilisation de clés partagées

Une des fonctionnalités supportées par SSH est l'utilisation d'un couple de clés privée/publique pour se connecter à l'hôte distant. Également nommée SSH keys, cette méthode permet, si l'on se connecte souvent à un hôte distant de ne pas saisir à chaque fois son mot de passe. Pour cela, vous devez générer un couple de clés privée/publique sur votre machine locale et déposer la clé publique sur l'hôte distant.

ssh-keygen -t rsa

Ce programme va générer un couple de clés privé/publique dans le répertoire ~/.ssh. Le programme vous demande dans un premier temps le répertoire de destination des clés, par défaut votre répertoire personnel, une phrase de passe (passphrase) vous est ensuite demandé.

Notes : nous vous conseillons de ne pas laisser la phrase de passe vide. En effet, un attaquant qui aurait récupéré votre clé privée pourrait ensuite se connecter facilement à tous les hôtes sur lesquels vous avez déposé votre clé publique si la phrase de passe est vide. Pensez à choisir une phrase de passe longue et complexe.

Votre clé privée est id_rsa (vous devez ne jamais la fournir à un tiers), votre clé publique est id_rsa.pub.

Vous devez copier votre clé publique sur l'hôte distant avec la commande ssh-copy-id

ssh-copy-id -i ~/.ssh/id_rsa.pub $utilisateur_distant@$hôte_distant

Vous pouvez maintenant vous connecter simplement à l'hôte distant, la phrase de passe vous est demandée. Une fois rentré, vous êtes connecté à l'hôte distant. En cas de nouvelles connections, la phrase de passe ne vous sera plus demandé durant toute votre session.

Gestion des clés

Interfaces graphiques pour la gestions des clés

Optionnellement, seahorse est une application GNOME permettant de gérer facilement les mots de passe et les clés de chiffrement, via une interface graphique intuitive. Seahorse est capable de réalisation diverses opérations telles que créer des clés SSH ou PGP, les configurer et les mettre en cache. Voir cette page pour plus informations (en anglais).

Sécurisation

Serveur SSH

Par défaut, un serveur SSH est relativement sécurisé. Il est possible, à l'aide quelques options de configuration ou des outils, de le rendre encore plus difficile à cracker.

Options de configuration

(!) Il faut éditer le fichier /etc/ssh/sshd_config pour ajuster le paramétrage puis relancer le serveur SSH par

service ssh restart

{i} Les options AllowUsers et AllowGroups n'amélioreront pas la sécurité d'un serveur SSH. Mais, dans certains cas, leur utilisation permet de résister un peu plus longtemps lors des attaques par force brute.

Outils externes

Client SSH

Bonnes pratiques avec le client SSH

Fonctions complémentaires

Visualiser des fichiers dans une interface graphique

Dans des gestionnaires de fichiers tels que Konqueror, Dolphin, Krusader et Midnight Commander, vous pouvez utiliser FISH afin de visualiser des fichiers graphiquement en utilisant :

fish://username@server_name_or_ip

Commandes supplémentaires

scp

scp $fichier_source $utilisateur_distant@$hôte_distant:$fichier_destination

scp $utilisateur_distant@$hôte_distant:$fichier_source $fichier_destination

sftp

mode texte

mode graphique

clusterssh

ssh-agent et ssh-add

# Check if ssh-agent is running
env | grep -i ssh

Vous devrez toujours dire à l'agent de gérer vos clés.

# List keys managed by the agent
ssh-add -l
# Add your ssh key
ssh-add ~/.ssh/your_private_key

Au premier chargement d'une clé privée, sa phrase de passe vous sera demandée et ssh-agent retiendra la clé. Par la suite, il ne sera donc plus nécessaire de la saisir.

keychain

Keychain, fourni par le paquet keychain, est un script shell facilitant l'utilisation d'un seul agent SSH pendant plusieurs sessions d'un même utilisateur. En effet, lors du premier lancement, ssh-agent crée un socket permettant la communication vers SSH. Ce socket est référencé uniquement dans l'environnement de la session utilisée lors du démarrage de l'agent. Keychain permet de garder la trace de l'agent et de propager l'accès à cet agent vers d'autres sessions, ce qui permet de limiter à une seule instance de ssh-agent par utilisateur sur une machine donnée.

ssh-askpass

libpam-usb


Commandes à distance

Si vous voulez juste lancer une commande sur l'ordinateur distant, vous n'avez pas besoin de vous connecter à la machine hôte pour vous identifier, pour ensuite lancer la commande. Vous pouvez ordonner à votre client SSH de lancer la commande directement, par exemple :

ssh $remote_user@$remote_host 'ls *.txt'

Ceci listera tous les fichiers avec l’extension .txt sur la machine hôte. Ceci fonctionne avec les guillemets simples '...' tel que monté ici, avec les guillemets doubles, et sans les guillemets. Il pourrait y avoir des différences entre ces trois possibilités. Cela n'est cependant pas pour l'instant documenté ici.

Connexion SSH dans Debian à partir d'un autre système d'exploitation

Bonnes pratiques d'une utilisation de SSH

Vous devez lire ceci : https://lackof.org/taggart/hacking/ssh/

Ce document résume de nombreuses bonnes pratiques que les utilisateurs SSH habituels devraient suivre afin de ne pas compromettre la sécurité de leurs comptes (et de la machine entière en même temps).

Configurez votre ~/.ssh/config pour envoyer seulement la bonne clé.

Host master.debian.org
    User account
    IdentityFile ~/.ssh/id_rsa
    IdentitiesOnly yes

SSH et la sécurité

Serveur SSH

Client SSH

Permettre l'accès à un réseau de l'extérieur à travers un pare-feu sans modifier sa configuration

Tunnel SSH pour sécuriser d'autres applications

Options complémentaires

Applications graphiques (X11Forwarding)

pop3

imap

smtp

Divers

Les options de la ligne de commande SSH (les séquences après escape ~)

Options de configuration du fichier authorized_keys


CategoryNetwork CategorySoftware

 option1,option2,optionN type-de-clef clef-en-base64 commentaire.

Dépannage

Décalage de la version d'OpenSSL. Construit avec la version 1000105f, vous avez le numéro de version 10001060

Si vous avez un message d'erreur de ce type au démarrage du démon ssh, vous devez exécuter la commande :

apt install openssh-server openssh-client

Voir aussi le rapport du bogue #732940.

SSH se bloque

Problème

Vous essayez d'utiliser SSH vers un ordinateur distant. Mais durant la connexion, SSH se bloque ou gèle. Par conséquent, vous ne parvenez pas à l'invite de commande et vous n'êtes pas en mesure d'utiliser des lignes de commandes SSH. :( Lorsque vous utilisez le mode de débogage de SSH, la session se bloque à la ligne suivante debug2: channel 0: open confirm rwindow 0 rmax 32768

Cause possible

Cela peut survenir avec certains routeurs derrière NAT et lorsque vous utilisez OpenSSH. Durant la configuration de la session, après que le mot de passe ait été donné, OpenSSH définit le champ TOS (type of service) dans le datagramme IP. Le routeur bute là dessus. L'effet est que votre session SSH se bloque indéfiniment. En d'autres termes, les commandes SSH ou les connexions fonctionnent rarement ou jamais.

Résolution avec IPQoS 0x00

Jusqu'à ce que le fabricant du routeur corrige son micrologiciel, il n'y a qu'une solution pour résoudre le problème :

  1. Revérifiez que les versions de openssh-server et openssh-client sont au moins à la version 5.7. Par exemple, la solution ci-dessous devrait fonctionner avec Debian Wheezy 7.11 ou une version plus récente de Debian, puisque cette première possède la version 6.0 de OpenSSH.

  2. Éditez une des deux lignes suivantes situées à :

    ~/.ssh/config

    ou

    /etc/ssh/ssh_config

    Note : le fichier config est par utilisateur et le fichier ssh_config est pour l'ensemble des utilisateurs et le système entier. Si vous n'êtes pas sûr de vous, éditez le fichier config correspondant à votre utilisateur.

    Contenu du fichier avant

    Host *

    Contenu du fichier après

    Host *
      IPQoS 0x00
  3. Si vous avez une fenêtre de terminal déjà ouverte, fermez-là afin de terminer toute session SSH active.
  4. Pas besoin de redémarrer OpenSSH ou votre système Debian. Essayez de vous connecter par SSH à un serveur distant. Cela devrait fonctionner. Vous venez de résoudre ce problème :)

Merci à Joe et catmaker pour cette astuce :)

Documentation connexe : https://www.openssh.com/txt/release-5.7

Résolution avec Netcat

/!\ ATTENTION : Il est suggéré d'employer la solution avec IPQoS 0x00 au lieu d'utiliser l'option netcat/ProxyCommand nc %h %p, car IPQoS 0x00 est l'option intégrée officielle d'OpenSSH. De plus, IPQoS 0x00 est une solution plus directe et potentiellement plus sécurisée pour résoudre ce problème. IPQoS 0x00 utilise en effet un chiffrement SSH intégré pour les transferts sécurisés. En comparaisons, netcat n'offre pas de transfert sécurisé. Sources : 1 2. À lire, si vous choisissez d'utiliser l'option netcat/ProxyCommand nc %h %p.

Une autre option pour résoudre ce problème de blocage SSH est d'utiliser ProxyCommand nc %h %p. Pour cela, utilisez les mêmes étapes que pour celles de la solution avec IPQoS 0x00, mais remplacez IPQoS 0x00 avec

ProxyCommand nc %h %p

Garder la connexion SSH active

Pour des raisons de sécurité, une connexion SSH est automatiquement fermée, par défaut, après un temps déterminé. Mais dans certains cas, vous voulez garder cette connexion ouverte, comme dans le cas d'un stockage nuagique (cloud) à travers une connexion SSH.

/!\ ATTENTION : Avant d'activer l'option gardant la connexion SSH active, il est suggéré de considérer de sécuriser votre client et serveur SSH. Il est par exemple risqué de laisser les connexions SSH ouvertes si les utilisateurs laissent leur ordinateur non verrouillé et sans surveillance, n'importe qui pourrait alors s'approcher du PC et, juste en se servant de la commande passwd, peut changer le mot de passe, et ainsi obtenir l'accès au serveur. Faites preuve de discernement.

Pour un serveur Debian 7.x

Étapes pour garder une connexion SSH active.

Sur le serveur SSH modifiez le fichier /etc/ssh/sshd_config et ajoutez ce qui suit à la fin de ce fichier.

# Keep client SSH connection alive by sending every 300 seconds a small keep-alive packet to the server in order to use ssh connection. 300 seconds equal 5 minutes.
ClientAliveInterval 300

# Disconnect client after 3333 "ClientAlive" requests. Format is (ClientAliveInterval x ClientAliveCountMax). In this example (300 seconds x 3333) = ~999,900 seconds = ~16,665 minutes = ~277 hours = ~11 days.
ClientAliveCountMax 3333

En tant que superutilisateur redémarrez le service SSH :

service sshd restart

Notez que sur les récentes versions de Debian Wheezy (c'est à dire, avec les mises à jour de novembre 2015), la commande ci-dessus ne fonctionne désormais plus et retourne l'erreur suivante :

sudo service sshd restart
sshd: unrecognized service

En revanche, la commande suivante fonctionne :

sudo service ssh restart
[ ok ] Restarting OpenBSD Secure Shell server: sshd.

Exemple fonctionnel et commenté pour configurer un Serveur SSH

 ################################
 # Configuration du Serveur SSH #
 ################################
 # Le Protocole 2 est mieux sécurisé :
 Protocol 2
 # Port à utiliser :
 Port 22
 # Clé publique du serveur à utiliser pour identifier le serveur :
 # HostKey /etc/ssh/ssh_host_rsa_key
 HostKey /etc/ssh/ssh_host_ed25519_key
 # Oblige l'authentification par clé SSH :
 # Valeur commentée par défaut !
 AuthenticationMethods publickey
 # Interdire l'authentification par mot de passe :
 PasswordAuthentication no
 # Interdire les mots de passe vide :
 PermitEmptyPasswords no
 # Autoriser la connexion pour les utilisateurs suivants :
 AllowUsers user1 user2 user3 user4
 # Choix de connexion pour l'utilisateur root sur le serveur SSH :
 PermitRootLogin no
 # Interdire certains utilisateurs :
 DenyUsers root
 # Durée maximum autorisée pour établir la connexion :
 LoginGraceTime 25s
 # Limiter a un nombre maximum les tentatives de connexions SSH non authentifiée :
 MaxStartups 3:50:5
 # Maximum de 3 essais pour renseigner la passe phrase :
 MaxAuthTries 3
 # Maximum de 3 sessions ouvertes en même temps :
 MaxSessions 3
 # Autorise l'authentification par clé SSH :
 PubkeyAuthentication yes
 # Clés publiques autorisées pour établir une connexion :
 AuthorizedKeysFile      .ssh/authorized_keys .ssh/authorized_keys2
 # Interdire la prise en compte des fichiers de configuration des commandes r avec SSH :
 IgnoreRhosts yes
 # Le serveur d'authentification challenge-response PAM n'est pas configuré par défaut :
 ChallengeResponseAuthentication no
 # PAM fournit la gestion des sessions et des comptes !
 UsePAM yes
 # Refuser l'export display :
 X11Forwarding no
 # La valeur no désactive complètement l'impression de motd.
 PrintMotd yes
 # Refuser l'authentification basée sur les DNS :
 UseDNS no
 # Refuser l'authentification basée sur l'hôte :
 HostbasedAuthentication no
 # Permet au client de définir des variables d'environnement dès l'établissement de la connexion :
 AcceptEnv LANG LC_*
 # Loguer les tentatives de connexions dans /var/log/auth.log en ajoutant la ligne suivante :
 SyslogFacility AUTH
 # Permet d'avoir une trace d'audit claire de la clé utilisée pour se connecter :
 LogLevel VERBOSE
 # Journaliser les accès aux fichiers de niveau sftp qui ne seraient pas journalisés autrement :
 # Subsystem     sftp    /usr/lib/openssh/sftp-server
 Subsystem sftp /usr/lib/openssh/sftp-server -f AUTHPRIV -l INFO
 # Définir un temps limite d'inactivité pour forcer la déconnexion :
 ClientAliveInterval 900
 # Concerne le nombre maximal de requêtes :
 ClientAliveCountMax 0
 # Vérifie les modes et le propriétaire des fichiers et du répertoire home de l'utilisateur avant de se connecter :
 StrictModes yes
 # La mort de la connexion ou le crash de la machines sera remarqué pour mettre fin à la connexion :
 TCPKeepAlive yes
 # Afficher un message pour l'utilisateur suite à une demande de connexion :
 Banner /etc/issue

 # En règle général les entreprises préfèrent désactiver le Port Forwarding pour éviter la fuite d'informations :
 AllowTcpForwarding no
 # Spécifie si le transfert de sockets de domaine Unix est autorisé :
 AllowStreamLocalForwarding no
 # Spécifie si les hôtes distants sont autorisés à se connecter aux ports transférés pour le client :
 GatewayPorts no
 # Spécifie si le transfert de périphérique est autorisé :
 PermitTunnel no
 # Spécifie les destinations vers lesquelles le transfert de port TCP est autorisé :
 PermitOpen any

 # Spécifier les algorithmes KEX (échange de clés) disponibles :
 KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
 # Spécifier les ciphers autorisés :
 Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
 # Spécifier les algorithmes MAC (Message authentication code) :
 MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com

Voir aussi


CategoryNetwork CategorySoftware CategorySystemAdministration CategorySystemSecurity