Rechercher sur ce site...

Mois : octobre 2016

Générer des certificats pour Ipsec avec Openssl

Dans un précédant article, j'ai pu configurer un serveur ipsec dans ipfire, soit mettre en place un serveur Ipsec/Strongswan et des clients Windows 7, Debian 7 ou Iphone, tout par le programme "ipsec pki" . Dans cet article, j'utilise uniquement le programme Openssl. Pour simplifier le processus de création des certificats d’autorités, client et serveur, je m'appuie sur mes scripts stockés sur Github.

A/ En résumé :

Avant de se lancer, je tiens à vous signaler qu'il ne faut surtout pas mettre des caractères avec des accents. En effet, la connexion VPN ne se fera pas à cause d'un différent sur les jeux de caractères (ANSI/UTF8). Les scripts suivants permettent de modifier les fichier de configuration à la volé et de générer tous les certificats.

[pcsh lang="bash" user="jbsky" repos="jbsky" path_id="rootfs/root/openssl" revision="master" tab_size="4" hl_lines="" provider="github"/]

En détail

Petit rappel: Openssl s'appuie sur le fichier /etc/ssl/openssl.cnf par défaut, cependant, il est possible de spécifier un autre fichier avec l'otion [-config $FILE]. Un certificat est composé de 2 fichiers, une clé privé et une clé publique. Dans le cas d'une configuration IpSec, le client doit avoir le drapeau  clientAuth  et serverAuth et doivent être signé par la même autorité.

B/ Le fichier de configuration d'OpenSSL.

B.1/ Génération du certificat d'autorité

Dans un premier temps, le champs [ca] dans le fichier openssl.cnf désigne l'autorité par défaut, soit [ROOT].

[pcsh lang="bash" user="jbsky" repos="jbsky" path_id="ipfire/rootfs/etc/ssl/openssl.cnf" revision="master" tab_size="4" hl_lines="" provider="github"/]
  • Policy_match sont les règles définies pour autoriser la création d'un sous certificat d'autorité.
  • req_distinguished_name normalise les champs composants le certificat. Les champs terminant par _default permettent à OpenSSL de suggérer une valeur lors de la génération du certificat. Je vous invite à renseigner la localité, le mail, la ville et le nom de l'organisation, le reste diffère.
  • Bien definir pour le certificat d'autorité la variable keyUsage avec les drapeaux critical, digitalSignature, cRLSign, keyCertSign.

Le fichier openssl.cnf renseigné à ce point, il est tout à fait possible de définir son certificat d'autorité.

[pcsh lang="bash" user="jbsky" repos="jbsky" path_id="ipfire/rootfs/usr/local/sbin/caroot" revision="master" tab_size="4" hl_lines="" provider="github"/] Ensuite, lançons le premier script.

caroot

B.2/ Génération d'un sous certificat d'autorité

Pour simplifier les choses,  je préfère utiliser un autre fichier de configuration pour ipsec.

[pcsh lang="bash" user="jbsky" repos="jbsky" path_id="ipfire/rootfs/etc/ssl/ipsec.cnf" revision="master" tab_size="4" hl_lines="" provider="github"/]

Script pour générer un sous-certificat d'autorité.

[pcsh lang="bash" user="jbsky" repos="jbsky" path_id="ipfire/rootfs/usr/local/sbin/casec" revision="master" tab_size="4" hl_lines="" provider="github"/]

Pour générer le certificat d'autorité pour Ipsec, lançons le deuxième script.

casec

B.3/ Génération du certificat serveur.

DNS.1 est l'étiquette qui doit correspondre absolument à l’adresse IP ou FQDN du serveur dans le fichier ipsec.cnf.

  • extentedKeyUsage prend la valeur serverAuth, soit l'option pour que le certificat soit exploitable par un serveur ipsec.
  • Il est possible de générer plusieurs certicats pour autant de serveur.

Puis, pour générer le certificat serveur:

[pcsh lang="bash" user="jbsky" repos="jbsky" path_id="ipfire/rootfs/usr/local/sbin/secsrv" revision="master" tab_size="4" hl_lines="" provider="github"/] Puis, lançons le troisième script.

[bash]secsrv[/bash]

B.4/ Génération du certificat client.

