• Aucun résultat trouvé

Annexes. OpenVPN. Installation

N/A
N/A
Protected

Academic year: 2022

Partager "Annexes. OpenVPN. Installation"

Copied!
11
0
0

Texte intégral

(1)

Annexes

OpenVPN

Installation

Nous avons travaillé sous la distribution Debian pour ce projet. Cependant ce programme est packagé dans la majorité des distributions et la hiérarchie des fichiers de configuration change très peu.

apt-get install openvpn

OpenVPN propose plusieurs scripts permettant la génération des certificats. Ces scripts sont contenus dans le répertoire easy-rsa, il se trouve dans /etc/openvpn.

NB: ces scripts sont fournis avec OpenVPN et ne dépendent pas de la distribution.

Dans ce répertoire se trouve le fichier vars.

Vous devez remplir les champs KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG; et si cas spécifique, changer d'autres valeurs comme export CA_EXPIRE.

Ensuite vous devez les deux scripts suivants:

./clean-all ./build-ca

Ceci génère le certificat d'autorité de notre VPN.

Ensuite nous devons générer un certificat pour le/les serveurs VPN. S'il y a plusieurs serveurs VPN, nous utiliserons le même certificat.

Nous lançons le script suivant:

./build-key-server server

A la question qui demande le Common Name, mettez « serveur ». Il faut répondre par l'affirmative aux deux questions suivantes : "Sign the certificate? [y/n]" and "1 out of 1 certificate requests certified, commit? [y/n] .

Enfin nous devons générer les paramètres de Diffie Hellman avec la commande:

./build-dh

Résumé des fichiers générés:

ca.crt : ce fichier est le certificat de notre VPN, ce fichier est public et doit être diffusé sur chaque élément du VPN (clients et serveurs).

ca.key : ce fichier permet de signer des certificats. Ce fichier doit rester secret, seul sa présence sur la machine générant les certificats pour les clients est nécessaire.

dh1024.pem : ce fichier n'est pas secret. Sa présence est requise uniquement sur le serveur.

server.crt : ce fichier est public, il identifie le serveur VPN. Il doit donc se trouver sur chaque serveur VPN.

server.key : ce fichier est secret. Il est doit se trouver sur chaque serveur VPN.

Remarque: les .key sont les fichiers les plus critiques de notre système. Ils doivent être copiés par l'intermédiaire d'un canal sécurisé et gardé en lieux sûrs.

(2)

Configuration du serveur VPN

proto udp : Connexion en UDP port 1194 : Port d'écoute

dev tun : Utilise le routage pour l'interconnexion entre le réseau VPN et le LAN.

ca privnet/ca.crt cert privnet/server.crt key privnet/server.key dh privnet/dh1024.pem

server 10.8.0.0 255.255.255.0 : classe d'ip attribuée au client. Ne pas oublier que chaque client utilise une /30

ifconfig-pool-persist ipp.txt : contient la liste des clients avec leur ip keepalive 10 120 : Pingue le client toutes les 10 secondes et considère que le client n'est plus là au de 120 secondes

comp-lzo : Active la compression des données (Cette option doit être activée sur le serveur ET sur le client)

push comp-lzo : Informe les clients d'utiliser la compression des données user nobody : Utilisateur sous lequet tourne le démon OpenVPN

group nobody

persist-key : Permet d'empêcher de recharger certaines données qui ne serait plus accessible à cause du changement d'utilisateur.

persist-tun

status openvpn-status.log : contient l'état instantané du serveur

verb 3 : ce niveau permet de garder en mémoire les connexions effectuées.

push "redirect-gateway local def1" : permet de spécifier au client de rediriger tout le trafic réseau à travers le VPN

up /etc/openvpn/gateway-up.sh : exécute le script gateway-up.sh au lancement du démon.

down /etc/openvpn/gateway-up.sh : exécute le script gateway-up.sh à l'arrêt du démon.

Remarque sur la configuration réseau

Les clients sur le VPN ne peuvent pas communiquer entre eux. Les clients ne peuvent pas

