Recherche de site Web

Comprendre le processus de chiffrement et de connexion SSH


Introduction

SSH, ou shell sécurisé, est un protocole sécurisé et le moyen le plus courant d'administrer en toute sécurité des serveurs distants. Utilisant un certain nombre de technologies de cryptage, SSH fournit un mécanisme pour établir une connexion cryptographiquement sécurisée entre deux parties, authentifiant chaque côté l'un à l'autre, et permettant le passage de commandes et de résultats dans les deux sens.

Dans ce guide, nous examinerons les techniques de cryptage sous-jacentes utilisées par SSH et les méthodes qu'il utilise pour établir des connexions sécurisées. Ces informations peuvent être utiles pour comprendre les différentes couches de cryptage et les étapes nécessaires pour établir une connexion et authentifier les deux parties.

Comprendre le chiffrement symétrique, le chiffrement asymétrique et les hachages

Afin d'assurer la transmission de l'information, SSH utilise un certain nombre de techniques de manipulation de données différentes à divers points de la transaction. Cela inclut des formes de cryptage symétrique, de cryptage asymétrique et de hachage.

Chiffrement symétrique

La relation entre les composants qui chiffrent et déchiffrent les données détermine si un schéma de chiffrement est symétrique ou asymétrique.

Le chiffrement symétrique est un type de chiffrement où une clé peut être utilisée pour chiffrer des messages à l'autre partie, et également pour déchiffrer les messages reçus de l'autre participant. Cela signifie que quiconque possède la clé peut chiffrer et déchiffrer des messages à toute autre personne détenant la clé.

Ce type de schéma de cryptage est souvent appelé cryptage à "secret partagé", ou cryptage à "clé secrète". Il n'y a généralement qu'une seule clé utilisée pour toutes les opérations ou une paire de clés dont la relation est découverte et il est trivial de dériver la clé opposée.

Les clés symétriques sont utilisées par SSH pour chiffrer l'ensemble de la connexion. Contrairement à ce que certains utilisateurs supposent, les paires de clés asymétriques publiques/privées qui peuvent être créées ne sont utilisées que pour l'authentification, et non pour le chiffrement de la connexion. Le chiffrement symétrique permet même de protéger l'authentification par mot de passe contre l'espionnage.

Le client et le serveur contribuent tous deux à établir cette clé, et le secret qui en résulte n'est jamais connu des parties extérieures. La clé secrète est créée par un processus connu sous le nom d'algorithme d'échange de clés. Cet échange permet au serveur et au client d'arriver indépendamment à la même clé en partageant certaines données publiques et en les manipulant avec certaines données secrètes. Ce processus est expliqué en détail plus loin.

La clé de chiffrement symétrique créée par cette procédure est basée sur la session et constitue le véritable chiffrement des données envoyées entre le serveur et le client. Une fois cela établi, le reste des données doit être chiffré avec ce secret partagé. Cela se fait avant l'authentification d'un client.

SSH peut être configuré pour utiliser une variété de systèmes de chiffrement symétriques différents, y compris l'Advanced Encryption Standard (AES), Blowfish, 3DES, CAST128 et Arcfour. Le serveur et le client peuvent tous deux décider d'une liste de leurs chiffrements pris en charge, ordonnée par préférence. La première option de la liste du client qui est disponible sur le serveur est utilisée comme algorithme de chiffrement dans les deux directions.

Sur Ubuntu 20.04, le client et le serveur sont configurés par défaut comme suit :

    chacha20-poly1305@openssh.com
    aes128-ctr
    aes192-ctr
    aes256-ctr
    aes128-gcm@openssh.com
    aes256-gcm@openssh.com

Cela signifie que si deux machines Ubuntu 20.04 se connectent l'une à l'autre (sans remplacer les chiffrements par défaut via des options de configuration), elles utiliseront toujours le chiffre chacha20-poly1305@openssh.com pour crypter leur connexion.

Cryptage asymétrique

