Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
SSH et TLS
Benoît Lamotte
Vincent Robert
Alexis Seigneurin
Ingénieurs 2000 – Informatique & Réseau 3
Année 2005
Table des matières
Introduction................................................................................................... 3
Conclusion................................................................................................... 29
INTRODUCTION
Internet est un gigantesque réseau sur laquelle la confidentialité des échanges n'est
pas assurée. Or, la plupart des protocoles de communication utilisés sont non sécurisés.
SSH (Secure Shell) et TLS (Transport Layer Security) sont deux protocoles destinés à
pallier ce problème. Ils s'intercalent entre les protocoles habituels de transport et les
protocoles applicatifs, et proposent ainsi une couche de sécurité pour tout type
d'application.
SSH est particulièrement utilisé pour réaliser de l'administration de machines à
distance. TLS, quant à lui, est plus généralement utilisé dans un contexte Web
(sécurisation des échanges sur un site Web) ou mail (POP et SMTP).
Nous présenterons tout d'abord les différents problèmes de sécurités ainsi que des
mécanismes cryptographiques destinés à y remédier. Dans un second temps, nous
présenterons le protocole SSH. Enfin, nous présenterons le procole TLS.
1.SÉCURISER UNE TRANSACTION
Lorsque vous envoyez ces informations au serveur du site de vente, une personne
malintentionnée (pirate) peut écouter votre envoi et récupérer vos informations pour les
utiliser ensuite à votre insu. Ceci est très facile à réaliser à l'aide d'outils appelés
« sniffeurs » permettant de récupérer les trames circulant sur un réseau donné. Il ne reste
plus ensuite qu'à analyser les trames pour récupérer les informations désirées.
Il faut donc que votre message soit crypté pour que seul le serveur puisse comprendre
votre message. Nous allons donc nous intéresser à des méthodes de cryptage de
l'information utilisées dans les protocoles SSH, SSL et TLS.
2 Chiffrement symétrique
Le principe de chiffrement symétrique (aussi appelé chiffrement à clé privée ou
chiffrement à clé secrète) utilise une seule clé de cryptage pour encoder le message et
pour le décoder.
Cette méthode fonctionne en 5 étapes :
• L'expéditeur génère une clé symétrique (alogrithme DES, tripleDES...).
• L'expéditeur encode son message avec la clé symétrique.
• L'expéditeur envoi la clé.
• L'expéditeur envoi le message crypté.
• Le destinataire n'a plus qu'a décrypter le message avec la clé reçue.
3 Chiffrement asymétrique
Contrairement au chiffrement symétrique cette méthode utilise deux clés, une clé
publique pour l'encodage et une clé privée pour le décodage.
La clé privée est connue seulement par le destinataire. Toutes personnes voulant lui
envoyer le message récupère la clef publique pour encoder le message (disponible
généralement dans un serveur de clé, de type LDAP généralement).
Il y a donc 4 étapes à cette méthode :
• L'expéditeur récupère la clé publique.
• L'expéditeur encode le message à l'aide de cette clé.
• Il envoie le message au destinataire.
• Le destinataire décode le message avec la clé privée que lui seul possède.
Ce principe repose sur des fonction faciles à calculer dans un sens, mais qui est très
difficile mathématiquement à calculer dans l'autre sens sans posséder la clé privé
(algorithme RSA). Cette méthode est extrêmement coûteuse en ressource lors des calcul
d'encodage et de décodage du message.
Ainsi notre pirate ne pourra pas décrypter le message qu'il aura récupéré en écoutant
le canal car il ne possédera pas la clé privée.
Cependant pour que ce système soit sûr il faut s'assurer que la clé publique l'on
possède appartient bien au destinataire du message (voir attaque « Man in the middle »).
4 La combinaison des deux
Il existe une méthode utilisant à la fois le chiffrement symétrique et le chiffrement
asymétrique. Cette méthode est appelée clé de session.
Comme dans le chiffrement asymétrique, le destinataire génère une clé privé ainsi
qu'une clé publique. Cette dernière est transmise aux expéditeurs.
De son côté, l'expéditeur génère une clé symétrique (algorithme DES, tripleDES...)
qu'il encode à l'aide de la clé publique du destinataire.
Il transmet ensuite sa clé crypté. Ainsi, les deux protagonistes possèdent tous les
deux une clé qui leur est propre. Il peuvent donc ensuite communiquer à l'aide de cette clé
de façon sécurisée.
L'échange de clé symétrique ne se fait donc qu'une seule fois, limitant le nombre de
cryptage et décryptage de type asymétrique (coûteux en temps processeur).
La clé échangée est valable seulement pour une session, il faudra donc, à la
prochaine connexion, établir une nouvelle clé symétrique pour évoluer de nouveau dans
un système sécurisé.
Comme pour la méthode asymétrique, il faut être sûr que la clé publique utilisée
appartient bien au destinataire voulu.
5 Attaque « Man in the middle »
Les méthodes de chiffrement asymétrique et symétrique permettent d'évoluer dans un
système sécurisé empêchant les logiciels d'écoute de récupérer le message et de le
décrypter.
Cependant, la technique du « Man in the middle » (attaque du milieu, ou attaque de
l'intercepteur en Français) permet de contourner cette sécurité.
Le principe est simple même si il n'est pas toujours évident à mettre en place.
Le pirate se place sur le réseau entre les deux machines (expéditeur et destinataire)
pour intercepter et modifier les messages qu'elles s'échangent.
1 SSH version 1
Ce protocole est la première version du protocole Secure Shell. Il existe aujourd’hui
une version 2 corrigeant une faille de sécurité de ce protocole. Bien que SSH2 soit encore
à l’état de brouillon (draft), l’IETF recommande de ne plus utiliser SSH1.
Nous allons tout de même présenter rapidement ce protocole afin de connaître la
base qui a donné naissance à SSH2.
1 Description du protocole
La connexion s’effectue avec TCP/IP selon la spécification. Il serait possible d’effec-
tuer cette connexion sur d’autres protocoles mais cela n’est pas prévu par la RFC.
Au début de la connexion, le serveur envoie une chaîne d’authentification puis le client
répond par sa chaîne d’identification. Cette chaîne contient le port de connexion, la ver-
sion du protocole ainsi que la version du logiciel pour des raisons de développement. Si le
client ou le serveur n’accepte pas cette chaîne, la connexion est fermée.
Le serveur commence par envoyer sa clef RSA (cette clef est regénérée toutes les
heures) ainsi que d’autres informations. Le client génère alors une clef de session de 256
bits et la crypte en utilisant les 2 clefs RSA (client et serveur), puis l’envoie au serveur
avec le type de cryptage sélectionné. Les 2 parties activent alors le cryptage des données
en utilisant le type de cryptage et la clef de session spécifiés par le client. Le serveur en-
voie alors un message de confirmation crypté au client.
0-7 8 - 15 16 - 23 24 - 31
Taille du paquet
...
CRC32
1 Transport
Il est recommandé dans la spécification de transmettre SSH2 via un protocole possé-
dant un contrôle d’erreur. De telle erreurs sont en effet détectées par le protocole SSH et
impliquent une coupure immédiate de la connexion. Il est donc préférable d’utiliser le cont-
rôle d’erreur du protocole de transport afin de garantir les connexions.
Le protocole principalement utilisé est TCP/IP. Avec ce protocole de transport, le ser-
veur écoute généralement sur le port 22 qui a été officiellement assigné à SSH par l’IANA.
I. Initialisation de la connexion
Quand la connexion a été établie, les deux parties doivent envoyer une chaîne d’iden-
tification. Cette chaîne doit être :
SSH-Protocole-Logiciel [<SP> Commentaire] <CR> <LF>
Protocole doit contenir la version du protocole. Pour SSH2, cette chaîne doit être 2.0.
Logiciel doit contenir la version du logiciel. Les numéros de version doivent être com-
posés de caractères US-ASCII à l’exception des caractères d’espacement et du caractère
moins (-).
Commentaire est optionnel. Si ce champs est omis, l’espace le séparant des champs
précédents peut être omis aussi. Il ne doit pas contenir le caractère NULL (0).
La taille maximum de la cette chaîne est 255 caractères y compris le retour chariot et
le caractère de nouvelle ligne de fin.
Il est possible d’envoyer des lignes supplémentaires avant d’envoyer la chaîne d’iden-
tification. Ces lignes ne doivent pas commencer par SSH- et doivent être gérées par le
client. Cependant ce dernier peut simplement les ignorer ou les afficher à l’utilisateur.
II. Compatibilité
Un client SSH1 peut se connecter à un serveur SSH2.
Il est possible pour un serveur de supporter les 2 version de SSH, il devra alors en-
voyer la chaîne 1.99 comme version de protocole. Un client SSH2 devra interpréter cette
version comme étant égale à 2.0.
Un serveur compatible avec une ancienne version ne devra pas envoyer le caractère
nouvelle ligne lors de l’envoi de la chaîne d’identification, et devra attendre un envoi du
client avant tout envoi afin d’identifier la version avec laquelle le client discute.
Un serveur SSH2 seulement ne peut pas accepter de connexions de client SSH1 et
doit les rejeter automatiquement.
IV.Compression
La compression s’effectue exclusivement sur les données. Elle se fait en utilisant l’al-
gorithme de compression qui a été négocié entre le serveur et le client. Il est possible de
choisir une méthode de compression différente pour les 2 sens de la communication,
mais la spécification recommande d’utiliser la même méthode de compression pour toute
la communication.
Voici les méthodes de compression définies par la spécification :
• aucune, cet algorithme est forcément requis ;
• zlib, la compression bien connue, cet algorithme est optionnel.
V. Cryptage
Le cryptage se fait au moyen d’un algorithme de cryptage négocié lors de l’échange
des clefs entre le client et le serveur. Lorsque le cryptage est effectif, toutes les données
d’un paquet sont cryptées sauf le code d’authentification du message. Le cryptage se fait
toujours après la compression.
Lors d’une communication, les 2 directions doivent utiliser des algorithmes indépen-
dants. Les client et serveur doivent d’ailleurs permettre de choisir le type d’algorithme pour
chaque direction de la communication. Cependant, la spécification recommande d’utiliser
le même algorithme dans les 2 directions.
Les algorithmes suivants sont définis par la spécifications :
twofish-cbc
Alias de twofish256-cbc conservé pour des
raisons de compatibilité
twofish192-cbc Twofish en mode CBC avec clef de 192 bits
twofish128-cbc Twofish en mode CBC avec clef de 128 bits
aes256-cbc AES en mode CBC avec clef de 256 bits
aes192-cbc AES en mode CBC avec clef de 192 bits
recom-
aes128-cbc AES en mode CBC avec clef de 128 bits
mandé
serpent256-cbc Serpent en mode CBC avec clef de 256 bits
serpent192-cbc Serpent en mode CBC avec clef de 192 bits
serpent128-cbc Serpent en mode CBC avec clef de 128 bits
arcfour Le cryptage de flux ARCFOUR
idea-cbc IDEA en mode CBC
cast128-cbc CAST-128 en mode CBC
none Aucun cryptage - Déconseillé
recom-
hmac-sha1-96 96 premiers bits de HMAC-SHA1
mandé
hmac-md5 HMAC-MD5
hmac-md5-96 96 premiers bits de HMAC-MD5
none Aucun algorithme, déconseillé
VII.Échange de clefs
Lors de la connexion, les 2 parties doivent négocier un algorithme de génération des
clefs de sessions qui serviront pour le cryptage et l’authentification auprès du serveur.
La spécification définit 2 méthodes d’échanges des clefs que les logiciels doivent pos-
séder : diffie-hellman-group1-sha1 et diffie-hellman-group14-sha1.
recom-
ssh-rsa Clef RSA brut
mandé
spki-sign-rsa Certificats SPKI avec clef RSA
spki-sign-dss Certificats SPKI avec clef DSS
pgp-sign-rsa Certificats OpenPGP avec clef RSA
pgp-sign-dss Certificats OpenPGP avec clef DSS
Pour s’échanger les clefs publiques, chaque machine va annoncer les algorithmes de
clefs qu’il supporte. Une fois les méthodes annoncées, les 2 machines vont choisir une
méthode d’échange des clefs et s’envoyer leurs clefs publiques respectives.
2 Authentification
Le protocole d’authentification SSH permet l’authentification des utilisateurs en utili-
sant le protocole de transport SSH définit plus haut.
IX.Échange initial
L’authentification est déclenché par le client avec l’envoi d’un paquet SSH_MSG_USE-
RAUTH_REQUEST.
La langue est déprécié et doit être la chaîne vide.
Les sous-méthodes est une liste séparée par des virgules de sous-méthodes d’au-
thentification. Il est notamment possible pour le client de spécifier un certains nombres de
sous-méthodes à utiliser basé sur une configuration de l’utilisateur.
Quand ce message est envoyé au serveur, l’utilisateur n’a pas encore spécifié de mot
de passe de connexion et le mot de passe n’est pas encore inclue dans ce message
(contrairement à la méthode password).
À la réception de ce message, le serveur doit renvoyer un des messages suivants :
• SSH_MSG_USERAUTH_SUCCESS, pour accepter l’authentification ;
• SSH_MSG_USERAUTH_FAILURE, pour refuser l’authentification ;
• SSH_MSG_USERAUTH_INFO_REQUEST, pour demander des informations supplémen-
taires afin de poursuivre l’authentification.
La spécification ne conseille pas de répondre le message SSH_MSG_USERAUTH_FAILURE
au premier message d’authentification par nom d’utilisateur. Il est préférable de répondre
la réponse la plus probable (SSH_MSG_USERAUTH_INFO_REQUEST), puis d’envoyer un mes-
sage SSH_MSG_USERAUTH_FAILURE après quelques secondes. Ce comportement permet
d’empêcher les algorithmes « brute force » qui validerait un nom d’utilisateur par un
simple message envoyé au serveur.
De même, il est préférable de ne pas répondre le message SSH_MSG_USERAUTH_SUCCESS
même si l’utilisateur est correctement authentifié, mais d’envoyer le message
SSH_MSG_USERAUTH_INFO_REQUEST et de ne pas tenir compte des réponses.
X. Demandes d’informations
Comme nous l’avons vu, le serveur peut demander des informations d’authentification
au client avec un message SSH_MSG_USERAUTH_INFO_REQUEST.
Un serveur ne doit jamais envoyer plu- 1 octet SSH_MSG_USERAUTH_REQUEST
sieurs requêtes au client en parallèle mais
doit attendre la réponse du client. Cepen- chaîne Nom de l’utilisateur
dant, le nombre de requêtes est inconnu
et le client doit s’attendre à en recevoir un chaîne Nom de service
nombre indéfini. “keyboard-interactive”
chaîne
Le message définit un tableau de va-
leur à récupérer avec pour chaque valeur : chaîne Langue
un prompt à afficher à l’utilisateur et un
booléen précisant si la réponse de l’utilisa- chaîne Sous-méthodes
teur doit s’afficher. C’est au client de défi-
nir cette notion.
Une fois toutes les valeurs renseignées, le client répond alors avec un message
SSH_MSG_USERAUTH_INFO_RESPONSE.
Ce message contient un tableau des réponses du client à chacune des requêtes du
serveur.
Le nombre de réponses dans ce message doit être égale au nombre de requêtes
dans le message du serveur et doivent être disposées dans le même ordre que les re-
quêtes respectives dans le message du serveur.
À ces requêtes, le serveur doit répondre immédiatement par une des 3 réponses pos-
sibles : succès, échec ou demande d’informations supplémentaires, notamment en cas de
succès.
En cas d’échec, la spécification recommande de n’envoyer le message d’échec qu’au
bout de quelques secondes d’attentes, généralement 2 secondes.
XI.Protocole de connexion
SSH2 définit un 3e protocole s’utilisant au dessus de protocole d’authentification. Ce
protocole permet l’exécution de commandes à distance, le transfert de connexions TCP/IP
et de connexions X11.
Toutes ces fonctionnalités passent 1 octet SSH_MSG_USERAUTH_INFO_RE-
par la création de canaux. Ces canaux QUEST
peuvent être initiés par l’une ou l’autre
chaîne Nom
des parties de la communication mise
en place par un échange de messages. chaîne Instruction
chaîne Prompt 1
booléen Affichage 1
...
1 octet SSH_MSG_USERAUTH_INFO_RESPONSE
chaîne Réponse 1
...
3.TLS : TRANSPORT LAYER SECURITY
1 Description de TLS
TLS est un protocole permettant de sécuriser des communications. Il s'appuie sur un
protocole de transport fiable (TCP, par exemple). TLS est indépendant des protocoles de
la couche supérieure et peut ainsi sécuriser tout type de trafic : HTTP, FTP, etc.
TLS est le prolongement de SSL (Secure Socket Layer). SSL a initialement été
développé par Netscape et a fait l'objet de trois versions. La version 1.0, publiée en juillet
1994, n'a pas été utilisée. Elle a été suivie de la version 2.0 en novembre de la même
année, puis de la version 3.0 en août 1996. Ces deux versions proposent sensiblement
les mêmes fonctionnalités.
L'IETF (Internet Engineering Task Force) a poursuivi les travaux de Netscape sur base
de SSL 3.0 et a publié TLS 1.0 (considéré comme étant SSL 3.1). TLS 1.0 fait l'objet de la
RFC 2246 publiée en janvier 1999. Notons que l'IETF standardise le protocole mais ne
standardise pas l'API (Application Programming Interface, interface de programmation
d'applications) offerte par les implémentations.
Technologies utilisées
TLS utilise un chiffrement symétrique (chiffrement à clé secrète) car cela est moins
coûteux qu'un chiffrement à clé publique du point de vue du temps de calcul. La clé
secrète est quant à elle calculée à partir d'une « pré-clé secrète », laquelle est échangée
grâce à un chiffrement à clé publique.
De nombreux algorithmes de hachage, de chiffrement et de compression peuvent être
utilisés. En effet, TLS est modulaire afin de permettre l'utilisation de nouveaux algorithmes
sans devoir standardiser un nouveau protocole. Une négociation entre le client et le
serveur est alors opérée afin de déterminer les algorithmes qui seront utilisés.
Les algorithmes les plus couramment utilisés sont :
• MD5 et SHA-1 pour le hachage ;
• RSA, Diffie-Hellman pour le chiffrement de la pré-clé secrète ;
• 3DES, RC4 et DES pour le chiffrement symétrique.
2 Le protocole de communication : TLS Record Protocol
Le protocole TLS est conçu de telle sorte à pouvoir sécuriser des données pour tout
type d'application. Dans le modèle en couches OSI, TLS définit la couche TLS Record
Protocol. Celle-ci s'appuie sur un protocole de transport fiable et offre ses services à une
couche supérieure.
TLS Record Protocol assure que la connexion est privée, et peut également assurer
l'identité des interlocuteurs ainsi que l'intégrité et la compression des données.
Les fonctions suivantes sont assurées lors de l'émission de messages :
• la fragmentation des données en blocs ;
• la compression (optionnel) ;
• le calcul d'un code d'authenticité des données (optionnel) ;
• le cryptage.
À la réception, les fonctions symétriques sont assurées :
• le décryptage ;
• la vérification à l'aide du code d'authenticité ;
• la décompression ;
• le réassemblage des paquets fragmentés.
Notons que les paramètres de connexion peuvent être renégociés à tout moment par
l'un ou l'autre des interlocuteurs par l'envoi d'un message de Hello.
Ici, la fonction pseudo aléatoire (PRF) est utilisée pour calculer la clé privée de session
(master_secret) à l'aide de la pré-clé privée (pre_master_secret), de la chaîne
« master secret » et des valeurs aléatoires générées par le client (ClientHello.random)
et le serveur (ServerHello.random).
Notons que la clé de session ainsi générée est la même pour le client et le serveur : il
s'agit d'une clé symétrique.
L'algorithme mis en oeuvre par HMAC permet d'assurer qu'une modification par une
tierce personne sera détectée à l'arrivée. Des attaques de type « man in the middle »
seront ainsi détectées. Toutefois, cela ne permet pas de prévenir des attaques de type
« rejeu » (ré-émission ultérieures des données). Pour y pallier, l'algorithme HMAC n'est
pas directement utilisé avec la clé secrète mais avec le résultat d'une fonction pseudo-
aléatoire (PRF, Pseudo Random Function), laquelle utilise des données échangées à
l'initialisation de la connexion (un Initialisation Vector, autrement dit un vecteur
d'initialisation) ainsi qu'un numéro de séquence. De cette façon, des échanges ne
pourront pas être rejoués au cours de la même session ou au cours d'une autre session.
Enfin, la fonction A est définie par récurrence avec les paramètres suivants :
A(0) = seed
A(i) = HMAC_hash(secret, A(i-1))
2 Sécurité WiFi
Les communications sans fil de type 802.11 (WiFi) sont très exposées aux écoutes
malveillantes du réseau (eavesdropping) et sont par conséquent très sensibles aux
problèmes de sécurité.
Le protocole EAP (Extensible Authentication Protocol) permet l'utilisation de tout type
de protocole d'authentification en rendant abstraite leur utilisation.
EAP-TLS, qui fait l'objet de la RFC 2716, apporte un niveau de sécurité intéressant en
permettant l'authentification du client et du serveur par clé publique. Toutefois, l'identité du
client (son nom d'utilisateur) est transmise en clair sur le réseau avant l'authentification.
Cela provoque un problème de sécurité permettant à un tiers d'obtenir l'identité du client.
EAP-TTLS (EAP-Tunneled TLS), actuellement à l'état de draft, est destiné à résoudre
ce problème. Le protocole met en jeu trois acteurs : le client, le serveur et un serveur
TTLS. Un tunnel TLS est d'abord créé entre le client et le serveur TTLS. L'authentification
du client est ensuite réalisée à l'intérieur de ce tunnel. La communication entre le client et
le serveur peut ensuite démarrer.
4 FTP
Le protocole TLS sécurise une connexion dans son ensemble. C'est ce qui est réalisé
lorsque TLS est utilisé pour sécuriser une connexion FTP. L'IETF travaille actuellement à
la mise au point d'une extension du jeu de commandes FTP destinée à rendre plus
modulaire la sécurisation du protocole.
Le draft Murray définit la manière dont le client et le serveur pourront communiquer
afin de sécuriser de manière indépendante chaque échange. L'authentification du client
pourra être réalisée avec un algorithme différent de celui qui sera utilisé pour transférer
des données, par exemple. Il est également possible de ne sécuriser que l'authentification
sans chiffrer les données.
Les commandes utilisées sont au nombre de quatre : AUTH, PBSZ, PROT et CCC. La
commande AUTH, associée au paramètre TLS, permet l'authentification. Les commandes
PBSZ (protection buffer size) et PROT permettent quant à elle le passage en mode chiffré.
Enfin, la commande CCC permet de revenir un mode non sécurisé.
CONCLUSION
Nous avons tout d'abord introduit différents problèmes de sécurité liés à l'échange de
données privées sur un support de communication public. Puis, nous avons présentés
des mécanismes cryptographiques généraux destinés à y remédier. Nous avons enfin
présentés les protocoles SSH et TLS.
SSH et TLS permettent d'apporter un haut niveau de sécurisation à des protocoles
couramment utilisés mais généralement non sécurisés. De plus, ces protocoles utilisent
des algorithmes cryptographiques ouverts et qui peuvent donc être étudiés afin de vérifier
leur sécurité. En ce sens, ils sont intéressants.
De par leur conception, SSH et TLS ne sont pas adaptés aux mêmes applications.
SSH est en effet particulièrement adapté à l'administration distante. Toutefois, ce
protocole n'est pas adapté au transfert de données en raison de l'utilisation d'algorithmes
à clé publique (coûteux en temps processeur). En revanche, TLS est parfaitement adapté
à ce besoin.
On notera que des extensions des deux protocoles existent afin de s'adapter plus
particulièrement aux utilisations courantes (FTP sur TLS, par exemple).
Notons enfin que des implémentations open source des deux protocoles existent. On
peut notamment citer OpenSSH et OpenSSL. Grâce à ces deux bibliothèques, tout
développeur peut sécuriser une application en utilisant des mécanismes maîtrisés et
standardisés.
SSH et TLS sont donc deux protocoles complémentaires très intéressants pour leur
facilité d'intégration et le haut niveau de sécurité qu'ils apportent.