broadcaster sur le LAN. Une machine sur le LAN ne peut pas atteindre une machine connectée sur le VPN. Les clients VPN sont nattés, ils accédent au LAN avec l'adresse IP côté LAN du serveur VPN.

Avantage du routage: plus efficace et meilleure montée en charge.

Règles de filtrage sur le serveur:

On part de la configuration firewall suivante:

Bloqué en INPUT et FORWARD. Autorisé en OUTPUT.

Eth0: interface côté LAN.

Eth1: interface côté WiFi tun0 : interface VPN Accès au VPN:

iptables -A INPUT -p udp --dport 1194 -i eth1 -j ACCEPT Autorise les clients du VPN à passer le serveur VPN.

Dans ce cas, les clients VPN peuvent accéder à tout le LAN (et à Internet si une passerelle est configurée).

iptables -A FORWARD -i tun0 -j ACCEPT Configuration du nat

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE

(3)

Configuration de la passerelle au démarrage d'openvpn

Le portail captif rajoute des règles au pare-feu de la passerelle, notamment pour rediriger les utilisateurs vers la page d'accueil et pour laisser passer uniquement les utilisateurs authentifiés.

Ces règles empêchent le bon fonctionnement du serveur VPN. Ainsi lorsque le serveur OpenVPN démarre, il exécute le script suivant:

gateway-up.sh

#!/bin/bash DEV_OUT=eth0

iptables -I FORWARD -i ${dev} -o ${DEV_OUT} -m state –state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -I FORWARD -o ${dev} -i ${DEV_OUT} -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -t nat -I PREROUTING -i ${dev} -j ACCEPT

DEV_OUT représente l'interface côté LAN.

Le paramètre ${dev} est renseigné par OpenVPN lors de l'exécution du script. Il représente l'interface du tunnel (typiquement tun0).

Les 2 premières lignes indiquent au pare-feu de laisser passer les paquets venant du VPN et de laisser entrer les paquets à destination du pare-feu s'ils correspondent à des connexions déjà initialisées.

La 3ème ligne permet d'éviter que les paquets venant du VPN soit altérés par les règles de redirection du portail captif.

Lors de l'arrêt du serveur OpenVPN, un script similaire est appelé: gateway-down.sh. Il se charge de supprimer les règles rajoutés par gateway-up.sh.

(4)

Installation Nocat

Rappel du principe de fonctionnement de NoCat : les utilisateurs se connectent sans-fil à un point d'accés, lancent un navigateur web.

Lorsqu'ils tentent d'accéder à une adresse, NoCat intercepte leur requête et ils sont redirigés vers le module d'authentification web sécurisée (https). Dés qu'ils sont authentifiés, une fenêtre pop-up est affichée. Tant que cette fenêtre est ouverte, ils peuvent accéder à internet. Pour un utilisateur

non reconnue, toute connexion est impossible.

NoCat se compose de deux modules : un module d'authentification web (authserv) qui doit être exécuté sur une machine faisant tourner apache-ssl, et un module passerelle (gateway), qui peut être exécuté sur une machine différente. Pour notre projet, les deux modules sont installés sur la même machine. L'installation ce fera sur une Debian.

Voici le le plan d'adressage du réseau utilisé pour la maquette :

Le serveur d'authentification, la passerelle de Nocat, le serveur dhcp et le serveur vpn sont installé sur une même machine (NoDog). Une deuxième machine se trouvant sur le réseaux de l'IUP avec un serveur apache sera accessible depuis un utilisateur « associé » au hot spot sans passer par l'authentification. Elle permettra d'avoir accès au site de téléchargement de la solution VPN.

Au préalable apache-ssl et un serveur DHCP doivent être installés.

Les commandes à taper sont sur lignées en «commande»

Le contenu des fichiers est sur ligné en «contenu»

Tous les fichiers de configuration sont dans l'annexe.

(5)

Installation d'apache-ssl

apt-get install apache-ssl

Installation du serveur DHCP

apt-get install dhcp3-server