Le chiffrement asymétrique est différent du chiffrement symétrique car pour envoyer des données dans une seule direction, deux clés associées sont nécessaires. L'une de ces clés est appelée la clé privée, tandis que l'autre est appelée la clé publique.

La clé publique peut être librement partagée avec n'importe quelle partie. Elle est associée à sa clé jumelle, mais la clé privée ne peut pas être dérivée de la clé publique. La relation mathématique entre la clé publique et la clé privée permet à la clé publique de chiffrer des messages qui ne peuvent être déchiffrés que par la clé privée. C'est une capacité unidirectionnelle, ce qui signifie que la clé publique n'a pas la capacité de déchiffrer les messages qu'elle écrit, ni de déchiffrer quoi que ce soit que la clé privée pourrait lui envoyer.

La clé privée doit être gardée entièrement secrète et ne doit jamais être partagée avec une autre partie. C'est une condition clé pour que le paradigme de la clé publique fonctionne. La clé privée est le seul composant capable de déchiffrer les messages qui ont été cryptés à l'aide de la clé publique associée. En vertu de ce fait, toute entité capable de déchiffrer ces messages a démontré qu'elle contrôle la clé privée.

SSH utilise le chiffrement asymétrique à plusieurs endroits. Lors du processus initial d'échange de clés utilisé pour établir le chiffrement symétrique (utilisé pour chiffrer la session), un chiffrement asymétrique est utilisé. À ce stade, les deux parties produisent des paires de clés temporaires et échangent la clé publique afin de produire le secret partagé qui sera utilisé pour le chiffrement symétrique.

L'utilisation la plus discutée du chiffrement asymétrique avec SSH provient de l'authentification basée sur les clés SSH. Les paires de clés SSH peuvent être utilisées pour authentifier un client auprès d'un serveur. Le client crée une paire de clés puis télécharge la clé publique sur n'importe quel serveur distant auquel il souhaite accéder. Celle-ci est placée dans un fichier appelé authorized_keys dans le répertoire ~/.ssh du répertoire personnel du compte utilisateur sur le serveur distant.

Après que le chiffrement symétrique soit établi pour sécuriser les communications entre le serveur et le client, le client doit s'authentifier pour se voir accorder l'accès. Le serveur peut utiliser la clé publique contenue dans ce fichier pour chiffrer un message de défi au client. Si le client peut prouver qu'il a été capable de déchiffrer ce message, cela prouve qu'il possède la clé privée associée. Ensuite, le serveur peut configurer l'environnement pour le client.

Hachage

Une autre forme de manipulation des données dont SSH tire parti est le hachage cryptographique. Les fonctions de hachage cryptographique sont des méthodes permettant de créer une « signature » ou un résumé succinct d'un ensemble d'informations. Leurs principales caractéristiques distinctives sont qu'elles ne sont jamais destinées à être inversées, qu'il est pratiquement impossible de les influencer de manière prévisible et qu'elles sont pratiquement uniques.

L'utilisation de la même fonction de hachage et du même message devrait produire le même hachage ; modifier une partie des données devrait produire un hachage totalement différent. Un utilisateur ne devrait pas être capable de produire le message d'origine à partir d'un hachage donné, mais il devrait être en mesure de dire si un message donné a produit un hachage donné.

Étant donné ces propriétés, les hachages sont principalement utilisés pour des raisons d'intégrité des données et pour vérifier l'authenticité des communications. L'utilisation principale dans SSH est avec HMAC, ou codes d'authentification de message basés sur des hachages. Ceux-ci sont utilisés pour garantir que le texte du message reçu est intact et non modifié.

Dans le cadre de la négociation de chiffrement symétrique décrite précédemment, un algorithme de code d'authentification de message (MAC) est sélectionné. L'algorithme est choisi en consultant la liste des choix de MAC acceptables du client. Le premier sur cette liste que le serveur prend en charge sera utilisé.

Chaque message envoyé après que le chiffrement a été négocié doit contenir un MAC afin que l'autre partie puisse vérifier l'intégrité du paquet. Le MAC est calculé à partir du secret partagé symétrique, du numéro de séquence du paquet du message et du contenu réel du message.

