UE31 - M3102 (Services Réseaux) : Enoncé TP 3

Transcription

UE31 - M3102 (Services Réseaux) : Enoncé TP 3
C. Pain-Barre
Département Informatique, Aix
UE31 - M3102 : Services Réseaux
Enoncé du TP 3
Services SSH et TELNET
Table des matières
1
Préparation de la séance
Exercice 1 (Démarrage d’un lab Marionnet et d’une VM XP) . . . . . . . . . . . . . . . . . . . . . . .
2
Introduction à SSH
Exercice 2 (Vérification du service SSH (sshd) de m2) . . . . . . . . . . . . . . .
2.1 Utilisation du client ssh . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Authentification d’un serveur SSH . . . . . . . . . . . . . . . . . . . . . . .
2.2.A Authentification d’un serveur inconnu . . . . . . . . . . . . . . . . .
Exercice 3 (Première connexion SSH sur m2 depuis m1) . . . . . . .
2.2.B Enregistrement de la clé publique du serveur côté client . . . . . . . .
2.2.C Hashage des fichiers known_hosts . . . . . . . . . . . . . . . . . . .
Exercice 4 (fichier known_hosts de bob sur m1) . . . . . . . . . . . .
2.2.D Emplacement des clés d’un serveur SSH . . . . . . . . . . . . . . . .
Exercice 5 (Étude des clés RSA privée et publique de m2) . . . . . .
2.2.E Serveur approuvé et clé(s) de session . . . . . . . . . . . . . . . . .
2.2.F Contrôler manuellement la clé publique du serveur . . . . . . . . . .
2.2.G Supprimer manuellement la clé publique d’un serveur . . . . . . . .
2.3 Authentification de l’utilisateur . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.A Authentification utilisateur par mot de passe . . . . . . . . . . . . . .
2.3.B Authentification utilisateur par paire de clés . . . . . . . . . . . . . .
2.4 Création d’une paire de clés sous Linux . . . . . . . . . . . . . . . . . . . .
Exercice 6 (Génération d’une paire de clés pour bob sur m1 avec ssh-keygen)
2.5 Déposer sa clé publique sur le serveur . . . . . . . . . . . . . . . . . . . . .
Exercice 7 (dépôt manuel de la clé publique de bob sur m2) . . . . . . . . . .
2.6 Préparation à l’utilisation de la paire de clés . . . . . . . . . . . . . . . . . .
Exercice 8 (mise en conformité des droits) . . . . . . . . . . . . . . . . . . .
2.7 Connexion avec la paire de clés . . . . . . . . . . . . . . . . . . . . . . . . .
Exercice 9 (Connexion sur m2 par paire de clés) . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
4
5
5
5
6
6
6
7
7
8
8
8
9
9
9
9
10
11
11
12
12
12
13
13
Possibilités offertes par SSH
3.1 Exécution de commandes à distance par ssh . . . . . . .
Exercice 10 (exécution de commandes distantes par SSH)
3.2 Copie de fichiers/répertoires par scp . . . . . . . . . . .
Exercice 11 (copie sécurisée par scp) . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
13
14
15
15
16
3
IUT Aix-Marseille - INFO Aix
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
26/9/2016
3
3
- C. Pain-Barre
UE31 - M3102 : Services Réseaux
Enoncé du TP 3
2/33
4
SSH et la redirection de ports (tunneling)
17
4.1 Principe du tunneling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.2 Mise en place de la redirection de port local avec ssh . . . . . . . . . . . . . . . . . . . . . . . . 19
4.3 Mise en place de la redirection de port distant avec ssh . . . . . . . . . . . . . . . . . . . . . . . 20
5
SSH et la redirection X11
20
Exercice 12 (X11 forwarding de m3 vers le PC) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
6
Et SSH sur Windows ?
7
Jouons un peu avec SSH (et HTTP)
22
Exercice 13 (Service SSH sur m2 et tunneling SSH) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Exercice 14 (Service HTTP sur m2 et tunneling SSH) . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
21
Compléments
23
8
Étude des faiblesses de TELNET
23
Exercice 15 (Activation du service TELNET sur m2) . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Exercice 16 (Analyse du trafic TELNET) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
9
Introduction au chiffrement
9.0.A Critique du chiffrement symétrique .
9.1 Le chiffrement asymétrique . . . . . . . . . .
9.1.A Paires de clés et trousseau . . . . . .
9.1.B Cryptage/Décryptage par paire de clés
9.1.C Signature/vérification par paire de clés
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
25
25
26
26
27
27
10 Attaque man-in-the-middle
28
11 Le fournisseur de passphrase ssh-agent
29
12 Transfert de fichiers par sftp
30
Exercice 17 (transfert de fichiers par sftp) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
13 Profils et options de ssh
C. Pain-Barre -
26/9/2016
31
IUT Aix-Marseille - INFO Aix
3/33
1
Enoncé du TP 3
UE31 - M3102 : Services Réseaux
Préparation de la séance
Exercice 1 (Démarrage d’un lab Marionnet et d’une VM XP)
Nous allons travailler sur des machines virtuelles mises en réseau dans le simulateur Marionnet, conformément
à la figure 1.
1. Télécharger le fichier m3102_tpssh_lab1.mar, l’ouvrir dans Marionnet et cliquer sur Tout Démarrer.
Outre le hub H1 dont on ne s’occupera pas, les équipements de ce réseau virtuel sont :
• m1 : machine Linux d’adresse 10.0.2.15/24 ;
• m2 : machine Linux d’adresse 10.0.2.10/24 ;
• m3 : machine Linux d’adresse 10.0.2.99/24 ;
• G1 : routeur d’accès vers Internet, qui possède l’adresse 10.0.2.2/24 dans Marionnet
• B1 : représente une machine (virtuelle) Windows XP que l’on va créer et intégrer ci-après avec
l’adresse 10.0.2.100/24
2. Télécharger le script m3102_labssh_mkxp4mario.bash et l’exécuter pour créer et démarrer la machine
virtuelle Windows XP qui est représentée par B1 dans Marionnet (commencer à lire la section 2 le temps
qu’elle démarre. . .)
3. Une fois la VM XP démarrée, se loger en tant que iutinfo (compte Administrateur sans mot de passe).
Pour qu’elle occupe le rôle de B1, la configurer avec l’adresse 10.0.2.100/24 et G1 comme passerelle
(routeur par défaut). Pour cela, deux possibilités :
• soit en ouvrant un invite de commandes (menu Démarrer −→ Exécuter. . .) et utiliser netsh (sur une
seule ligne) :
C:\>netsh int ip set address "Connexion au réseau local"
static adresse-ip masque passerelle métrique
avec adresse-ip = 10.0.2.100, masque = 255.255.255.0, passerelle = 10.0.2.2
et métrique = 20 (valeur arbitraire. . .).
• soit aller dans le menu Démarrer −→ Panneau de Configuration, puis Connexions réseau et doublecliquer sur la carte Connexion au réseau local. Sur la fenêtre qui s’affiche, cliquer sur Propriétés, puis sélectionner Protocole Internet (TCP/IP) et cliquer sur Propriétés. Sélectionner Utiliser
l’adresse IP suivante et renseigner les champs correspondants
4. Vérifier que la configuration de cette VM XP est correcte avec un ping de m2 depuis l’invite de commande
[Corrigé]
F IGURE 1 – Environnement de travail dans Marionnet
IUT Aix-Marseille - INFO Aix
26/9/2016
- C. Pain-Barre
UE31 - M3102 : Services Réseaux
2
Enoncé du TP 3
4/33
Introduction à SSH
Le protocole SSH (pour Secure SHell) étend considérablement le service offert par TELNET, le protocole de
terminal virtuel pour le travail à distance. Il remplace aussi rsh (remote shell), qui étendait TELNET avec des
facilités pour le travail distant entre environnements Unix.
Une importante faiblesse historique de TELNET (et de rsh) est que le trafic entre le client et le serveur n’est
pas chiffré et peut être intercepté, révélant toute l’activité de l’utilisateur, ainsi que son nom d’utilisateur et son
mot de passe. Une étude de cette faiblesse de TELNET est proposée en exercices complémentaires en section 8.
Cette faiblesse est corrigée dans SSH qui établit un canal de transmission full-duplex fiable et chiffré (crypté)
entre le client et le serveur. Pour cela, SSH utilise le chiffrement asymétrique pour crypter certains échanges puis
utilise un chiffrement symétrique une fois les paramètres de la communication négociés. Des informations complémentaires sur le chiffrement figurent en section 9.
La figure 2 montre cette première différence entre TELNET et SSH, où les serveurs TELNET et SSH de
bagheera utilisent les ports TCP qui leur sont réservés : 23 pour TELNET, et 22 pour SSH.
#54321
connexion TELNET non chiffrée
#23
#12345
connexion SSH chiffrée
#22
mowgli
bagheera
F IGURE 2 – bagheera héberge un serveur TELNET (port 23) et un serveur SSH (port 22). Le port des
clients TELNET et SSH de mowgli est quelconque. La connexion TELNET n’est pas chiffrée
mais la connexion SSH l’est.
Mais SSH ajoute bien plus de fonctionnalités que TELNET ! Il offre notamment, via son sous-système
SCP/SFTP, un service de transfert de fichiers de type FTP, mais chiffré.
SSH existe en deux versions majeures 1 et 2 qui sont incompatibles. La version 2 est la plus sécurisée et il est
maintenant déconseillé d’utiliser la version 1.
i
Pour illustrer certaines notions de SSH, nous utiliserons dans un premier temps le client SSH le plus
utilisé sur Linux : ssh. Le serveur SSH sous Linux est généralement sshd.
Exercice 2 (Vérification du service SSH (sshd) de m2)
1. Sur m2, se loger en root (mot de passe root) et utiliser netstat pour lister les services en écoute sur TCP,
et vérifier que le service SSH est bien activé, en écoute sur le port 22
2. Ajouter à netstat l’option -p afin de constater que le service SSH est assuré par le démon sshd (situé dans
/usr/sbin)
[Corrigé]
C. Pain-Barre -
26/9/2016
IUT Aix-Marseille - INFO Aix
5/33
Enoncé du TP 3
2.1
UE31 - M3102 : Services Réseaux
Utilisation du client ssh
Nous allons étudier ssh, le client SSH sous Linux. Celui-ci accepte de nombreuses options dont certaines
seront étudiées au cours de ce TP. Pour une simple connexion à un serveur, 3 syntaxes sont utilisables.
Synopsis
ssh -l utilisateur {-o options-ssh} serveur
ssh {-o options-ssh} utilisateur @serveur
ssh {-o options-ssh} serveur
Les deux premières formes sont équivalentes et doivent être utilisées pour préciser utilisateur comme nom
d’utilisateur si celui-ci diffère entre le client et le serveur. La dernière forme est utilisable si le nom d’utilisateur
est le même sur le serveur que sur le client.
L’option -o permet d’indiquer des options en suivant la syntaxe du fichier de configuration de ssh. Nous y
reviendrons quand nous présenterons ces fichiers.
2.2
Authentification d’un serveur SSH
Pour établir le canal crypté, SSH prévoit une authentification du serveur par le client. Puis, lorsque ce
canal est établi, c’est au serveur qu’il incombe d’authentifier l’utilisateur qui souhaite se loger (ou utiliser ses
fonctionnalités).
Pour authentifier le serveur et initier la connexion, SSH utilise une paire de clés publique/clé privée et un
mécanisme de chiffrement asymétrique. Lors de l’installation du serveur SSH, une paire de clés est générée. Elle
doit rester la même tant que l’administrateur n’a pas détecté un risque de vol de la clé privée. La clé publique est
transmise aux clients pour authentifier le serveur et est un élément du chiffrement de la connexion.
2.2.A
Authentification d’un serveur inconnu
Lorsque qu’un client SSH se connecte à un serveur inconnu, il ne peut vérifier la clé publique que le serveur lui
transmet. Selon la configuration du client, celui-ci peut aller jusqu’à refuser le dialogue avec un serveur inconnu.
Dans la grande majorité des cas, le client SSH informe l’utilisateur qu’il ne peut assurer l’authenticité du serveur
et lui demande s’il doit continuer comme dans l’exemple suivant :
$ ssh allegro.iut.univ-aix.fr
The authenticity of host 'allegro.iut.univ-aix.fr (139.124.187.4)' can't be established.
RSA key fingerprint is 93:92:5c:40:21:e5:67:e0:9f:53:11:1f:ec:b1:36:52.
Are you sure you want to continue connecting (yes/no)?
i
Le nom, l’adresse et les clés d’allegro ont changé depuis la rédaction de ce TP. . .
Il revient donc à l’utilisateur de s’assurer que le serveur est le bon ! L’idéal serait que la clé publique du
serveur soit communiquée au préalable à l’utilisateur (par exemple sur une page Web) mais ce n’est généralement
pas le cas.
M
La plupart des utilisateurs n’ayant aucun moyen de la vérifier, l’acceptent sans autre vérification,
ce qui les expose aux attaques de type man-in-the-middle (voir section 10). Une possibilité de
contrôle de cette clé est présentée à la section 2.2.F.
IUT Aix-Marseille - INFO Aix
26/9/2016
- C. Pain-Barre
UE31 - M3102 : Services Réseaux
Enoncé du TP 3
6/33
Cette acceptation se fait en répondant yes à la question posée précédemment comme sur l’exemple suivant :
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'allegro.iut.univ-aix.fr,139.124.187.4' (RSA) to the list of known hosts.
Suite à l’acceptation de la clé publique, le serveur est considéré comme authentifié.
Exercice 3 (Première connexion SSH sur m2 depuis m1)
1. Se loger en bob (mot de passe eponge) sur m1. Utiliser ssh pour initier une connexion SSH sur m2 en tant
que l’utilisateur milou, mais en répondant no à la question demandant si l’on veut poursuivre la connexion
2. En répondant no précédemment, on a refusé la clé publique (du serveur) de m2 et le client ssh s’est arrêté.
Recommencer et répondre yes à la même question puis entrer tintin comme mot de passe de milou sur
m2. Le prompt de m2 devrait s’afficher sur cette connexion SSH maintenant effective.
3. Depuis ce shell en tant que milou sur m2, utiliser netstat pour afficher la liste des connexions TCP, et voir
apparaître celle de cette session SSH
4. Terminer la connexion avec exit pour revenir au shell de m1
5. Recommencer une nouvelle connexion SSH avec m2 et observer qu’il n’est plus demandé de valider la
clé du serveur. En effet, la clé publique de m2 a été sauvegardée car l’on a approuvé son identité. Ne pas
continuer la connexion (en tapant Entrée à chaque demande du mot de passe) pour revenir à m1
[Corrigé]
2.2.B
Enregistrement de la clé publique du serveur côté client
La ligne Warning: qui suit l’acceptation de l’utilisateur indique que l’"identité" du serveur (nom, adresse,
clé publique) est enregistrée dans le fichier $HOME/.ssh/known_hosts (de l’utilisateur). Pour les connexions
futures, le serveur devrait être automatiquement reconnu grâce à ce fichier. Si le serveur est connu mais que la
clé publique annoncée n’est pas la même (elle peut avoir changé ou une attaque man-in-the-middle est en cours),
l’utilisateur en sera averti et selon la configuration du client SSH, celui-ci refusera de continuer (mais, le cas
échéant, on pourra modifier le fichier $HOME/.ssh/known_hosts pour enlever la ligne concernant l’ancienne
clé du serveur puis recommencer la connexion).
i
2.2.C
Il est possible pour l’administrateur système de renseigner le fichier /etc/ssh/ssh_known_hosts
pour contenir les identités de serveurs auxquels les utilisateurs peuvent se connecter. Cela leur évite de
les authentifier eux-mêmes. . .
Hashage des fichiers known_hosts
Selon l’installation du client SSH, les fichiers known_hosts contiennent les clés publiques des serveurs plus
ou moins en clair. Par exemple, la clé d’allegro serait stockée ainsi (sur une ligne) :
$ ssh-keygen -F allegro
allegro,139.124.187.4 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAntyWXC9hVDfBxhXLQ933/
bWLxEQualfiv65C0FnWb6EQ1Ww13ye1tbCUb4lFgbkoAtSgLRld4/2olbw0Gt37XMW2w95VzeqB66nr
aXORQAdk+svyFGGJe5OJ3dCizw0t7LEk0SZ9iLxPF9la1Y+g9P2LCzv+PGvkiuG7lr4dIv6NKTg8oZE
LxWA2QV/cEBOjuIxRo5CgXWFt1eEj43ARJEr0vqRaMLbUlsBJ9p9CPhbu+ZPnPffoHtlRWSobsd2Psu
BcWDXHrACF7EZwr2Og/W8O4wIUqmxIlnGvdQcx0tx54uSL5g/VeN7+8AI1nypcP1Ib+260UttwrvYqN
NdRgQ==
C. Pain-Barre -
26/9/2016
IUT Aix-Marseille - INFO Aix
7/33
Enoncé du TP 3
i
UE31 - M3102 : Services Réseaux
Dans cet exemple, le nom court du serveur a été suffisant mais il est possible de devoir utiliser son nom
complet.
Or, on voit que l’adresse IP d’allegro apparaît. Ce n’est pas très sûr car les utilisateurs ont tendance à avoir
le même mot de passe sur les ordinateurs qu’ils utilisent. Si un attaquant a réussi à voler le mot de passe d’un
utilisateur, alors en consultant ce fichier, il sait que cet utilisateur a probablement le même mot de passe sur les
serveurs qu’il contient et peut tenter de s’y introduire. C’est pourquoi généralement les fichiers known_hosts
sont hashés et il n’est pas possible de retrouver les noms ou adresses des serveurs correspondants. En cas de
hashage (comme sur une Debian récente), l’identité d’allegro est stockée par la ligne suivante :
$ ssh-keygen -F allegro
|1|pvSbQKVwGqNFKnsm84Dc6KZ+pVQ=|tgobOSbewGa5WvJ5LQ659BAs0yw= ssh-rsa AAAAB3NzaC
1yc2EAAAABIwAAAQEAntyWXC9hVDfBxhXLQ933/bWLxEQualfiv65C0FnWb6EQ1Ww13ye1tbCUb4lFg
bkoAtSgLRld4/2olbw0Gt37XMW2w95VzeqB66nraXORQAdk+svyFGGJe5OJ3dCizw0t7LEk0SZ9iLxP
F9la1Y+g9P2LCzv+PGvkiuG7lr4dIv6NKTg8oZELxWA2QV/cEBOjuIxRo5CgXWFt1eEj43ARJEr0vqR
aMLbUlsBJ9p9CPhbu+ZPnPffoHtlRWSobsd2PsuBcWDXHrACF7EZwr2Og/W8O4wIUqmxIlnGvdQcx0t
x54uSL5g/VeN7+8AI1nypcP1Ib+260UttwrvYqNNdRgQ==
Dans les deux cas, on peut afficher l’empreinte de la clé publique d’un serveur en ajoutant l’option -l :
$ ssh-keygen -F allegro -l
# Host allegro found: line 1 type RSA
2048 93:92:5c:40:21:e5:67:e0:9f:53:11:1f:ec:b1:36:52 |1|pvSbQKVwGqNFKnsm84Dc6KZ
+pVQ=|tgobOSbewGa5WvJ5LQ659BAs0yw= (RSA)
Exercice 4 (fichier known_hosts de bob sur m1)
Sur m1 :
1. utiliser cat pour afficher le fichier ~/.ssh/known_hosts de bob qui ne devrait contenir qu’une seule
ligne car seul m2 a été approuvé par bob
2. exécuter la commande ssh-keygen -F 10.0.2.10 qui devrait renvoyer une information similaire
3. Exécuter ssh-keygen -l -f .ssh/known_hosts pour afficher les empreintes des clés publiques
des serveurs approuvés par bob. Seule devrait apparaître celle qu’on a validé lors de la connexion à m2
[Corrigé]
2.2.D
Emplacement des clés d’un serveur SSH
Les clés publiques et privées d’un serveur SSH sous Linux sont situées dans le répertoire /etc/ssh et sont
contenues dans les fichiers :
• ssh_host_key
• ssh_host_key.pub
• ssh_host_dsa_key
• ssh_host_dsa_key.pub
• ssh_host_rsa_key
• ssh_host_rsa_key.pub
Ces 6 fichiers définissent 3 paires de clés :
IUT Aix-Marseille - INFO Aix
26/9/2016
- C. Pain-Barre
UE31 - M3102 : Services Réseaux
Enoncé du TP 3
8/33
• les ssh_host_key* définissent les clés pour SSH version 1 (obsolète)
• les ssh_host_dsa_key* définissent les clés DSA pour SSH version 2
• les ssh_host_rsa_key* définissent les clés RSA pour SSH version 2 : ce sont les clés les plus employées.
Les clés publiques sont dans les fichiers d’extension .pub et sont lisibles par tous. Les autres fichiers contiennent
les clés privées et ne sont accessibles qu’à root.
Exercice 5 (Étude des clés RSA privée et publique de m2)
En root sur m2 :
1. Utiliser cat pour afficher le fichier /etc/ssh/ssh_host_rsa_key qui contient la clé RSA privée du
serveur
2. De même, afficher le fichier /etc/ssh/ssh_host_rsa_key.pub contenant la clé RSA publique du
serveur
3. Exécuter ensuite ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub pour afficher l’empreinte (fingerprint) de cette clé. Noter que c’est la même clé qui est stockée dans le fichier known_hosts
de bob sur m1.
[Corrigé]
2.2.E
Serveur approuvé et clé(s) de session
Si le client SSH approuve la clé publique du serveur (car contenue dans le fichier known_hosts ou approuvée
manuellement par l’utilisateur), il l’utilise pour négocier avec le serveur les clés et les algorithmes à employer
pour crypter les transmissions. En particulier, le client transmet au serveur une clé de session cryptée avec la clé
publique du serveur (ainsi que l’algorithme utilisé). Cette clé de session sera utilisée ensuite dans les échanges
par un chiffrement symétrique. Le serveur est le seul qui peut décrypter la clé de session car il est le seul à
posséder la clé privée associée à la clé publique qui a servi au chiffrement. La clé de session et les algorithmes
seront renégociés régulièrement au cours de la communication SSH. Notons qu’il y normalement une clé de
session par sens de transmission.
-
2.2.F
La clé publique du serveur est très importante car elle permet d’authentifier le serveur et de lui transmettre la clé de session. Si l’on connaît la clé publique du serveur, cette méthode rend impossible
l’attaque de type man-in-the-middle (expliquée en compléments du TP dans la section 10).
Contrôler manuellement la clé publique du serveur
Lors d’une première connexion où l’on a dû accepter manuellement la clé du serveur, il est conseillé, une fois
logé en SSH (après s’être authentifié auprès du serveur), de vérifier l’empreinte de cette clé directement sur le
serveur, afin d’être [à peu près] sûr qu’on discute bien avec la machine qui nous a répondu. Cela se vérifie en
tapant, sur le serveur, la même commande que dans l’exercice 5 :
allegro$ ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub
2048 93:92:5c:40:21:e5:67:e0:9f:53:11:1f:ec:b1:36:52 /etc/ssh/ssh_host_rsa_key.pub (RSA)
où le fichier à utiliser doit correspondre au type de clé indiqué lors de la connexion. Ici, l’empreinte d’allegro
correspond bien à ce qui a été reçu en section 2.2.A et l’on peut être rassuré.
i
En cas d’attaque man-in-the-middle, l’attaquant doit intercepter cette commande et répondre par l’empreinte de sa machine (celle communiquée au départ). S’il le fait, là, on est mal. . .
C. Pain-Barre -
26/9/2016
IUT Aix-Marseille - INFO Aix
9/33
Enoncé du TP 3
2.2.G
UE31 - M3102 : Services Réseaux
Supprimer manuellement la clé publique d’un serveur
Il arrive (malheureusement trop souvent) qu’un serveur ait changé sa clé publique, généralement suite à une
réinstallation alors que l’administrateur n’a pas pris soin de remettre l’ancienne clé. Dans ce cas, lors d’une nouvelle connexion, on a toutes les chances de voir notre client ssh refuser de continuer.
Si l’on est sûr que le changement de clé est normal et non dû à une attaque, il faut alors supprimer du fichier
$HOME/.ssh/known_hosts la clé publique du serveur. Un moyen simple de faire ça (en particulier si le fichier
est hashé) est d’utiliser la commande suivante :
$ ssh-keygen -R serveur
2.3
Authentification de l’utilisateur
Sur le canal crypté établi précédemment, le serveur communique au client les différentes méthodes d’authentification de l’utilisateur qu’il accepte. Il y en a plusieurs. Détaillons celle par mot de passe et celle par paire de
clés publique/privée.
2.3.A
Authentification utilisateur par mot de passe
C’est l’authentification que nous avons utilisée à l’exercice 3. Le client communique le nom d’utilisateur et
un mot de passe que l’utilisateur lui aura indiqués. Si le mot de passe est correct, le serveur réussit à ouvrir un
shell avec l’identité de l’utilisateur, et celui-ci est alors authentifié.
-
2.3.B
Cette méthode a l’inconvénient majeur de faire transiter le mot de passe de l’utilisateur. Si le serveur
contacté n’est pas le bon (rappelons-nous de la pertinence de l’authentification du serveur), alors le
mot de passe peut être facilement volé.
D’autre part, il est possible que le mot de passe soit volé simplement en regardant par dessus l’épaule
de l’utilisateur pendant qu’il le tape, ou même par un logiciel (keylogger) qui intercepte les frappes au
clavier. . .
Authentification utilisateur par paire de clés
Dans ce contexte, le mot de passe utilisateur ne sera pas transmis au serveur (sauf lors de la première
connexion). Pour cela, l’utilisateur doit au préalable :
• générer une paire de clés publique/privée qui sera utilisée pour l’authentification. La clé privée doit être
protégée par une passphrase (sa taille peut être bien plus grande qu’un mot de passe unix)
• déposer sa clé publique sur le serveur (cette étape nécessite généralement une identification par mot de
passe)
• configurer le client pour utiliser sa clé privée. Cette étape n’est pas nécessaire avec les clients SSH récents
sous Linux.
La méthode d’authentification par paire de clés diffère entre SSH1 et SSH2 mais dans les deux cas le client
SSH demandera à l’utilisateur la passphrase qui protège sa clé privée pour l’utiliser. En SSH2 (il faut éviter SSH1
qui est vulnérable à l’attaque man-in-the-middle 1 ), le client va signer l’identification de session SSH avec la clé
privée de l’utilisateur puis l’envoyer au serveur. Le serveur consulte alors le fichier ~/.ssh/authorized_keys
de l’utilisateur à la recherche d’une clé publique correspondante. S’il en trouve une et que la signature de l’identifiant de session est correcte, l’utilisateur est authentifié.
1. Il existe des attaques man-in-the-middle qui réussissent en forçant le client et le serveur à utiliser SSH1. . .
IUT Aix-Marseille - INFO Aix
26/9/2016
- C. Pain-Barre
UE31 - M3102 : Services Réseaux
Enoncé du TP 3
10/33
Bien qu’en apparence plus lourde (car la passphrase est plus longue que le mot de passe), cette méthode n’a
que des avantages par rapport à la précédente et devrait être utilisée chaque fois que c’est possible. En effet :
• le mot de passe ne circulant pas (sauf la fois où l’on dépose la clé publique), il ne peut être intercepté
• cette méthode d’authentification (en SSH2) est immunisée contre les attaques man-in-the-middle car
les identifiants de session font partie des informations signées. L’attaquant ayant des identifiants pour les
deux connexions ne peut pas utiliser ce qui vient d’une connexion pour le rediriger sur l’autre qui utilise
un autre identifiant
• même si quelqu’un nous observe quand on tape la passphrase, il y a peu de chances qu’il puisse s’en
souvenir car elle doit être longue
• même si la passphrase est volée, il faut aussi voler la clé privée or elle est contenue dans un répertoire
protégé de l’utilisateur
• il est possible d’utiliser un "agent" SSH dont le rôle est de débloquer la clé privée chaque fois que le client
SSH en a besoin. Dans ce cas, on fournit une seule fois la passphrase à cet agent qui s’en souviendra
durant la session de l’utilisateur pour toutes les connexions SSH qui suivent.
2.4
Création d’une paire de clés sous Linux
La création d’une paire de clés se fait avec ssh-keygen, qui a de multiples usages. Pour la création de clés,
son synopsis est le suivant.
Synopsis
ssh-keygen -b taille -t type -C commentaire -f fichier
où :
• -b taille précise la taille en bits de la clé à créer. On prendra de préférence une clé de 2048 bits (les clés
DSA sont limitées à 1024 bits)
• -t type précise le type de clé à créer où type peut être :
rsa1 pour l’utilisation de SSH1 (à éviter)
rsa pour une clé RSA en SSH2 (à préférer car plus rapide que DSA)
dsa pour une clé DSA en SSH2 (inventé quand RSA était sous licence, rarement utilisé aujourd’hui)
on utilisera donc une clé de type rsa
• -C commentaire (où commentaire est un seul mot mais on peut éventuellement protéger les espaces)
permettra d’identifier la clé de manière à se rappeler pourquoi on l’a créée (on peut créer différentes clés
pour différents usages)
• -f fichier est la référence du fichier où placer la clé privée. La clé publique associée sera placée dans le
fichier fichier.pub. Si l’on ne précise pas cette option, le fichier par défaut est créé dans le répertoire
$HOME/.ssh et porte un nom différent selon le type de clé :
identity pour RSA de SSH1
id_rsa pour RSA de SSH2
id_dsa pour DSA de SSH2
Cette option n’est utile que si l’on crée plusieurs paires de clés pour des usages différents.
i
En principe, les clients SSH Linux récents utilisent par défaut les bons paramètres. Mais on utilisera
tout de même dans ce qui suit les options -b, -t et -C.
C. Pain-Barre -
26/9/2016
IUT Aix-Marseille - INFO Aix
11/33
Enoncé du TP 3
UE31 - M3102 : Services Réseaux
Exemple 1
Voici un exemple de création de clés avec ssh-keygen :
$ ssh-keygen -b 2048 -t rsa -C "pour l'iut"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/cpb/.ssh/id_rsa): 8
Enter passphrase (empty for no passphrase): la passphrase non affichée
Enter same passphrase again: la passphrase non affichée
Your identification has been saved in /home/cpb/.ssh/id_rsa.
Your public key has been saved in /home/cpb/.ssh/id_rsa.pub.
The key fingerprint is:
2b:2d:f0:79:55:27:6e:fb:8a:5b:f5:1a:7b:20:8f:25 pour l'iut
Comme on le voit, l’utilisateur est invité à entrer une passphrase (et la confirmer) qui protégera (le fichier
contenant) la clé privée. Elle peut être vide mais ce n’est pas conseillé car la clé ne serait pas protégée. La
passphrase devrait contenir au moins 16 caractères comprenant des caractères non alphabétiques. Elle ne devrait
pas être une phrase d’un livre ni d’une chanson. Et l’on doit être capable de s’en souvenir ! Il n’y a aucun
moyen de retrouver la passphrase si on l’a oubliée. Les clés qui en dépendent peuvent alors être mises à la
poubelle et il faut régénérer une paire de clés.
Exercice 6 (Génération d’une paire de clés pour bob sur m1 avec ssh-keygen)
Sur m1, en tant que bob :
1. Générer une clé RSA (SSH2) de 2048 bits avec ssh-keygen. Penser à entrer une passphrase.
2. Consulter le contenu du répertoire ~/.ssh. Il devrait y avoir les fichiers id_rsa (clé privée) et
id_rsa.pub (clé publique)
3. Ces fichiers sont des fichiers texte. Les faire afficher.
[Corrigé]
2.5
Déposer sa clé publique sur le serveur
Il s’agit de déposer uniquement sa clé publique sur le serveur pour qu’elle soit utilisée. Cette clé doit être
placée dans le fichier $HOME/.ssh/authorized_keys de l’utilisateur sur le serveur.
i
Ce fichier peut contenir plusieurs clés publiques, à raison d’une par ligne, car l’utilisateur peut disposer
de plusieurs clés privées (réparties éventuellement sur des ordinateurs différents).
Il y a plusieurs méthodes pour placer la clé publique dans ce fichier :
• manuelle : l’utilisateur édite lui même le fichier et y copie-colle la clé
• semi-automatique : l’utilisateur transfère le fichier contenant la clé publique et le renomme ou l’ajoute au
fichier authorized_keys
• automatique : l’utilisateur utilise la commande ssh-copy-id qui se charge de tout
Dans un premier temps, nous allons utiliser la méthode manuelle.
IUT Aix-Marseille - INFO Aix
26/9/2016
- C. Pain-Barre
UE31 - M3102 : Services Réseaux
Enoncé du TP 3
12/33
Exercice 7 (dépôt manuel de la clé publique de bob sur m2)
1. Sur le PC, ouvrir un éditeur de texte et copier-coller la clé publique de bob sur m1 qui devrait être affichée
sur le terminal (le contenu de son fichier ~/.ssh/id_rsa.pub)
2. En tant que bob sur m1, se connecter en SSH comme milou sur m2
3. Sur cette connexion (milou@m2), créer le répertoire .ssh (dans le répertoire personnel de milou)
4. Créer le fichier authorized_keys dans .ssh en exécutant simplement
milou@m2:~$ cat > ~/.ssh/authorized_keys
ou en utilisant vi si vous préférez
5. Sélectionner (pour la copier) la ligne placée précédemment dans l’éditeur de texte (la clé publique de bob)
6. Coller ce contenu sur le terminal de milou@m2. si vous utilisez cat. Faire bien attention que le tout constitue bien une seule ligne et se termine par un retour à la ligne.
i
Si vous utilisez vi n’oubliez pas de taper i pour passer en mode insertion avant de coller !
7. Taper CTRL-D pour terminer cat (ou sauver le fichier et quitter vi)
8. Afficher le fichier pour voir si tout est correct
[Corrigé]
2.6
Préparation à l’utilisation de la paire de clés
Pour le moment, on ne peut probablement pas utiliser la paire de clés. En effet, SSH est très capricieux
concernant les fichiers/répertoires des utilisateurs. En particulier, côtés client et serveur, il faut :
• que le répertoire personnel de l’utilisateur soit inaccessible en écriture aux membres du groupe et aux
autres. Il faut s’en assurer en exécutant chmod go-w ~ sur les deux machines
• que le répertoire .ssh soit complètement inaccessible pour les membres du groupe et les autres, et pleinement accessible pour l’utilisateur. Il faut s’en assurer en exécutant chmod 700 ~/.ssh sur les deux
machines
• que les fichiers du répertoire .ssh soient totalement inaccessibles pour les membres du groupe et les
autres. Il faut s’en assurer en exécutant chmod go-rw ~/.ssh/* sur les deux machines.
i
En réalité, pour ce dernier point il faut surtout protéger la clé privée. Les autres fichiers peuvent
être accessibles en lecture mais cela n’a pas d’intérêt (bien au contraire).
Exercice 8 (mise en conformité des droits)
Faire le nécessaire pour mettre en conformité les droits des fichiers de milou sur m2, puis quitter la connexion
SSH milou@m2 pour préparer les fichiers de bob sur m1.
[Corrigé]
C. Pain-Barre -
26/9/2016
IUT Aix-Marseille - INFO Aix
13/33
-
2.7
Enoncé du TP 3
UE31 - M3102 : Services Réseaux
La commande ssh-copy-id est un script qui se charge de transférer la clé publique et de créer le
répertoire .ssh s’il n’existe pas côté serveur, le tout avec les bonnes permissions. En revanche, il ne
modifie pas les permissions de ce qui existe (notamment celles du répertoire personnel de l’utilisateur)
ni celles de la machine cliente. Son utilisation est quand même bien pratique.
Connexion avec la paire de clés
La version de ssh actuelle sous Linux est configurée pour tenter l’authentification par paire de clés (RSA
SSH2) avant celle par mot de passe. Dans le doute on peut préciser l’option -o PreferredAuthentications=
publickey. Une autre option intéressante est celle précisant (le fichier de) la clé privée à utiliser au cas où on en
a plusieurs. Cette option est -i fichier-clé.
Dans notre cas, nous ne devrions avoir besoin d’aucune de ces options.
Exercice 9 (Connexion sur m2 par paire de clés)
1. En tant que bob sur m1 se connecter en SSH comme milou sur m2. La passphrase devrait vous être
demandé pour débloquer la clé privée.
M
Si le mot de passe qui est demandé et non la passphrase, c’est que l’authentification par
paire de clés a échoué. Vous avez mal réalisé l’une des étapes précédentes (copie de la clé
publique et/ou mise en conformité des droits). Dans ce cas, faire ce qu’il faut pour corriger
le problème et retenter la connexion.
2. Terminer la connexion SSH milou@m2
3. En tant que bob@m1, exécuter les commandes suivantes et entrer la passphrase de la clé privée de bob
lorsque demandé :
bob@m1:~$ eval $(ssh-agent)
bob@m1:~$ ssh-add
Un message annonçant l’ajout de l’identité de bob doit s’afficher. À partir de ce terminal, la passphrase de
la clé privée de bob est mémorisée par l’agent ssh-agent et ne sera plus demandée.
i
Plus d’information sur l’agent ssh-agent est disponible en compléments dans la section 11.
4. Recommencer la connexion SSH milou@m2. Cette fois, la passphrase ne devrait pas être demandée. . .
5. Terminer une nouvelle fois cette session milou@m2
[Corrigé]
3
Possibilités offertes par SSH
Les utilisations possibles de SSH sont trop nombreuses pour être toutes énumérées ici. Se reporter au manuel
de ssh pour avoir une liste plus détaillée. Pour une utilisation courante que nous étudierons ici, on peut ne retenir
que :
IUT Aix-Marseille - INFO Aix
26/9/2016
- C. Pain-Barre
UE31 - M3102 : Services Réseaux
•
•
•
•
•
•
i
3.1
Enoncé du TP 3
14/33
l’exécution de commandes à distance (section 3.1)
la copie sécurisée de fichiers/répertoires par la commande scp (section 3.2)
un transfert de fichiers de type FTP mais sécurisé par la commande sftp (section 12)
la redirection de ports locaux ou distants par tunneling (section 4)
la redirection X11 (affichage de fenêtres graphiques) (section 5)
la définition de profils qui paramètrent le client ssh via le fichier $HOME/.ssh/config (section 13)
À cela peut s’ajouter la création de tunnels de type VPN mais cela nécessite les droits d’administrateur
côté client et serveur car les tunnels créent des interfaces réseau virtuelles et modifient les tables de
routage.
Exécution de commandes à distance par ssh
La possibilité d’exécuter des commandes à distance via le réseau, comme s’il s’agissait de commandes locales a été historiquement offerte sous Unix par la commande rsh et s’apparente à l’appel de procédure à distance
(Remote Procedure Call). rsh est maintenant obsolète car n’est pas sécurisée.
ssh assure le même service que rsh mais à travers la connexion chiffrée. On complète alors le synopsis de
ssh.
Synopsis
ssh {-o options-ssh} [-i fichier-clé] [-l utilisateur ] [-C] [-t] [utilisateur @]serveur [commande]
Ainsi, ce qui suit le serveur est la commande à exécuter sur le serveur, à la place d’un login-shell. La commande peut être limitée à un seul mot (comme ls) ou prendre des options ou arguments (comme ls -l rep).
Mais elle peut être aussi une succession de commandes (comme cd rep ; ls -l | less) mais dans ce cas il
faut protéger les caractères spéciaux. Le mieux est donc d’encadrer commande par des guillemets ou des quotes.
L’entrée standard et les sorties de commande sont redirigées pour être celles de ssh.
Les options -o, -i et -l sont celles vues précédemment.
L’option -C est introduite ici mais n’est pas spécifique à l’exécution d’une commande à distance : elle demande une compression de ce qui est transféré. Elle est utile s’il y a beaucoup de données qui circulent (dans un
sens ou dans l’autre).
L’option -t demande la création d’un terminal et doit être utilisée si commande nécessite une interaction avec
l’utilisateur (comme ls -l | less).
Exemple 2
Pour ces exemples, ssh-agent est actif et connaît la passphrase :
pc$ ssh [email protected] 'ls -l public/unix/a*.txt'
-rw-r--r-- 1 cpb prof 4840 Mar 16 16:44 public/unix/a_decouper.txt
-rw-r--r-- 1 cpb prof 446 Sep 6 2005 public/unix/acrostiche.txt
-rw-r--r-- 1 cpb prof 422 Sep 5 2002 public/unix/amphi.txt
-rw-r--r-- 1 cpb prof 1168 Sep 5 2002 public/unix/amphigouri.txt
C. Pain-Barre -
26/9/2016
IUT Aix-Marseille - INFO Aix
15/33
Enoncé du TP 3
ê
UE31 - M3102 : Services Réseaux
affiche les informations détaillées des fichiers commençant par a et se terminant par .txt sur le
répertoire public/unix d’allegro
pc$ ssh [email protected] 'ls -l public/unix/a*.txt' > fichiers.txt
ê
même chose que précédemment mais place le résultat dans le fichier fichiers.txt
pc$ ssh -t [email protected] 'ls -l public/unix | less'
...
ê
affiche en paginant les informations détaillées du répertoire public/unix d’allegro. Cela nécessite
l’emploi de l’option -t
pc$ cat fic | ssh [email protected] 'cat > fic.sve && echo "ok"'
ok
ê
une façon de copier le fichier fic sur allegro. . .
Exercice 10 (exécution de commandes distantes par SSH)
Depuis bob@m1 :
1. exécuter une commande à distance par SSH pour faire afficher les informations détaillées sur le fichier
authorized_keys de milou sur m2
2. ajouter une ou plusieurs commande(s) à distance (sur une seule connexion SSH) pour afficher aussi le
contenu du fichier
[Corrigé]
3.2
Copie de fichiers/répertoires par scp
La copie de fichiers à distance via le réseau a été historiquement offerte sous Unix par la commande rcp
(remote copy). rcp est obsolète car n’est pas sécurisée et est maintenant supplantée par scp (secure copy).
La commande scp est analogue à la commande cp et suit les mêmes principes concernant le traitement des
sources et de la destination, sauf que ces fichiers/répertoires sont situés sur des ordinateurs (éventuellement)
différents. Par cela, scp établit une connexion SSH afin de copier des fichiers ou répertoires d’un ordinateur à
l’autre. scp utilisant ssh, les options -i et -C sont aussi reconnues par scp qui les lui communique. Certaines
options sont néanmoins spécifiques à scp.
Synopsis
scp [-rp] {-o options-ssh} [-i fichier-clé] [-C] [[utilisateur @]serveur:]source
{[[utilisateur @]serveur:]source} [[utilisateur @]serveur:]destination
M
Les : qui suivent serveur sont obligatoires !
Les options -o, -i et -C sont celles vues précédemment.
IUT Aix-Marseille - INFO Aix
26/9/2016
- C. Pain-Barre
UE31 - M3102 : Services Réseaux
Enoncé du TP 3
16/33
L’option -r demande une copie récursive et doit être utilisée si une source est un répertoire.
L’option -p demande que les fichiers obtenus par la copie aient les mêmes dates de modification et d’accès,
ainsi que les mêmes permissions que les fichiers d’origine.
Comme le laisse entendre le synopsis, scp peut même copier des fichiers entre deux ordinateurs différents de
l’ordinateur depuis lequel la commande est exécutée ! Malheureusement, cette possibilité n’est pas aussi simple
que ça à mettre en œuvre car il faut que l’authentification entre les hôtes distants soit automatique, ce qui nécessite :
• que la clé publique soit déjà déposée sur l’hôte destination de la copie
• que la clé privée soit utilisable par l’hôte source de la copie. Cela est rendu possible en utilisant l’option
ForwardAgent yes de ssh mais cette option ne peut pas être passée par l’option -o de scp. Il faut utiliser
un profil spécifique qui l’active (voir section 13, page 31)
-
Il est possible d’utiliser les motifs de noms de fichiers pour la copie. Cependant, ces motifs sont interprétés par le bash courant. Ce n’est pas un problème si les sources sont locales mais si elles sont
distantes, il faut protéger ces motifs pour qu’ils soient interprétés par l’hôte distant (voir exemples).
Exemple 3
Pour ces exemples, ssh-agent est actif et connaît la passphrase :
pc$ scp [email protected]:public/unix/cigale.txt .
cigale.txt
100% 677
0.7KB/s
ê
copie dans le répertoire de travail le fichier public/unix/cigale.txt d’allegro
pc$ ls *.txt
bidule.txt cigale.txt truc.txt
pc$ scp -C *.txt cpb@allegro:tmp
bidule.txt
cigale.txt
truc.txt
ê
100%
100%
100%
6
677
6
0.0KB/s
0.7KB/s
0.0KB/s
00:00
00:00
00:00
copie les fichiers du répertoire de travail se terminant par .txt dans le répertoire tmp d’allegro. La
compression des transferts est activée.
pc$ mkdir textes
pc$ scp -Cp 'cpb@allegro:public/unix/a*.txt' textes
a_decouper.txt
100% 4840
acrostiche.txt
100% 446
amphi.txt
100% 422
amphigouri.txt
100% 1168
ê
00:00
4.7KB/s
0.4KB/s
0.4KB/s
1.1KB/s
00:00
00:00
00:00
00:00
copie (avec compression) les fichiers du répertoire public/unix de allegro commençant par a et se
terminant par .txt dans le répertoire textes. Les fichiers obtenus ont les mêmes droits et les mêmes
dates que les fichiers d’origine. Le motif a*.txt est protégé car il doit être interprété sur allegro et
non localement.
C. Pain-Barre -
26/9/2016
IUT Aix-Marseille - INFO Aix
17/33
Enoncé du TP 3
UE31 - M3102 : Services Réseaux
Exercice 11 (copie sécurisée par scp)
Depuis le terminal bob@m1 utiliser scp (avec milou@m2) pour :
1. copier dans le répertoire de travail tous les fichiers d’extension .txt contenus dans le répertoire personnel
de milou sur m2. Il ne devrait y avoir que mon_fichier.txt
2. copier récursivement le répertoire docs de bob sur m1 dans le répertoire personnel de milou sur m2 en le
nommant bobdocs
[Corrigé]
-
4
SSH offre aussi un service similaire à FTP via son sous-système SFTP. Son utilisation via la commande
sftp est reportée en compléments du TP en section 12.
SSH et la redirection de ports (tunneling)
Ainsi que nous l’avons vu par l’intermédiaire de scp (et de sftp), SSH est bien plus qu’un TELNET sécurisé.
Il propose de multiples autres utilisations dont une qui est particulièrement intéressante : la création de tunnels
combinée à la redirection de port (Port forwarding).
4.1
Principe du tunneling
Supposons que depuis notre ordinateur mowgli l’on ait accès à la machine bagheera qui héberge un serveur
SSH, ainsi qu’un serveur POP3 (protocole simple permettant de gérer une boîte aux lettres électronique). On
démarre alors une session SSH distante depuis mowgli vers bagheera comme illustré par la figure 3, où le client
SSH utilise le port TCP 12345 sur mowgli.
#12345
connexion SSH
#22
mowgli
bagheera
F IGURE 3 – Connexion SSH standard
La connexion SSH est sécurisée : à part une attaque de type man-in-the-middle à l’établissement de la
connexion, le trafic sur cette connexion n’est pas déchiffrable par une tierce personne.
Laissons de côté un instant cette connexion. Si régulièrement on utilise son client de messagerie préféré pour
rapatrier son courrier contenu sur bagheera depuis mowgli, alors on établit à chaque fois une connexion avec le
serveur POP3 de bagheera, comme illustré par la figure 4, où le client de messagerie POP3 utilise le port TCP
54321 sur mowgli, et la connexion se fait sur le port 110 (serveur POP3).
#54321
connexion POP3
#110
#12345
connexion SSH
#22
mowgli
bagheera
F IGURE 4 – Connexions SSH et POP3
IUT Aix-Marseille - INFO Aix
26/9/2016
- C. Pain-Barre
UE31 - M3102 : Services Réseaux
Enoncé du TP 3
18/33
Ici, la connexion POP3 n’est pas sécurisée : toute la discussion circule en clair. Cela comprend le nom d’utilisateur et le mot de passe qui circulent en ASCII et peuvent être "observés" sur le réseau.
Cependant on peut utiliser la connexion SSH établie afin de faire "passer" une ou plusieurs autres connexions.
Cela est possible en créant un tunnel à travers la connexion SSH, comme illustré par la figure 5.
#55555
#110
tunnel pour connexion POP3
#12345
mowgli
connexion SSH
#22
bagheera
F IGURE 5 – Connexion POP3 à travers un tunnel SSH
Sur la figure, le tunnel SSH relie le port TCP 55555 de mowgli au port TCP 110 de bagheera. Tout se passe
comme si un serveur POP3 était actif sur mowgli, en écoute sur le port 55555.
i
En général, ce "serveur" n’accepte que des connexions locales (pas d’une machine autre que mowgli) et
utilise alors l’adresse 127.0.0.1. On peut toutefois configurer le tunnel pour que le serveur accepte
des connexions de machines distantes (il utiliserait alors son adresse IP). Pour le moment, on considère
que le serveur n’accepte que des connexions locales.
Ci-dessous on voit un extrait du résultat de la commande netstat sur la machine mowgli
(139.124.187.34) qui a établi une connexion SSH avec bagheera (139.124.187.4) et un tunnel à partir
du port 55555. Le tunnel n’est pas (encore) utilisé car aucune connexion n’est établie avec ce serveur. On remarque que rien ici ne permet de savoir qu’il y a un lien entre le serveur 127.0.0.1:55555 et le client SSH
139.124.187.34:12345 :
mowgli$ netstat -tan
Connexions Internet actives (serveurs et établies)
Proto Recv-Q Send-Q Adresse locale
Adresse distante
tcp
0
0 127.0.0.1:55555
0.0.0.0:*
tcp
0
0 0.0.0.0:80
0.0.0.0:*
tcp
0
0 139.124.187.34:12345
139.124.187.4:22
Etat
LISTEN
LISTEN
ESTABLISHED
Si un client local à mowgli se connecte au port 55555 de mowgli, alors la connexion est redirigée à travers
le tunnel SSH vers le port 110 de bagheera. Tout le trafic sur la connexion SSH étant crypté, la connexion ainsi
redirigée est elle aussi cryptée.
Voici ci-dessous le résultat de la commande netstat lorsque la connexion entre un client de messagerie
(139.124.187.34:55326) est établie avec le "serveur" 127.0.0.1:55555 sur mowgli :
mowgli$ netstat -tan
Connexions Internet actives (serveurs et établies)
Proto Recv-Q Send-Q Adresse locale
Adresse distante
tcp
0
0 127.0.0.1:55555
0.0.0.0:*
tcp
0
0 0.0.0.0:80
0.0.0.0:*
tcp
0
0 139.124.187.34:12345
139.124.187.4:22
tcp
0
0 127.0.0.1:55555
127.0.0.1:55326
tcp
0
0 127.0.0.1:55326
127.0.0.1:55555
Etat
LISTEN
LISTEN
ESTABLISHED
ESTABLISHED
ESTABLISHED
Sur bagheera, le serveur SSH qui se trouve à l’autre bout du tunnel doit alors établir une connexion avec le
serveur POP3. Voici l’affichage avec netstat des connexions TCP actives sur bagheera :
C. Pain-Barre -
26/9/2016
IUT Aix-Marseille - INFO Aix
19/33
Enoncé du TP 3
bagheera$ netstat -tn
Connexions Internet actives (sans serveurs)
Proto Recv-Q Send-Q Local Address
tcp
0
0 139.124.187.4:110
tcp
0
0 139.124.187.4:46204
tcp
0
0 139.124.187.4:22
UE31 - M3102 : Services Réseaux
Foreign Address
139.124.187.4:46204
139.124.187.4:110
139.124.187.34:12345
State
ESTABLISHED
ESTABLISHED
ESTABLISHED
On voit bien que bagheera (139.124.187.4) a établi une connexion vers son port 110 à partir de son port
46204 (utilisé pour l’occasion par le serveur SSH), ceci pour contacter le serveur POP3. Les échanges de cette
connexion sont redirigés à travers la connexion SSH puis sur mowgli (139.124.187.34) entre le port 55555
(détenu par le client SSH) et le port 55326 (du client de messagerie).
-
4.2
La précédente opération s’appelle la redirection de port local (local port forwarding). Il existe aussi
la redirection de port distant (remote port forwading) qui a un objectif similaire.
Mise en place de la redirection de port local avec ssh
Pour mettre en place la redirection de port local il faut utiliser l’option -L de ssh sur la ligne de commandes.
La syntaxe de cette option est la suivante :
-L port local:machine distante:port distant
Ainsi, dans l’exemple précédent, la mise en place de la connexion SSH et de la redirection de port se fait sur
mowgli par la ligne de commandes suivante :
mowgli$ ssh -L 55555:bagheera:110 bagheera
Redirection de port local et fichier de configuration
La présentation des options de SSH et des fichiers de configuration est déportée en compléments dans la
section 13. À la liste des options figurant dans les sections des fichiers $HOME/.ssh/config et /etc/ssh/
ssh_config, on peut ajouter l’option LocalForward demandant de réaliser la redirection de port local :
LocalForward port local:machine distante:port distant
Quelques remarques importantes :
• machine distante est interprété par le serveur SSH à l’autre bout de la connexion. Dans l’exemple, l’autre
bout de la connexion est bagheera qui devrait se connaître lui-même. . .On aurait tout aussi bien pu utiliser
localhost à la place de bagheera. On peut aussi utiliser un nom long de type bagheera.jungle.org ou encore
une adresse IP
• La destination n’est pas forcément la même machine que celle sur laquelle est ouverte la session SSH. En
effet, on peut créer un tunnel pour contacter un serveur sur une machine que l’on ne pourrait pas atteindre
directement. C’est une possibilité particulièrement intéressante de SSH.
Supposons que le serveur POP3 n’est pas hébergé par bagheera mais par baloo et qu’un firewall empêche
mowgli d’accéder à baloo (ou simplement à son port TCP 110). La solution consiste à établir une session
SSH entre mowgli et bagheera et d’utiliser cette session pour réaliser un port forwarding depuis (par
exemple) le port 55555 de mowgli vers le port 110 de baloo (atteint via bagheera) comme l’illustre la
figure 6.
IUT Aix-Marseille - INFO Aix
26/9/2016
- C. Pain-Barre
UE31 - M3102 : Services Réseaux
Enoncé du TP 3
#54321
20/33
#5678
#110
tunnel pour connexion POP3
connexion normale non cryptée
#12345
connexion SSH
mowgli
#22
bagheera
baloo
F IGURE 6 – Connexion POP3 par rebond via le tunnel SSH
Pour cela, il suffit d’indiquer en destination baloo:110 (ou le nom complet ou l’adresse IP à la place
de baloo).
M
la connexion entre bagheera et baloo n’est pas cryptée. Il est alors possible à quelqu’un
situé entre bagheera et baloo d’espionner cette connexion.
• On peut mettre en place plusieurs tunnels sur une même connexion SSH.
• On peut mettre bout à bout les tunnels.
• Il est possible de mettre en place un tunnel sans que la session SSH n’ouvre un terminal (exécute un
login-shell).
4.3
Mise en place de la redirection de port distant avec ssh
Cette redirection est assez rarement utilisée. Elle produit l’effet inverse, à savoir rediriger les connexions
provenant d’un port du serveur sur le port d’un ordinateur (peut être celui du client). Elle est utile lorsque l’on
veut utiliser un client sur le serveur SSH mais qu’un firewall empêche la connexion de ce client, alors qu’elle est
possible à partir du client SSH.
Pour mettre en place la redirection de port distant il faut utiliser l’option -R de ssh sur la ligne de commandes.
Sa syntaxe est la suivante :
-R port serveur :machine:port
Si un client sur le serveur SSH se connecte au port port serveur alors la connexion est redirigée sur la
connexion SSH et le client SSH établit une connexion (non sécurisée) sur le port port de machine.
-
machine est cette fois interprété par le client SSH et non par le serveur.
Redirection de port distant et fichier de configuration
À la liste des options figurant dans les sections des fichiers $HOME/.ssh/config et /etc/ssh/
ssh_config, on peut ajouter l’option RemoteForward demandant de réaliser la redirection de port distant :
RemoteForward port serveur :machine:port
5
SSH et la redirection X11
L’une des importantes facilités offertes par SSH pour le monde Unix, est la possibilité d’exécuter à distance
des applications graphiques qui s’affichent sur l’hôte du client. Ce service s’appelle la redirection X11 (X11 forwarding) puisque la gestion graphique sous Unix utilise des serveurs et clients X (version 11).
C. Pain-Barre -
26/9/2016
IUT Aix-Marseille - INFO Aix
21/33
Enoncé du TP 3
UE31 - M3102 : Services Réseaux
L’option ssh qui demande une redirection X11 (X11 forwarding) est l’option 2 -X. On empêche cette redirection (si elle est activée par défaut dans un fichier de configuration) par l’option -x.
En utilisant cette option, on peut exécuter des applications graphiques à distance dont toutes les informations
sont véhiculées via des tunnels de la connexion SSH, et sont donc chiffrées.
i
L’affichage d’applications graphiques à distance nécessite que le client dispose d’un serveur X, ce qui
n’est pas le cas par défaut sur Windows.
Exercice 12 (X11 forwarding de m3 vers le PC)
1. Se loger en root sur m3 et exécuter unghostify eth42 puis ifconfig pour déterminer l’adresse de
cette interface cachée de m3
2. Sur un terminal du PC, vous connecter par SSH en root sur m3 en tapant :
pc:~$ ssh root@ip-cachée-de-m3
3. Puis, sur cette session SSH sur m3, taper
m3:~$ wireshark &
ce qui devrait afficher une erreur (la fenêtre ne peut s’afficher car la redirection X11 n’est pas activée)
4. Quitter cette session SSH sur m3, et la réouvrir en ajoutant l’option -X :
pc:~$ ssh -X root@ip-cachée-de-m3
Relancer alors wireshark qui devrait s’afficher.
[Corrigé]
6
Et SSH sur Windows ?
Des clients (et des serveurs) SSH existent sous Windows. On peut faire la même chose avec ces clients que ce
que l’on peut faire avec ssh.
Le plus célèbre d’entre eux est Putty. La suite Putty est composée de divers exécutables :
• plink : correspond à ssh
• pscp : correspond à scp
• psftp : correspond à sftp
• puttygen : correspond à ssh-keygen
• pageant : correspond à ssh-agent
• putty : un client ssh avec une interface graphique permettant de configurer des tunnels et des redirections
X11, et sauver ces configurations dans des profils.
2. Il existe aussi l’option -Y qui sécurise encore plus la méthode mais l’explication sort du cadre de ce TP, d’autant que selon la
distribution -Y est utilisée par défaut. Le lecteur intéressé pourra se renseigner sur le sujet. Un premier pas serait d’aller faire un tour sur
le site http://www.hsc.fr/ressources/breves/ssh-x11.html et notamment la démo flash http://www.hsc.fr/
~davy/breves/ssh.html
IUT Aix-Marseille - INFO Aix
26/9/2016
- C. Pain-Barre
UE31 - M3102 : Services Réseaux
7
Enoncé du TP 3
22/33
Jouons un peu avec SSH (et HTTP)
Exercice 13 (Service SSH sur m2 et tunneling SSH)
Cet exercice a principalement pour but d’illustrer le principe des tunnels SSH et de la redirection de ports.
1. Sur la VM XP, utiliser Putty pour accéder à m2 en SSH en tant que milou. Une fois logé, terminer aussitôt
la session SSH.
2. On va empêcher l’accès SSH à m2 depuis la VM XP. Pour cela, sur m2 éditer le fichier
/etc/hosts.deny et y ajouter la ligne :
sshd : 10.0.2.100
3. Sur la VM XP, utiliser à nouveau Putty pour tenter d’accéder à m2 en SSH. Cette fois, ce ne devrait pas
être possible.
4. Vérifier que l’accès SSH sur m2 en milou depuis m1 reste possible, puis terminer aussitôt la session SSH.
5. Sur la VM XP, configurer Putty de la manière suivante :
• dans la partie Host Name, mettre l’adresse de m1 car on va y ouvrir une session SSH
• dans le menu SSH −→ Tunnels, saisir :
dans Source port : 20000
dans Destination : 10.0.2.10:22
puis cliquer sur Add. On vient de paramétrer une redirection de port local vers le serveur SSH de
m2. . .
• Cliquer sur Open, ce qui va établir une connexion SSH sur m1, et s’y loger en tant que bob (mot de
passe eponge)
6. Tout en gardant cette connexion SSH, ouvrir à nouveau Putty sur la VM XP et le paramétrer avec :
• Host name : localhost
• Port : 20000
puis cliquer sur Open. Cette fois, on ouvre une session SSH sur m2 ! Se connecter en tant que milou (mais
la clé n’est pas disponible depuis la machine XP). Pouvez-vous expliquer ce qu’il s’est passé, alors qu’on
n’avait pas accès au serveur SSH de m2 depuis la VM XP ?
7. La configuration du serveur SSH de m2 se fait en éditant le fichier /etc/ssh/sshd_config. Parcourir
son contenu. Utiliser le man de sshd_config afin de déterminer quelle directive empêche l’authentification par mot de passe (indice : il y Password dans son nom. . .).
[Corrigé]
Exercice 14 (Service HTTP sur m2 et tunneling SSH)
1. Si ce n’est pas déjà fait, se loger en root sur m2 (mot de passe root) et démarrer le serveur Web apache2
en tapant :
# /etc/init.d/apache2 start
Le fichier de configuration de ce serveur est /etc/apache2/apache2.conf. Il contient les directives
suivantes :
C. Pain-Barre -
26/9/2016
IUT Aix-Marseille - INFO Aix
23/33
Enoncé du TP 3
UE31 - M3102 : Services Réseaux
<Location />
Order deny,allow
Deny from 10.0.2.100
</Location>
qui empêchent l’accès au serveur Web de m2 depuis la VM XP
2. Sur m2, utiliser netstat pour s’assurer que le serveur Web est bien démarré
3. Sur m1 en tant que bob, taper :
bob@m1:~$ lynx http://10.0.2.10
pour s’assurer que le serveur Web de m2 est opérationnel (la fenêtre doit afficher «It works!»). Quitter lynx
avec q puis y pour confirmer.
i
lynx est un navigateur Web en mode texte !
4. Sur le wireshark de m3 (lancé à l’exercice 12), commencer une capture des trames sur l’interface eth0
5. Sur la VM XP, ouvrir un navigateur et tenter d’accéder au site http://10.0.2.10. Ce ne devrait pas être
possible.
6. Sur la VM XP, utiliser les possibilités de redirection de port offertes par SSH (et Putty) afin de contourner
ces restrictions et accéder au serveur Web de m2
7. Arrêter la capture de m3. Filtrer les trames pour ne retenir que celles de la connexion au serveur Web de
m2. Cliquer sur la dernière et sélectionner Follow TCP Stream. On peut remarquer en voyant ainsi s’afficher
le dialogue avec le serveur Web de m2 que la connexion entre m1 et m2 n’est pas cryptée (mais elle est
redirigée sur le tunnel SSH entre la VM XP et m1).
[Corrigé]
Compléments
8
Étude des faiblesses de TELNET
Exercice 15 (Activation du service TELNET sur m2)
Dans cet exercice, on va activer le service TELNET sur m2 et permettre à root de s’y connecter.
1. Sur m2, se loger en tant que root (mot de passe root)
2. Pour activer le service TELNET sur m2, on va utiliser le super-serveur inetd :
(a) éditer avec vi son fichier /etc/inetd.conf, et modifier la ligne :
#<off># telnet
stream
tcp
nowait
telnetd /usr/sbin/tcpd
/usr/sbin/in.telnetd
pour la décommenter et modifier 2 paramètres :
telnet
i
stream
tcp
nowait
root /usr/sbin/tcpd
/usr/sbin/telnetd
Ce faisant, on corrige l’utilisateur qui démarre le service TELNET, ainsi que le nom de
l’exécutable du serveur
IUT Aix-Marseille - INFO Aix
26/9/2016
- C. Pain-Barre
UE31 - M3102 : Services Réseaux
Enoncé du TP 3
24/33
(b) recharger la configuration du démon inetd en tapant :
m2# /etc/init.d/openbsd-inetd reload
Le service devrait être maintenant opérationnel.
(c) utiliser netstat pour lister les services en écoute sur TCP, et vérifier que le service TELNET est bien
activé, en écoute sur le port 23
(d) Ajouter l’option -p à netstat pour connaître les exécutables correspondants à ces services, et remarquer que c’est inetd qui écoute sur le port 23
-
En effet, nous avons activé TELNET via inetd qui lancera le serveur (l’exécutable
/usr/sbin/telnetd indiqué dans le fichier /etc/inetd.conf) lorsqu’un client se
connectera au service. Ainsi, inetd ne lance un service que lorqu’il est sollicité, ce qui
économise les ressources.
3. Depuis m1, tenter de se loger en root sur m2 avec telnet. On devrait remarquer que le service est bien actif
(demande un login), mais que l’accès en root est pour le moment impossible
4. Sur m2, éditer le fichier /etc/securetty pour ajouter les lignes :
# Terminaux virtuels
pts/0
pts/1
pts/2
qui autorisent root à se loger par TELNET sur les 3 terminaux virtuels correspondants
5. Depuis m1, se loger en root sur m2 avec telnet pour vérifier que c’est possible (le prompt de m2 doit bien
s’afficher).
6. Sur cette session TELNET sur m2 :
(a) utiliser netstat pour afficher la connexion TCP utilisée pour cette session
(b) utiliser à nouveau l’option -p de netstat pour vérifier que c’est bien telnetd qui utilise cette connexion
sur m2 (mais c’est toujours inetd qui écoute sur le port 23)
(c) utiliser passwd pour changer le mot de passe de root en damned, puis terminer la session TELNET
en tapant exit.
[Corrigé]
Exercice 16 (Analyse du trafic TELNET)
Dans cet exercice, on pourra (à nouveau) constater que TELNET est un protocole manquant de sécurité. . .
1. Sur m2, exécuter la commande suivante :
# tcpdump -A -i eth0 tcp dst port 23
qui demande d’afficher en ASCII (-A) le contenu des trames parvenant à l’interface eth0 (-i) et qui
contiennent un segment TCP destiné à un serveur TELNET (23 comme port destination du segment TCP).
Autrement dit, cette commande va permettre de visualiser les envois du client vers le serveur TELNET.
-
C. Pain-Barre -
Sur le principe, la visualisation de ce traffic peut se faire avec cette commande depuis n’importe
quelle machine qui voit passer ces trames, soit parce qu’elle est sur le trajet (routeur), soit parce
que le réseau fonctionne par inondation comme l’Ethernet partagé (ce qui serait le cas si on avait
un hub à la place du switch). Vous pouvez tester en remplaçant le switch par un hub, ajouter
une VM Linux sur ce Hub, et capturer les trames échangées par m1 et m2 depuis cette nouvelle
VM. . .
26/9/2016
IUT Aix-Marseille - INFO Aix
25/33
Enoncé du TP 3
UE31 - M3102 : Services Réseaux
2. Sur m3, exécuter unghostify eth42 puis ifconfig pour déterminer l’adresse de cette interface cachée
de m3
3. Sur un terminal du PC, vous connecter par SSH en root sur m3 en tapant :
pc:~$ ssh -X root@ip-cachée-de-m3
4. Puis, sur cette session SSH sur m3, taper
m3:~$ wireshark &
puis démarrer une capture sur l’interface eth0
5. Depuis m1, se loger en root sur m2 avec telnet
6. Arrêter la capture tcpdump de m2. Observer les informations affichées par cette capture, et remarquer le
dernier caractère de certains segments transmis lors de l’authentification. On devrait pouvoir reconstituer le
nom de l’utilisateur et son mot de passe, car ils ont été transmis en clair !. . .
Si vous ne le voyez pas, pas de panique ! Arrêter la capture du wireshark de m3, filtrer les trames pour ne
garder que celles impliquant le port TCP 23 (avec tcp.port == 23), puis sur l’une d’elles, sélectionner
Follow TCP Stream. . .
i
On comprend bien pourquoi l’accès root via TELNET est désactivé par défaut. On ne peut
espérer plus de sécurité en se logeant par TELNET avec un autre utilisateur pour passer ensuite
root car tout est transmis en clair. . .
7. Terminer la session TELNET sur m2
[Corrigé]
9
Introduction au chiffrement
Il existe deux approches au chiffrement : le chiffrement symétrique et le chiffrement asymétrique. Avant de
présenter le chiffrement asymétrique, on va d’abord introduire et critiquer le chiffrement symétrique.
9.0.A
Critique du chiffrement symétrique
Pour le chiffrement symétrique, un fichier (ou flux de données) est crypté/décrypté à l’aide d’une unique clé.
Ainsi, lorsqu’on communique un fichier crypté à quelqu’un, cette personne doit posséder la clé qui a permis le
cryptage pour pouvoir décrypter le fichier. Le principe est illustré par la figure 7.
Le problème est que quiconque possède cette clé sera en mesure de décrypter les données confidentielles.
Ainsi, si la personne à qui on a communiqué notre clé n’est pas très prudente, on court le risque de perdre la
confidentialité de nos transmissions. D’autre part, on peut très bien envoyer un fichier crypté à quelqu’un mais
souhaiter que cette personne ne puisse pas décrypter les autres fichiers que l’on crypte. Dans ce cas, il faut utiliser
une clé spécialement pour l’échange avec cette personne. C’est déjà pénible mais ce n’est pas tout : comment
transmettre une clé, en étant sûr que personne ne la récupère et puisse ainsi lire les données transmises ? Les
moyens de communication étant régulièrement "écoutés" par différentes "organisations" (si ce n’était pas le cas,
ce ne serait pas la peine de mettre en place un cryptage des données. . .), que reste-t-il ? une communication en
mains propres ?
Manifestement, cette méthode de chiffrement pose de nombreux problèmes et on comprend pourquoi elle est
de moins en moins utilisée seule.
IUT Aix-Marseille - INFO Aix
26/9/2016
- C. Pain-Barre
UE31 - M3102 : Services Réseaux
Enoncé du TP 3
26/33
clé partagée entre
l’émetteur et le récepteur
abc
efg
ijk
cryptage
décryptage
010
101
010
transmission
010
101
010
récepteur
émetteur
abc
efg
ijk
F IGURE 7 – Chiffrement symétrique : même clé pour le cryptage/décryptage
9.1
Le chiffrement asymétrique
Le chiffrement asymétrique est une méthode de chiffrement qui apporte une solution intéressante aux problèmes de gestion de clé que connaît le chiffrement symétrique.
Il nécessite l’emploi d’une paire de clés :
• une clé privée qui, comme son nom l’indique, doit demeurer privée et jamais communiquée. Néanmoins,
elle doit être stockée sur l’ordinateur qu’utilise son créateur (possesseur). Celui-ci doit donc impérativement la protéger au mieux, notamment par l’intermédiaire d’une "passphrase" et en la rangeant dans un
répertoire et un fichier inaccessibles aux autres.
• une clé publique qui, elle, peut être communiquée au reste du monde, sans aucun risque de dévoiler la
clé privée. En effet, si les deux clés sont étroitement liées, il n’est pas possible de fabriquer la clé privée à
partir de la clé publique. En revanche, si la clé publique est perdue, il sera possible de la générer à partir
de la clé privée.
Le chiffrement asymétrique permet le cryptage mais aussi la signature numérique de documents, qui ont
des objectifs différents :
• cryptage : il s’agit de protéger un document en le cryptant. Seuls les détenteurs d’une clé appropriée
pourront le décrypter et le lire ;
• signature : il s’agit d’authentifier un document ainsi que son rédacteur.
i
9.1.A
Le terme chiffrement est souvent employé dans les documentations à la place de cryptage. Par la suite,
nous l’employons dans son sens large, recouvrant la signature.
Paires de clés et trousseau
Différents utilitaires existent pour créer un paire de clés publique et privée, notamment l’outil libre gpg —
abréviation de GnuPG (The GNU Privacy Guard)— qui est disponible à la fois pour Linux et Windows.
En utilisant gpg, on crée un trousseau de clé comportant une clé privée et la clé publique associée. En outre,
gpg gère aussi les clés publiques que nous ont communiquées les personnes avec lesquelles on désire crypter/signer les échanges.
C. Pain-Barre -
26/9/2016
IUT Aix-Marseille - INFO Aix
27/33
Enoncé du TP 3
UE31 - M3102 : Services Réseaux
gpg pourra alors être utilisé pour crypter/décrypter et/ou signer/vérifier des documents. Nous n’étudions ici
que les principes du chiffrement et non la génération de clés ni les opérations de cryptage/décryptage ou signature/vérification avec gpg.
On supposera par la suite que les personnes impliquées dans les échanges ont à leur disposition un tel outil.
9.1.B
Cryptage/Décryptage par paire de clés
Pour envoyer un document crypté à quelqu’un, l’émetteur doit posséder la clé publique du récepteur. Des
serveurs de clés (publiques) existent sur Internet afin de faciliter la distribution des clés publiques.
niquée
abc
efg
ijk
abc
efg
ijk
émetteur
clé privée que seul le
récepteur possède
cryptage (clé publique)
décryptage (clé privée)
010
101
010
transmission
010
101
010
récepteur
la
u
comm
e a été
u
q
li
b
clé pu
clé publique communiquée
aux émetteurs potentiels
de documents cryptés
etteur
à l’ém
F IGURE 8 – Cryptage asymétrique avec la clé publique du destinataire qui décryptera avec sa clé privée.
La méthode de cryptage asymétrique est illustrée par le schéma de la figure 8. L’émetteur crypte le document
à l’aide de la clé publique du récepteur. Seule la personne possédant la clé privée peut décrypter le document
crypté. Ainsi, lorsque le récepteur reçoit le document crypté, il le décrypte à l’aide de sa clé privée.
9.1.C
Signature/vérification par paire de clés
La signature numérique de document a pour objectif de prouver au récepteur que le document a bien été envoyé par l’émetteur annoncé, et qu’il n’a pas été modifié pendant son transport.
D’un autre côté, la signature numérique assure la non-répudiation : l’émetteur ne peut nier avoir envoyé le
document.
Cette signature est généralement générée par l’algorithme DSA (Digital Signature Algorithm). Le principe de
son utilisation est le suivant, illustré par la figure 9 :
1. L’émetteur calcule une empreinte (fingerprint) du document par une fonction de hashage. La fonction de
hashage doit être telle qu’une modification minime du document produit une empreinte différente et qu’il
est impossible de produire un document à partir d’une empreinte. L’algorithme de hashage généralement
utilisé est SHA1. Il existe aussi MD5 réputé plus faible que SHA1
2. L’émetteur crypte l’empreinte avec sa clé privée par une méthode qui rend possible son décryptage par la
clé publique associée
3. Le récepteur décrypte l’empreinte avec la clé publique de l’émetteur (authentification de l’émetteur)
4. Le récepteur calcule l’empreinte du message et la compare à celle obtenue à l’étape précédente (vérification
de la non modification du message)
IUT Aix-Marseille - INFO Aix
26/9/2016
- C. Pain-Barre
Enoncé du TP 3
clé publique communiquée
aux récepteurs potentiels
de documents signés
la clé
publiq
28/33
ue a é
té com
muniq
uée au
clé privée que seul
l’émetteur possède
récepte
ur
émetteur
abc
efg
ijk
abc
efg
ijk
récepteur
UE31 - M3102 : Services Réseaux
signature (clé privée)
vérification (clé publique)
abc
efg
ijk
abc
efg
ijk
transmission
S
S
F IGURE 9 – Signature d’un document avec la clé privée de l’émetteur. Le récepteur vérifie avec la clé
publique correspondante.
10
Attaque man-in-the-middle
Si l’on approuve la clé publique du serveur sans la vérifier, on s’expose à se connecter à une machine qui
aurait usurpé l’IP du serveur (mise en place par un attaquant pour voler les mots de passe, par exemple) ou à la
machine d’un attaquant située sur le trajet menant au serveur, qui servirait à intercepter ou modifier nos messages.
Cette dernière attaque, de type man-in-the-middle, est illustrée par la figure 10.
client
attaquant
connexion
serveur
connexion
SSH
mowgli
SSH
sherekhan
bagheera
F IGURE 10 – Attaque de type man-in-the-middle
Le principe de cette attaque est le suivant :
• Le client (sur mowgli) veut établir une connexion SSH sur bagheera
• Sur le chemin emprunté par les datagrammes IP se trouve la machine sherekhan de l’attaquant qui intercepte la demande de connexion et répond à la place de bagheera
• L’attaquant établit aussi une connexion SSH entre sherekhan et bagheera
• Lorsque le client s’identifie (pensant avoir à faire à bagheera), il communique son nom d’utilisateur et
son mot de passe qui sont récupérés par l’attaquant
• L’attaquant utilise ces informations pour s’identifier sur bagheera
• Deux connexions SSH sont alors établies, l’une mowgli↔sherekhan et l’autre sherekhan↔bagheera
• L’attaquant fait transiter (automatiquement) les commandes du client vers le serveur, ainsi que les réponses du serveur vers le client, éventuellement en modifiant certaines choses. . .
i
Cette attaque ne peut en principe être possible que lors de la première connexion du client. Si elle
réussit, elle peut être reproductible.
C. Pain-Barre -
26/9/2016
IUT Aix-Marseille - INFO Aix
29/33
11
Enoncé du TP 3
UE31 - M3102 : Services Réseaux
Le fournisseur de passphrase ssh-agent
Si l’on est consciencieux, on a utilisé une longue passphrase qui est fastidieuse à taper. Or, si l’on se connecte
à nouveau au serveur en utilisant un autre terminal, la passphrase nous sera encore demandée pour débloquer la
clé privée.
C’est là qu’intervient l’agent ssh-agent. C’est un processus qui s’exécute en tâche de fond et à qui on communique la passphrase qui lui permet de débloquer la clé privée. Ceci fait, chaque fois que ssh a besoin de la clé
privée, c’est à ssh-agent qu’elle la demandera, sans intervention de l’utilisateur. Ainsi, on ne la tape qu’une fois
par session (entendre par là session gnome, kde ou autre).
Dans les distributions récentes, ssh-agent est lancé dès que l’utilisateur ouvre une session. Il n’a donc rien à
faire pour l’utiliser. Dans les distributions anciennes, c’est un peu plus compliqué. Il faut :
• lancer manuellement ssh-agent par une méthode particulière. En bash, il faut exécuter :
$ eval $(ssh-agent)
Cette commande exécute ssh-agent et crée les variables d’environnement SSH_AGENT_PID et
SSH_AUTH_SOCK dont ssh a besoin pour contacter l’agent
• Sur le terminal depuis lequel la commande précédente a été tapée, tout est configuré pour utiliser l’agent
• Si l’on exécute d’autres terminaux depuis ce terminal, alors ils bénéficieront aussi de ces variables et l’on
pourra utiliser l’agent
• En revanche, si on ouvre un autre terminal depuis le bureau, les variables précédentes ne seront pas
connues. Il faudra alors les créer pour utiliser l’agent. Pour cela, le plus simple est de taper ssh-agent -s
sur le terminal où l’agent a été lancé, ce qui affiche les commandes bash à exécuter dans un autre terminal
pour utiliser l’agent :
$ ssh-agent -s
SSH_AUTH_SOCK=/tmp/ssh-LhGscH2261/agent.2261; export SSH_AUTH_SOCK;
SSH_AGENT_PID=2307; export SSH_AGENT_PID;
echo Agent pid 2307;
où la dernière ligne a peu d’intérêt. . .
Une autre possibilité est d’afficher ces variables sur le terminal où l’agent a été lancé, en tapant par
exemple :
$ set | grep '^SSH'
SSH_AGENT_PID=2307
SSH_AUTH_SOCK=/tmp/ssh-LhGscH2261/agent.2261
puis, sur le nouveau terminal, il faudra taper :
$ export SSH_AGENT_PID=2307
$ export SSH_AUTH_SOCK=/tmp/ssh-LhGscH2261/agent.2261
i
On comprend pourquoi dans les distributions récentes l’agent est exécuté avant le bureau de manière à
ce que les variables soient connues par tous les processus exécutés par l’utilisateur. . ..
L’agent étant exécuté, il reste à lui communiquer la passphrase de la clé qu’on veut utiliser. Pour cela, il faut
utiliser la commande ssh-add. Bien qu’admettant un certain nombre d’options, l’utilisation qu’on en fait est des
plus basiques.
IUT Aix-Marseille - INFO Aix
26/9/2016
- C. Pain-Barre
UE31 - M3102 : Services Réseaux
Enoncé du TP 3
30/33
Synopsis
ssh-add [fichier-clé]
où fichier-clé est optionnel et est la référence du fichier contenant la clé privée qu’on souhaite utiliser. Par défaut,
le fichier utilisé est $HOME/.ssh/id_rsa (ça tombe bien, non ?). L’agent demande alors la passphrase servant
à débloquer la clé correspondante.
i
12
Comme son nom ne l’indique pas, ssh-add permet aussi de supprimer la gestion de certaines clés par
l’agent. Consulter le manuel de cette commande pour les options disponibles.
Transfert de fichiers par sftp
La commande sftp (secure file transfer program) est une alternative sécurisée à l’emploi de FTP qui ne l’est
pas. Comme scp, sftp utilise ssh pour ses transferts. Comme (la commande) ftp, sftp est par défaut interactif et
propose des commandes internes similaires.
M
sftp ne permet pas de transférer des répertoires (du moins simplement).
On peut utiliser sftp pour des objectifs différents, chacun ayant sa propre syntaxe.
Synopsis
sftp
sftp
sftp
sftp
[-C]
[-C]
[-C]
[-C]
{-o
{-o
{-o
{-o
options-ssh}
options-ssh}
options-ssh}
options-ssh}
[utilisateur @]serveur
[utilisateur @]serveur :répertoire
[utilisateur @]serveur :source [destination]
-b fic-commandes [utilisateur @]serveur
La première forme sert pour se connecter au serveur et travailler en mode interactif (à la manière de ftp).
La deuxième forme est identique à la première mais on se place directement dans répertoire sur le serveur.
La troisième forme est non interactive et permet simplement de copier le fichier source dans destination. C’est
donc une utilisation similaire à scp mais plus limitée.
La quatrième forme est non interactive et demande à sftp d’exécuter les commandes internes (sftp) contenues
dans le fichier fic-commandes. Elle est pratique pour automatiser des transferts. Elle nécessite une authentification
par paire de clés.
Les options -C et -o sont celles vues précédemment. On remarque l’absence d’option -i mais il existe une
option-ssh qui la remplace (voir plus loin).
-
La liste des commandes internes sftp est trop longue pour être décrite ici, consulter le manuel en ligne
pour les connaître. Une autre possibilité est de taper la commande interne help sur le prompt de sftp.
C. Pain-Barre -
26/9/2016
IUT Aix-Marseille - INFO Aix
31/33
Enoncé du TP 3
UE31 - M3102 : Services Réseaux
Exercice 17 (transfert de fichiers par sftp)
Sur le terminal bob@m1 :
1. afficher les pages de manuel de sftp pour avoir la liste des commandes internes
2. utiliser sftp pour établir une connexion ssh/sftp sur m2 en tant que milou
3. Récupérer le fichier /etc/passwd
4. Quitter la session sftp.
[Corrigé]
13
Profils et options de ssh
Lorsqu’elle est utilisée, directement ou indirectement par scp ou sftp, ssh prend en compte les options qui
lui sont communiquées, soit sur la ligne de commandes, soit par l’intermédiaire de fichiers de configuration. Son
traitement des options suit l’ordre suivant :
1. les options de la ligne de commande : celles indiquées par l’option -o option-ssh
2. les options du fichier de configuration utilisateur $HOME/.ssh/config
3. les options du fichier de configuration commun à tous les utilisateurs /etc/ssh/ssh_config
Une option pouvant figurer aussi bien sur la ligne de commandes que dans les fichiers de configuration, la première trouvée est celle retenue.
Les fichiers de configuration sont organisés en sections où chaque section débute par le mot clé Host suivi
d’un motif. Dans le synopsis des commandes précédentes (ssh, scp, sftp), si serveur correspond au motif, alors
les options de la section correspondante s’appliquent pour la connexion (sauf si elles sont redéfinies sur la ligne
de commandes).
-
Une section permet donc de définir des profils SSH, chacun avec ses propres options.
Le motif peut prendre plusieurs formes : adresses IP ou chaînes (de type nom DNS). Il peut contenir * qui représente n’importe quelle chaîne de caractères, ou ? qui représente n’importe quel caractère (ou chiffre dans une
adresse IP). On peut donc définir un profil pour les connexions concernant n’importe quel serveur se terminant
par .univ-aix.fr en commençant une section par Host *.univ-aix.fr (aucune résolution DNS n’est faite
à ce stade, il s’agit juste de comparer serveur et le motif).
Une utilisation très courante de la définition d’une section est la possibilité de définir différents profils pour
des connexions vers un même ordinateur. Cela se fait en combinant le mot clé Host et le mot clé Hostname
comme dans l’exemple si-dessous.
Exemple 4
Si $HOME/.ssh/config contient les lignes suivantes :
Host iut1
Hostname allegro.iut.univ-aix.fr
Options spécifiques au profil iut1
Host iut2
Hostname allegro.iut.univ-aix.fr
Options spécifiques au profil iut2
IUT Aix-Marseille - INFO Aix
26/9/2016
- C. Pain-Barre
UE31 - M3102 : Services Réseaux
Enoncé du TP 3
32/33
Alors, en utilisant iut1 en lieu et place de serveur, on utilisera les options du profil iut1 pour se connecter
à allegro, alors que si l’on utilise iut2 on se connectera toujours à allegro mais en utilisant les options du profil
iut2.
Enfin, une section d’ordre général peut être définie en utilisant Host *. Toutes les options de cette section
s’appliquent aux connexions, sauf les options ayant déjà été définies sur la ligne de commande ou définies par
une section précédente qui correspondait.
-
Cette section, si elle est utilisée, doit normalement être placée en fin des fichiers de configuration
$HOME/.ssh/config et/ou /etc/ssh/ssh_config.
Parmi les options possibles pouvant figurer dans les sections, certaines nous intéressent particulièrement :
• User suivi du nom d’utilisateur sur le serveur. Cela évite d’utiliser l’option -l de ssh ou les spécifications
de type utilisateur @
• IdentityFile suivi du chemin absolu du fichier contenant la clé privée à utiliser (même rôle que
l’option -i de ssh et de scp)
• Port suivi du numéro de port du serveur SSH sur la machine distante. Par défaut, cette option vaut 22
• Compression suivi de yes ou no selon que l’on veut ou non activer la compression (même rôle que
l’option -C)
• ForwardAgent suivi de yes ou no selon que l’on veut ou non que l’agent ssh local puisse débloquer
la clé privée pour un ssh exécuté à distance (via une connexion SSH). Cette option doit être activée pour
pouvoir réaliser une copie entre hôtes distants par scp.
Celles qui suivent ont généralement des valeurs par défaut adéquates mais on peut les spécifier au cas où :
• HashKnownHosts suivi de yes ou no selon que l’on veut ou non que le fichier known_hosts soit
hashé. Sur Debian, cette option est activée par défaut dans /etc/ssh/ssh_config
• PasswordAuthentication suivi de yes ou no selon que l’on souhaite ou non utiliser l’authentification par mot de passe. Cette option est active par défaut et vaut yes
• PreferredAuthentications permet d’indiquer un ordre de préférence pour l’authentification de
l’utilisateur. Nous n’avons vu ici que les authentifications password et publickey. On peut définir
l’ordre publickey,password (qui est déjà celui par défaut)
• Protocol permet d’indiquer un ordre de préférence sur la version de SSH à utiliser. Par défaut, vaut
2,1 (si SSH2 n’est pas disponible, bascule en SSH1) mais on peut totalement désactiver l’emploi du
SSH1 en indiquant seulement 2
• PubkeyAuthentication suivi de yes ou no selon que l’on souhaite ou non utiliser l’authentification par paire de clés. Le défaut est yes
• StrictHostKeyChecking suivi de yes, no ou ask. Si c’est yes, ssh refusera de se connecter à un
serveur dont la clé publique n’existe pas dans les fichiers $HOME/.ssh/known_hosts et /etc/ssh/ssh_know
Si c’est no, ssh ajoutera la clé publique d’un serveur inconnu dans le fichier $HOME/.ssh/known_hosts
sans demander l’autorisation à l’utilisateur et si la clé du serveur a changé, l’utilisateur en sera averti. Si
c’est ask, alors ssh demandera à l’utilisateur s’il doit ajouter la clé publique d’un serveur inconnu ou
pas, et refusera de se conecter à un serveur dont la clé a changé. Par défaut cette option vaut ask.
C. Pain-Barre -
26/9/2016
IUT Aix-Marseille - INFO Aix
33/33
Enoncé du TP 3
i
i
UE31 - M3102 : Services Réseaux
Quelle que soit la valeur de l’option précédente, la clé publique du serveur sera toujours vérifiée.
Les options sont trop nombreuses pour être décrites dans ce document, exécuter man ssh_config
pour afficher le manuel qui les décrit toutes. Nous en verrons celles qui concernent la redirection de
port et de X11 dans la suite.
L’option -o de ssh, scp et sftp
Cette option permet de spécifier une option ssh à l’aide d’un mot clé utilisé précédemment. Cependant dans
ce cas, on ne sépare pas le mot clé de sa valeur par des blancs mais par le signe =.
-
Pas toutes les options de ssh peuvent être modifiées avec l’option -o. Par exemple, ForwardAgent
n’est pas activable par l’option -o de scp et le seul moyen de l’utiliser avec cette commande est de
créer un profil qui l’active.
-
On pourra remarquer que c’est le seul moyen de spécifier un fichier clé privée pour la commande sftp.
IUT Aix-Marseille - INFO Aix
26/9/2016
- C. Pain-Barre