Configuration du serveur DHCP (fichier de configuration : dhcpd.conf)

La configuration des interfaces d'écoutes ce fait dans le fichier dhcp3-server (/etc/default/dhcp3- server) : INTERFACES="eth1"

Configuration des paramètres du serveur dhcp :

vim /etc/dhcp3/dhcpd.conf

option domain-name-servers 192.169.0.1 [adresse de notre dns]

default-lease-time 600;

max-lease-time 7200;

subnet 192.169.0.0 netmask 255.255.255.0 { range 192.169.0.10 192.169.0.100;

option routers 192.169.0.1;

ping-check = 1;

}

Relancer le serveur DHCP

/etc/init.d/dhcp3-server restart

Packages également nécessaires :

apt-get install iptables perl libdbi-perl libdbd-mysql-perl libnet-netmask-perl pgp apache-ssl

Télécharger NoCat

NoCat se trouvent à l'adresse http://nocat.net/download/NoCatAuth/. Nous utiliserons la version 0.82, pour le télécharger:

wget http://nocat.net/download/NoCatAuth/NoCatAuth-0.82.tar.gz

Installer NoCat

L'installation se fera dans /usr/local/nocat.

(6)

tar xvzf NoCatAuth-0.82.tar.gz

Dans le cas où vous avez un noyau 2.6, modifier le fichier bin/detect-fw.sh ligne 13, remplacez

"2.4" par "2.6"

cd NoCatAuth-0.82

mkdir /usr/local/nocat

make PREFIX=/usr/local/nocat/gateway gateway make PREFIX=/usr/local/nocat/authserv authserv make PREFIX=/usr/local/nocat/authserv pgpkey

Attention, lorsque au cours de la création de la clé PGP un mot de passe est demandé, n'en mettre aucun, cela produit des erreurs par la suite.

cp /usr/local/nocat/authserv/trustedkeys.gpg /usr/local/nocat/gateway/pgp/

chown -R www-data:www-data /usr/local/nocat/authserv/pgp/

Configurer NoCat

Dans notre exemple nous avons le réseau WiFi configuré grâce au serveur DHCP, l'adressage réseau est le suivant: 192.169.0.0/24, l'adresse IP sur le routeur est 192.169.0.1

On modifie les fichiers suivants pour paramétrer Nocat :

vim /usr/local/nocat/gateway/nocat.conf :

AuthServiceAddr 192.169.0.1 # Adresse du serveur d'authentification ExternalDevice eth0 # Nom de l'interface réseau extérieure InternalDevice ath0 # Nom de l'interface réseau intérieure WIFi IncludePorts 22 80 443 # Ports acceptés (si on commente cette ligne, tout est autorisé)

AllowedWebHosts nodog.univ-avignon.fr # Nom de machine non concernées par l'authentification, ici la machine sur laquelle on récupère le client VPN.

LogFacility internal

vim /usr/local/nocat/authserv/nocat.conf : LocalNetwork 192.169.0.0/24

Création des certificats pour le HTTP sécurisé :

cd /etc/ssl/certs

openssl req -new > nocat.cert.csr

openssl rsa -in privkey.pem -out new.cert.key

openssl x509 -in nocat.cert.csr -out nocat.cert.cert -req -signkey new.cert.key -days 365

Configuration d'Apache-SSL (Ajouter à la fin du fichier httpd.conf)

(7)

vim /etc/apache-ssl/httpd.conf

LoadModule env_module /usr/lib/apache/1.3/mod_env.so

<VirtualHost 192.169.0.1>

ServerName 192.169.0.1

SSLCertificateFile /etc/ssl/certs/nocat.cert.cert SSLCertificateKeyFile /etc/ssl/certs/new.cert.key DocumentRoot /usr/local/nocat/authserv/htdocs Include /usr/local/nocat/authserv/httpd.conf

</VirtualHost>

On relance apache-ssl :

/etc/init.d/apache-ssl restart

