Mon réseau d’entreprise
16.1 Le serveur OpenVPN
À l’IUT, Le TP openvpn est présenté à la section 6.1.
Le service OpenVPN permet de fournir un accès sécurisé au dessus d’un réseau non fiable comme Internet. Il faut commencer par mettre en place un serveur OpenVPN. La figure 16.1 illustre l’architecture globale. Le serveur OpenVPN va fournir l’accès à des ordinateurs internes, potentiellement des serveurs.
Les clients peuvent être de deux types : poste nomade ou routeur d’accès. Le poste nomade est, par exemple, le portable d’un employé. Le routeur d’accès peut fournir la connectivité entre les ordinateurs dans plusieurs sites de l’entreprise.
Fig. 16.1 : L’architecture OpenVPN.
Comme il n’y a pas de gestion compliquée de la licence du logiciel, il est possible d’utiliser des machines virtuelles sur un PC nomade en cas de besoin.
Il est possible d’installer un client openVPN sur de nombreux systèmes d’exploitation. Néanmoins OpenVPN ne pourra pas protéger le réseau de l’entreprise si un poste nomade est corrompu.
16.1.1 Faisons autorité
Le paquet openvpn recommande le paquet easy-rsa. Celui-ci fournit l’architecture de confiance.
La sécurité d’OpenVPN repose sur la cryptographie. Les clefs présentes sur le serveur fournissant l’autorité de confiance permettent de créer des accès facilement, il faut donc que cet ordinateur soit particulièrement bien protégé.
Le paquet easy-rsa doit être installé, il fournit les commandes facilitant la gestion des différentes clefs. Pour commencer, il faut créer un répertoire dédié à la gestion des clefs. Avec une Debian Buster, c’est la commande suivante :
arno@joe:~$ make-cadir RT arno@joe:~$ ls RT arno@joe:~$ ls RT easyrsa openssl-easyrsa.cnf vars x509-types arno@joe:~$
Il faut se déplacer dans ce répertoire. Le fichier vars contient des variables qu’il faut adapter à l’usage.
set_var EASYRSA_REQ_COUNTRY "FR" set_var EASYRSA_REQ_PROVINCE "PACA" set_var EASYRSA_REQ_CITY "Marseille" set_var EASYRSA_REQ_ORG "Intl Students of RTLum" set_var EASYRSA_REQ_EMAIL "me@RTlum.net" set_var EASYRSA_REQ_OU "Osaka4ever"
Il faut alors initialiser l’infrastructure :
arno@joe:~/RT$ ./easyrsa init-pki Note: using Easy-RSA configuration from: ./vars init-pki complete; you may now create a CA or requests. Your newly created PKI dir is: /home/arno/RT/pki arno@joe:~/RT$ openssl rand -out pki/.rnd -hex 256
La commande de création du fichier .rnd ne devrait pas être utile longtemps.
Dans cette version, il faudra protéger obligatoirement la clef privée de l’autorité par une phrase de passe.
arno@joe:~/RT$ ./easyrsa build-ca Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.1.1d 10 Sep 2019 Enter New CA Key Passphrase: Re-Enter New CA Key Passphrase: Generating RSA private key, 2048 bit long modulus (2 primes) .........+++++ .........................................................................+++++ e is 65537 (0x010001) You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Common Name (eg: your user, host, or server name) [Easy-RSA CA]:RTlum CA creation complete and you may now import and sign cert requests. Your new CA certificate file for publishing is at: /home/arno/RT/pki/ca.crt arno@joe:~/RT$
Le répertoire pki contient :
- ca.crt
-
le certificat de l’autorité, il faut être sûr que ce fichier est le bon fichier, il peut être lu par tous ;
- ca.key
-
la clef secrète de l’autorité, elle doit être protégée en lecture.
16.1.2 Mise en place du serveur
La station d’autorité ne sert qu’à certifier les clefs. Tous les autres fichiers sont générés sur la machine cible, voire pour la machine cible. Si les fichiers sont générés par un autre ordinateur, il faudra les transférer de manière sécurisée.
Nous commençons par les paramètres Diffie–Hellman. Ceux-ci sont utilisés pour éviter que les sessions enregistrées par un malveillant puisse être déchifrées dans le futur si les clefs sont dérobées.
arno@joe:~/RT$ ./easyrsa gen-dh Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.1.1d 10 Sep 2019 Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time ....ceci prend un certain temps...(ici 2mn) DH parameters of size 2048 created at /home/arno/RT/pki/dh.pem
Le fichier généré pourrait être renommé pour contenir dans le nom la taille :
$ mv dh.pem dh-2048.pem
Après, nous générons les clefs pour le serveur :
arno@joe:~/RT$ ./easyrsa gen-req joe nopass Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.1.1d 10 Sep 2019 Generating a RSA private key .............+++++ .........................+++++ writing new private key to '/home/arno/RT/pki/private/joe.key.Rb6CshJgRp' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Common Name (eg: your user, host, or server name) [joe]: Keypair and certificate request completed. Your files are: req: /home/arno/RT/pki/reqs/joe.req key: /home/arno/RT/pki/private/joe.key
La commande utilise les paramètres suivants :
- gen-req
-
génère une demande de certificat ;
- joe
-
le nom court du serveur ;
- nopass
-
pas de chiffrement de la clef.
Deux fichiers sont créés : la clef secrète et la demande de certificat. Ce certificat doit être transféré sur l’autorité de certification, puis importé (commande easyrsa import-req) dans la base. Si les fichiers sont générés sur le même ordinateur, il n’y a pas la partie importation. La clef peut être directement signée :
arno@joe:~/RT$ ./easyrsa sign-req server joe
Note: using Easy-RSA configuration from: ./vars
Using SSL: openssl OpenSSL 1.1.1d 10 Sep 2019
You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.
Request subject, to be signed as a server certificate for 1080 days:
subject=
commonName = joe
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
Using configuration from /home/arno/RT/pki/safessl-easyrsa.cnf
Enter pass phrase for /home/arno/RT/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'joe'
Certificate is to be certified until Mar 20 18:09:08 2024 GMT (1080 days)
Write out database with 1 new entries
Data Base Updated
Certificate created at: /home/arno/RT/pki/issued/joe.crt
Les fichiers cryptographiques sont générés, il faut configurer le serveur. Pour cela, récupérer le fichier de configuration d’exemple :
# cd /usr/share/doc # cd openvpn/examples/sample-config-files/ # cp server.conf.gz /etc/openvpn # cd /etc/openvpn # gzip -d server.conf.gz # mv server.conf joe.conf
Il faut récupérer les fichiers cryptographiques :
- ca.crt
-
le certificat de l’autorité ;
- laurel.crt
-
le certificat de laurel, signé par l’autorité ;
- laurel.key
-
la clef privée, générée par laurel (protégée en lecture) ;
- dh2048.pem
-
les données Diffie-Hellman, générées par laurel et renommé avec la longueur de clef utilisée.
Et en créer un dernier qui limite des attaques DDOS.
# cd /etc/openvpn/ # openvpn --genkey --secret ta.key
Il faut alors modifier le fichier de configuration joe.conf du répertoire /etc/openvpn pour inclure les définitions des fichiers cryptographique. Il peut être utile de modifier l’adresse du réseau privé. Le serveur peut alors être lancé. S’il n’y a pas d’erreurs alors le lancement réussi.
root@joe:/etc/openvpn# openvpn joe.conf Mon Apr 5 20:20:06 2021 OpenVPN 2.4.7 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Feb 20 2019 Mon Apr 5 20:20:06 2021 library versions: OpenSSL 1.1.1d 10 Sep 2019, LZO 2.10 Mon Apr 5 20:20:06 2021 Diffie-Hellman initialized with 2048 bit key Mon Apr 5 20:20:06 2021 Outgoing Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication Mon Apr 5 20:20:06 2021 Incoming Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication Mon Apr 5 20:20:06 2021 ROUTE_GATEWAY 10.33.101.250/255.255.255.0 IFACE=enp0s31f6 HWADDR=18:66:da:46:72:3b Mon Apr 5 20:20:06 2021 TUN/TAP device tun0 opened Mon Apr 5 20:20:06 2021 TUN/TAP TX queue length set to 100 Mon Apr 5 20:20:06 2021 /sbin/ip link set dev tun0 up mtu 1500 Mon Apr 5 20:20:06 2021 /sbin/ip addr add dev tun0 local 10.9.0.1 peer 10.9.0.2 Mon Apr 5 20:20:06 2021 /sbin/ip route add 10.9.0.0/24 via 10.9.0.2 Mon Apr 5 20:20:06 2021 Could not determine IPv4/IPv6 protocol. Using AF_INET Mon Apr 5 20:20:06 2021 Socket Buffers: R=[212992->212992] S=[212992->212992] Mon Apr 5 20:20:06 2021 UDPv4 link local (bound): [AF_INET][undef]:1194 Mon Apr 5 20:20:06 2021 UDPv4 link remote: [AF_UNSPEC] Mon Apr 5 20:20:06 2021 MULTI: multi_init called, r=256 v=256 Mon Apr 5 20:20:06 2021 IFCONFIG POOL: base=10.9.0.4 size=62, ipv6=0 Mon Apr 5 20:20:06 2021 IFCONFIG POOL LIST Mon Apr 5 20:20:06 2021 Initialization Sequence Completed
C’est bien de vérifier, par un reboot, que le serveur démarre correctement au lancement de l’ordinateur.
16.1.3 Mise en place d’un client
Nous allons présenter ici la mise en place d’un client GNU/Linux. L’installation est similaire sur tous les systèmes raisonables. Une application pour téléphone mobile est disponible sur F-Droid. L’utilisation d’un système privateur rend caduque la sécurité apportée par OpenVPN.
Il faut commencer par générer la clef pour le client de manière similaire au serveur.
arno@joe:~/RT$ ./easyrsa gen-req jack nopass ... Common Name (eg: your user, host, or server name) [jack]: Keypair and certificate request completed. Your files are: req: /home/arno/RT/pki/reqs/jack.req key: /home/arno/RT/pki/private/jack.key
Ensuite, signer le certificat :
arno@joe:~/RT$ ./easyrsa sign-req client jack Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.1.1d 10 Sep 2019 Write out database with 1 new entries Data Base Updated Certificate created at: /home/arno/RT/pki/issued/jack.crt
Les certificats (ca.crt et jack.crt) doivent être envoyés sur le client. Ensuite, configurer le client. Il faut récupérer le fichier d’exemple d’OpenVPN (client.conf) en le renommant et en l’installant dans /etc/openvpn.
Il faut installer les fichiers dans le répertoire /etc/openvpn et modifier les déclarations dans le fichier jack.conf.
- ca.crt
-
le certificat d’autorité ;
- jack.crt
-
le certificat du client :
- jack.key
-
la clef du client.
Et ajouter le fichier ta.key depuis le serveur. Enfin, la dernière modification consiste à indiquer au client l’adresse ou le nom du serveur. Cela se fait en modifiant la directive remote. dans le fichier de configuration.
# The hostname/IP and port of the server. remote joe 1194
Ensuite, il faut lancer OpenVPN. Si tout s’est bien passé, alors l’interface tun0 apparaît.
3: tun0:... link/none inet 10.8.0.6 peer 10.8.0.5/32 scope global tun0 valid_lft forever preferred_lft forever
Le client et le serveur OpenVPN peuvent alors communiquer de manière sécurisée. Mais juste entre eux. Le serveur est souvent le routeur d’accès et n’est pas directement utilisé. Il est intéressant de pouvoir offrir un accès aux serveurs internes à l’entreprise, c’est-à-dire derrière le serveur OpenVPN.
16.1.4 Accès privé au réseau
Si le serveur OpenVPN est le routeur d’accès d’un site de l’entreprise, alors il y a un ou plusieurs réseaux internes. Un réseau d’entreprise est souvent constitué d’une DMZ, accessible depuis presque tout l’Internet, des stations protégées contre un accès extérieur et des serveurs internes, considérés comme inaccessibles depuis Internet.
Le serveur OpenVPN, étant à l’intérieur du site de l’entreprise, peut avoir accès aux serveurs internes et le transmettre aux clients. C’est ce que nous allons mettre en place.
Nous supposons que le serveur a accès à un réseau privé, par exemple : 10.105.2.1/24. Ce réseau n’a pas besoin d’être directement connecté à ce routeur, le réseau peut aussi ne pas être hébergé par l’entreprise. Pour que le client puisse se connecter vers ce réseau en utilisant la connexion OpenVPN, il faut que le serveur pousse la route en question. Le client, utilisera alors cette route. Cela se fait en modifiant le serveur pour ajouter la ou les routes désirées. Le fichier de configuration dispose d’une section adaptée où les routes seront rajoutées.
# Push routes to the client to allow it # to reach other private subnets behind # the server. Remember that these # private subnets will also need # to know to route the OpenVPN client # address pool (10.8.0.0/255.255.255.0) # back to the OpenVPN server. ;push "route 192.168.10.0 255.255.255.0" push "route 10.105.2.1 255.255.255.0"
Puis relancer le serveur OpenVPN. Il faut aussi relancer le client. La route vers le réseau poussé apparaît alors.
ip route default via 10.33.105.250 dev eth0 10.105.2.0/24 via 10.8.0.5 dev tun0 10.33.105.0/24 dev eth0 proto kernel scope link src 10.33.105.3
Le service VPN est en place. Le VPN peut être considéré comme un routeur, toutes les stratégies de routages peuvent être mises en place. En particulier, il est possible de router tout le trafic de sortie du poste nomade par le serveur VPN pour se protéger des agences de surveillance. Nous avons vu l’utilisation des phrases de passe pour protéger les clefs secrètes du vol du fichier. Cette protection peut s’étendre facilement à tous les fichiers en chiffrant le disque dur.