Dans le fichier ipsec.cnf, à noté que extentedKey prend la valeur clientAuth, soit l'option pour que le certificat soit exploitable par un client ipsec.

Il est possible de générer plusieurs certificats serveurs pour le même client sous la même autorité.
Donc, pour générer le certificat client:

[pcsh lang="bash" user="jbsky" repos="jbsky" path_id="ipfire/rootfs/usr/local/sbin/secacces" revision="master" tab_size="4" hl_lines="" provider="github"/]

Enfin, lançons le dernier script.

[bash]secacces[/bash]

Connecter des machines virtuelles dans GNS3

Suite à diverse message d'erreur dans GNS3 comme ci-dessous, j'en suis venu à utiliser diverse méthode pour connecter les machines virtuelles.

Server error from http://127.0.0.1:3080: SW1: unable to create generic ethernet NIO

Server error from http://127.0.0.1:3080: Windows Server 2012 contorse: Could not find NPF id for VMnet interface VMnet1

Prérequis :

  • GNS3 et VMware (fraîchement) installés.
  • Importer une image IOS afin de créer un routeur avec deux cartes réseaux et un périphérique final virtuel avec une carte réseau.
  • l'hôte se connecte à Internet

Mise en scène :

  1. Un routeur virtuel
  2. Une machine virtuel

schema-1-gns3

Dans cet exemple, la machine virtuelle à l’adresse IP 172.16.254.10 accède à Internet à l'aide d'un routeur virtuel par l'adresse IP 172.16.254.1.

1/ Créer les cartes VMnetX depuis GNS3

Après une nouvelle installation, choisir serveur local (127.0.0.1).

Dans le menu Edit->Preferences
à droite de la fenêtre, dans le menu, choisir VMware, à gauche choisir l'onglet Network,
Pour mon exemple,
mettre de vmnet4 à vmnet 5,
sélectionner la case "Block network traffic originating from the host OS"
et cliquer sur Configure

fix interface in GNS3
fix interface in GNS3

2/ Attribuer correctement les cartes réseaux dans les machines virtuelles.

Suite à une nouvelle installation de VMware workstation, dans le menu Edit, Virtual Network Editor, il y a 3 cartes réseaux.
VMnet0 bridged Auto-bridging - - -
VMnet1 Host-only - Connected - X
VMnet8 NAT NAT Connected - X

fix-network-in-wmware-1
fix-network-in-wmware-1

Logiquement, après manipulation dans GNS3 deux cartes réseaux ont été rajouté comme sur l'image ci-dessous. (Ne pas tenir compte des adresses réseaux)

Assigner correctement les cartes réseaux dans les machines virtuelles.

Attention de bien  attribuer les cartes réseaux dans la machine virtuel surtout quand vous en avez deux ou plus comme dans le cas du parefeu.
Dans virtual Machine Settings => Network Adapter => "Custom: Spécific virtual network" => VMnet1(Host-only)
Network Adapter 2 => "Custom: Spécific virtual network" => VMnet5(Host-only)

 

fix-iface-ipfire-1
fix-iface-ipfire-1

On peut démarrer la machine virtuelle.

3/ Connexions dans GNS3.

Il est possible d'importer des machines virtuelles dans GNS3 comme une image IOS ou de passer par le cloud.

Pour le serveur 2012.

  1. on clique sur le petit écran et on glisse un nuage dans la partie central du logiciel.
  2. on clique droit sur le nuage et sur Configure.
  3. Dans la fenêtre Node properties, on reste sur l'onglet Ethernet on sélectionne la liste Generic Ethernet NIO VMnet4.
  4. Il est possible de définir un icône différent en cliquant droit sur le nuage

makeacloud-1

 

On glisse un switch et on interconnecte les cloud et le routeur.
Si la communication ne se fait pas, écouter avec Wireshark en cliquant droit sur l'un des câbles connectant un cloud et le switch pour savoir si c'est le client ou le serveur qui n'émet pas. Débrancher dans GNS3 la connexion qui bogue et rebrancher. Retourner dans la configuration de la machine virtuel, sélectionner la carte réseau défaillante, et en haut à droite, décocher la case Connected, faire Ok. Enfin, cocher la case Connected et encore Ok. Logiquement la machine à communique. Si vraiment ça ne fonctionne pas, c'est surement les libpcap qui ont crashé, je suis désolé, il faut redémarrer l'hôte.