Vérifiez que les lignes suivantes dans /usr/local/nocat/authserv/nocat.conf soient bien décommentées (décommenter une ligne signifie enlever le signe « # » en début de ligne)

vim /usr/local/nocat/authserv/nocat.conf : DataSource Passwd

UserFile /usr/local/nocat/authserv/etc/passwd GroupUserFile /usr/local/nocat/authserv/etc/group GroupAdminFile /usr/local/nocat/authserv/etc/groupadm

Pour le projet, nous avons utilisé le fichier passwd pour l'authentification des utilisateurs.

Néanmoins il est possible d'utiliser un base SQL ou un annuaire LDAP. (voir fichier de configuration dans les annexes).

Création des utilisateurs :

/usr/local/nocat/authserv/bin/admintool -c login motdepasse

On lance le module passerelle :

/usr/local/nocat/gateway/bin/gateway

Si la passerelle doit être relancé :

/usr/local/nocat/gateway/bin/gateway -R

Voilà, Nocat est maintenant installer et quasiment configuré sur notre machine!

(8)

Documentation du code php permettant la gestion des certificats

Deux fichier majeurs :

dl.php affiche la clé privée client et le certificat client, propose deux liens pour les dl.

gen_ssl.php est la fonction permettant la génération et l’affichage de la clé et du certificat.

Deux fichiers pour le téléchargement de la clé et du certificat : certificat.php pour le certificat.

pkey.php pour la clé.

Description de dl.php (commenté) : //Démarrage de la session

session_start();

Nous démarrons une session pour ensuite vérifier que l’utilisateur est connecté.

echo'<html>';

//Indiquer ici le nom que l'on souhaite donner à la page web

echo'<head><title>T&eacute;l&eacute;chargement d\'OpenVPN</title></head>';

echo'<body>';

Ouverture des balises nécessaires au HTML.

//Identification de la connexion (c'est içi qu'on fera la connexion à la base pour vérifier le couple login mdp)

if($_POST['login']=='nodog' && $_POST['mdp']=='wifi'){

$_SESSION['logged']='yes';

$_SESSION['login']=$_POST['login'];

}

Ici, nous vérifions que le couple login / mot de passe est correct. Si tel est le cas, nous définissons la variable de session ‘logged’ à yes et la variable de session ‘login’ prend comme valeur le login entré par l’utilisateur.

//Vérification de la connexion

if(isset($_SESSION['logged']) && $_SESSION['logged']=='yes'){

Nous vérifions que l’utilisateur est bien connecté. Si tel est le cas, les actions suivantes seront effectuées.

//Indiquer ici le nom et l'emplacement du certificat racine

$CA_CRT = "ca.crt";

//Indiquer ici le nom et l'emplacement de la clé privée du serveur

$CA_KEY = "ca.key";

//Indiquer ici le nom et l'emplacement du certificat généré SUR LE SERVEUR

$CLIENT_CRT = "certificats/".$_SESSION['login'].".crt";

(9)

//Indiquer ici le nom et l'emplacement de la clé privée générée SUR LE SERVEUR

$CLIENT_KEY = "certificats/".$_SESSION['login'].".key";

//Indiquer ici la durée en jour de validité du certificat

$CLIENT_duree = 365;

Ici sont configurables les divers paramètres qui permettront la génération de la clé privée et du certificat du client.

$CA_CRT est le nom que port le certificat racine du serveur.

$CA_KEY est le nom que porte la clé privée du serveur.

$CLIENT_CRT est le nom du certificat qui sera généré sur le serveur.

$CLIENT_KEY est me nom de la clé privée générée sur le serveur.

$CLIENT_duree est la durée de validité du certificat en jour.

Tous ces paramètres seront utilisés dans la fonction gen_ssl.php.

//Génération de la clé privée et du certificat client include ('gen_ssl.php');

Nous appelons ici la fonction gen_ssl.php qui nous permet de générer la clé privée et le certificat du client.

else {

include ('login_secu.php');

echo 'login ou mdp incorrect';

}

Si le couple login / mot de passe n’est pas valide, nous réaffichons la page de login avec une mention précisant l’erreur.

echo'<br /><a href="certificat.php">T&eacute;l&eacute;chargement du certificat</a><br />';

echo'<a href="pkey.php">T&eacute;l&eacute;chargement de la cl&eacute;

priv&eacute;e</a><br />';

Nous créons deux liens permettant de télécharger les fichiers. Les deux fichiers,

certificat.php et pkey.php vers lesquels pointent les liens sont décrits dans ce document.

echo'</body>';

echo'</html>';

Fermeture des balises nécessaires au HTML.

Description de gen_ssl.php (commenté):

//Génération d'une clé privée

$req_key = openssl_pkey_new();

On commence par générer une requête de clé privée.

if(openssl_pkey_export ($req_key, $out_key)) { }

(10)

else {

echo 'Echec de l\'Exportation de la cl&eacute; priv&eacute;e<br />';

}

On exécute la requête, si elle n’aboutit pas on affiche un message d’erreur.

//Indiquer ici les informations relatives à l'université

$dn = array(

"countryName" => "FR",

"stateOrProvinceName" => "PACA",

"localityName" => "Avignon",

"organizationName" => "CRI",

"organizationalUnitName" => "Certification",

//Ici sont indiqués le nom de la personne utilisant cette clé privée et son adresse email

"commonName" => "".$_SESSION['login']."",

"emailAddress" => "".$_SESSION['login']."@univ-avignon.fr"

);

Ici sont renseignés toutes les informations concernant la délivrance du certificat (pays, région, ville, organisation…).

//Génération de la requête de signature de certificat

$req_csr = openssl_csr_new($dn, $req_key);

Comme pour la clé privée, on génère une requête pour la signature du certificat avec en paramètre toutes les données entrées précédemment.

//Signature du certificat

$req_cert = openssl_csr_sign($req_csr, "file://$CA_CRT", "file://$CA_KEY",

$CLIENT_duree);

Ici a lieu la signature effective du certificat.

if(openssl_x509_export ($req_cert, $out_cert)){

} else {

echo "Echec de cr&aecute;tion du certificat\n";

}

Export du certificat avec, en cas d’échec, un affichage de message d’erreur.

//Export en fichier format PKCS12 (mix clé privée + certif) TODO fonction non reconnue par grumly...

$fichier = "certificats/".$_SESSION['login']."xxx.crt";

$pass = "";

if(openssl_pkcs12_export_to_file($out_cert, $fichier, $out_key, $pass)){

} else{

echo " Echec de cr&aecute;tion du fichier PKCS12\n ";

}

(11)

Ici on exporte le tout (certificat et clé) sous un fichier de format PKCS12. Ainsi l’utilisateur n’aura qu’un fichier à télécharger ce qui est plus ergonomique.

Références

Documents relatifs

LOGICO – Colorie la case lorsque tu as réussi la fiche... LOGICO – Colorie la case lorsque tu as réussi

4) Dans la boîte de dialogue Configurations communes, cliquez sur Réseau privé virtuel (serveur VPN), puis sur Suivant... 5) Dans la boîte de dialogue Protocoles du client

Il prévoit nolam!llpnt.·.. des

et, après avoir pratiqué les examens recommandés par le consensus médical et lui avoir expliqué ainsi qu’à ses parents les risques dus à son âge, je certifie que son état

Elle est d'autant plus bouleversée lorsque quelques mètres plus loin, un autre vélo à roues carrées est apposé contre un mur.. C'est à partir de là que la jeune femme

d) informer le Client que ce dernier engage sa responsabilité en cas de non-respect ou de mauvaise appli- cation des conditions relatives à l’accès et à l’utilisation du

Marie-Pierre Horard-Herbin nous a encore demandé comme chaque année de participer à la fête de la science (le Samedi 21 et Dimanche 22 Novembre, de 8H à 18H).. Soit nous

La bonification proportionnelle à la durée de la séparation n’est accordée que sur le vœu portant sur « toute possibilité d’accueil - fonctions indifférentes -