Le MAC lui-même est envoyé à l'extérieur de la zone cryptée de manière symétrique comme la dernière partie du paquet. Les chercheurs recommandent généralement cette méthode de chiffrement des données d'abord, puis de calculer le MAC.

Comprendre comment fonctionne SSH

Vous avez probablement déjà une compréhension de base du fonctionnement de SSH. Le protocole SSH utilise un modèle client-serveur pour authentifier les deux parties et chiffrer les données entre elles.

Le composant du serveur écoute sur un port désigné pour les connexions. Il est responsable de la négociation de la connexion sécurisée, de l'authentification de la partie connectée et de la création du bon environnement si les identifiants sont acceptés.

Le client est responsable de commencer le protocole de contrôle de transmission (TCP) initial avec le serveur, de négocier la connexion sécurisée, de vérifier que l'identité du serveur correspond aux informations enregistrées auparavant, et de fournir des informations d'identification pour l'authentification.

Une session SSH est établie en deux étapes distinctes. La première consiste à convenir et à établir un chiffrement pour protéger les futures communications. La deuxième étape consiste à authentifier l'utilisateur et à découvrir si l'accès au serveur doit être accordé.

Négociation du chiffrement pour la session

Lorsqu'une connexion TCP est établie par un client, le serveur répond avec les versions de protocole qu'il prend en charge. Si le client peut correspondre à l'une des versions de protocole acceptables, la connexion se poursuit. Le serveur fournit également sa clé publique d'hôte, que le client peut utiliser pour vérifier si cet hôte était bien l'hôte prévu.

À ce stade, les deux parties négocient une clé de session en utilisant une version de quelque chose appelé l' algorithme de Diffie-Hellman. Cet algorithme (et ses variantes) permet à chaque partie de combiner ses propres données privées avec des données publiques de l'autre système pour arriver à une clé de session secrète identique.

La clé de session sera utilisée pour chiffrer l'ensemble de la session. Les paires de clés publiques et privées utilisées pour cette partie de la procédure sont complètement séparées des clés SSH utilisées pour authentifier un client auprès du serveur.

La base de cette procédure pour le Diffie-Hellman classique est :

  • Les deux parties s'accordent sur un grand nombre premier, qui servira de valeur de départ.
  • Les deux parties s'accordent sur un générateur de chiffrement (typiquement AES), qui sera utilisé pour manipuler les valeurs d'une manière prédéfinie.
  • Indépendamment, chaque partie propose un autre nombre premier qui est gardé secret de l'autre partie. Ce nombre est utilisé comme clé privée pour cette interaction (différent de la clé SSH privée utilisée pour l'authentification).
  • La clé privée générée, le générateur de chiffrement et le nombre premier partagé sont utilisés pour générer une clé publique qui est dérivée de la clé privée, mais qui peut être partagée avec l'autre partie.
  • Les deux participants échangent ensuite leurs clés publiques générées.
  • L'entité réceptrice utilise sa propre clé privée, la clé publique de l'autre partie et le nombre premier partagé original pour calculer une clé secrète partagée. Bien que cela soit calculé indépendamment par chaque partie, en utilisant des clés privées et publiques opposées, cela aboutira à la même clé secrète partagée.
  • Le secret partagé est ensuite utilisé pour chiffrer toutes les communications qui suivent.

Ce processus permet à chaque partie de participer également à la génération du secret partagé, ce qui n'autorise pas une seule extrémité à contrôler le secret. Il permet également de générer un secret partagé identique sans jamais avoir à transmettre cette information par des canaux non sécurisés. Le chiffrement du secret partagé qui est utilisé pour le reste de la connexion s'appelle protocole de paquet binaire.

Le secret généré est une clé symétrique, ce qui signifie que la même clé utilisée pour chiffrer un message peut être utilisée pour le déchiffrer de l'autre côté. L'objectif de cela est d'envelopper toutes les communications ultérieures dans un tunnel encrypté qui ne peut pas être déchiffré par des tiers.

