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.
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
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.
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.
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.
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)
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 UserFile GroupUserFile GroupAdminFile Passwd /usr/local/nocat/authserv/etc/passwd /usr/local/nocat/authserv/etc/group /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!
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élé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";
//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éléchargement du certificat</a><br />'; echo'<a href="pkey.php">téléchargement de la clé privé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)) {
else { echo 'Echec de l\'exportation de la clé privé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 ";
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.