4/ Comment accéder aux réseaux virtuels depuis l'hôte ?

4-a/Pour les cartes Ethernet

1/Les cartes Ethernet peuvent directement mises dans un cloud. Dans ce cas là, il est même possible, d'enlever les protocoles IPv4 et IPv6 de la carte et laissez le matériel virtuel servir de routeur ou de pare-feu gérant l'accès vers l’extérieur (Internet).

2/ Il est aussi possible d'installer une carte de bouclage Microsoft-KM test et l'inclure dans un nouveau cloud.

Clique droit dans le menu Démarrer et Gestionnaire de périphériques. Dans la fenêtre mmc qui apparait, clique droit sur l'ordinateur et ajouter un matériel d'ancienne génération.
Sélectionner la Carte réseau et cliquer sur Suivant,
Sélectionner Microsoft puis la carte carte de bouclage Microsoft-KM test, et enfin Suivant.

installloopback-1
installloopback-1

4-b/Pour les cartes Wifi:

Les cartes WIFI ne prennent pas en charge le pont. Cependant, il existe une veille méthode de partage de connexion en passant par les propriétés de la carte.
givewifi-1

Si l'on souhaite dans ce cas de figure donner un accès à l'hôte au réseau GNS3 sans cartes de bouclage réseau, il faut renseigner correctement l’existence de la route à l'hôte pour accéder au réseau GNS3. A l'aide de la commande route print, je récupère le numéro de la carte réseau (celui avant les trois petits points et l'adresse physique).

[bash]C:\Windows\system32>ipconfig

[...] Carte Ethernet VMware Network Adapter VMnet1 :

Suffixe DNS propre à la connexion. . . :
Adresse IPv6 de liaison locale. . . . .: fe80::a83d:4467:abb7:65e1%18
Adresse IPv4. . . . . . . . . . . . . .: 192.168.137.1
Masque de sous-réseau. . . . . . . . . : 255.255.255.0
Passerelle par défaut. . . . . . . . . :
[...]

C:\Windows\system32>route print
===========================================================================
Liste d'Interfaces
17...44 8a 5b ed 6b 7f ......Qualcomm Atheros AR8161 PCI-E Gigabit Ethernet Controller (NDIS 6.30)
36...02 00 4c 4f 4f 50 ......Npcap Loopback Adapter
60...02 00 4c 4f 4f 50 ......Carte de bouclage Microsoft KM-TEST
23...48 51 b7 00 d4 8b ......Microsoft Wi-Fi Direct Virtual Adapter
18...00 50 56 c0 00 01 ......VMware Virtual Ethernet Adapter for VMnet1
19...00 50 56 c0 00 08 ......VMware Virtual Ethernet Adapter for VMnet8
56...00 50 56 c0 00 04 ......VMware Virtual Ethernet Adapter for VMnet4
58...00 50 56 c0 00 05 ......VMware Virtual Ethernet Adapter for VMnet5
4...48 51 b7 00 d4 8a ......Intel(R) Dual Band Wireless-AC 7260
3...48 51 b7 00 d4 8e ......Bluetooth Device (Personal Area Network)
1...........................Software Loopback Interface 1
===========================================================================
[...] C:\Windows\system32>route add 172.16.254.0 mask 255.255.255.0 192.168.137.81 if 18
OK!

C:\Windows\system32>ping 172.16.254.10

Envoi d’une requête 'Ping' 172.16.254.10 avec 32 octets de données :
Réponse de 172.16.254.10 : octets=32 temps=1 ms TTL=127
Réponse de 172.16.254.10 : octets=32 temps=1 ms TTL=127
Réponse de 172.16.254.10 : octets=32 temps=2 ms TTL=127
Réponse de 172.16.254.10 : octets=32 temps=1 ms TTL=127

Statistiques Ping pour 172.16.254.10:
Paquets : envoyés = 4, reçus = 4, perdus = 0 (perte 0%),
Durée approximative des boucles en millisecondes :
Minimum = 1ms, Maximum = 2ms, Moyenne = 1ms [/bash]