Après l'établissement du chiffrement de la session, la phase d'authentification de l'utilisateur commence.

Authentification de l'accès de l'utilisateur au serveur

La prochaine étape consiste à authentifier l'utilisateur et à décider de son accès. Il existe quelques méthodes qui peuvent être utilisées pour l'authentification, en fonction de ce que le serveur accepte.

La méthode générale est l'authentification par mot de passe, qui consiste en une invite du serveur au client pour le mot de passe du compte auquel il essaie de se connecter. Le mot de passe est envoyé par le biais du chiffrement négocié, de sorte qu'il est sécurisé contre les parties extérieures.

Bien que le mot de passe soit chiffré, cette méthode n'est généralement pas recommandée en raison des limitations sur la complexité du mot de passe. Les scripts automatisés peuvent facilement casser des mots de passe de longueurs normales par rapport à d'autres méthodes d'authentification.

L'alternative la plus populaire et recommandée est l'utilisation de paires de clés SSH. Les paires de clés SSH sont des clés asymétriques, ce qui signifie que les deux clés associées ont des fonctions différentes.

La clé publique est utilisée pour chiffrer des données qui ne peuvent être déchiffrées qu'avec la clé privée. La clé publique peut être partagée librement, car bien qu'elle puisse chiffrer pour la clé privée, il n'existe aucun moyen de dériver la clé privée à partir de la clé publique.

L'authentification utilisant des paires de clés SSH commence après que le chiffrement symétrique a été établi comme décrit dans la section précédente. La procédure se déroule comme suit :

  • Le client commence par envoyer une identification pour la paire de clés qu'il souhaite utiliser pour s'authentifier auprès du serveur.
  • Le serveur vérifie le fichier authorized_keys du compte dans lequel le client tente de se connecter pour l'identifiant de clé.
  • Si une clé publique avec un ID correspondant est trouvée dans le fichier, le serveur génère un nombre aléatoire et utilise la clé publique pour chiffrer le nombre.
  • Le serveur envoie au client ce message chiffré.
  • Si le client possède effectivement la clé privée associée, il pourra déchiffrer le message à l'aide de cette clé, révélant ainsi le nombre original.
  • Le client combine le numéro décrypté avec la clé de session partagée qui est utilisée pour chiffrer la communication, et calcule le hash MD5 de cette valeur. MD5 est un algorithme de résumé de message qui utilise la fonction de hachage pour générer une valeur de hachage de 128 bits.
  • Le client renvoie ensuite ce hash MD5 au serveur en réponse au message numérique chiffré.
  • Le serveur utilise la même clé de session partagée et le numéro original qu'il a envoyé au client pour calculer la valeur MD5 de son côté. Il compare son propre calcul à celui que le client a renvoyé. Si ces deux valeurs correspondent, cela prouve que le client était en possession de la clé privée et que le client est authentifié.

En résumé, l'asymétrie des clés permet au serveur de chiffrer les messages à l'intention du client en utilisant la clé publique. Le client peut alors prouver qu'il détient la clé privée en déchiffrant correctement le message. Les deux types de chiffrement utilisés (secret partagé symétrique et clés publiques/privées asymétriques) peuvent chacun tirer parti de leurs forces spécifiques dans ce modèle.

Conclusion

Apprendre les étapes de la négociation de connexion et les couches de chiffrement utilisées dans SSH peut vous aider à mieux comprendre ce qui se passe lorsque vous vous connectez à un serveur distant. Maintenant, vous pouvez reconnaître la relation entre les différents composants et algorithmes, et comprendre comment toutes ces pièces s'imbriquent. Pour en savoir plus sur SSH, consultez les guides suivants :

  • Comment configurer l'authentification par clés SSH sur un serveur Linux
  • Comment utiliser SSH pour se connecter à un serveur distant
  • Comment configurer des clés SSH pour différents systèmes d'exploitation
  • Essentiels de SSH : Travailler avec des serveurs, des clients et des clés SSH