11 octobre 2007

OpenVPN avec OpenBSD et Windows

OpenVPN est un logiciel libre qui, comme son nom l'indique, permet de créer des réseaux privés virtuels. Nous allons prendre pour exemple un serveur OpenVPN sous OpenBSD, et un client sous Microsoft Windows.


Partie serveur

Installation

Tout d'abord, installer le package OpenVPN. Avec OpenBSD 4.1:

pkg_add ftp://ftp.openbsd.org/pub/OpenBSD/4.1/packages/i386/openvpn-2.0.6p0.tgz

OpenVPN utilise SSL pour sécuriser le réseau virtuel. Afin de garantir cette sécurité, SSL se base sur un système de clefs publiques (ou certificats d'identité) et de clefs privées.

Les clefs privées permettent de crypter les données et doivent rester protégées sur les postes concernés. Elles sont stockées dans des fichiers .key. Les clefs publiques permettent de décrypter ces données, et sont stockées dans des fichiers .crt. Elles doivent être présentes sur les postes qui reçoivent ces données.

Le certificat racine représente l'entité qui gère les autorisations d'accès au réseau (ici, notre serveur). Il est matérialisé par le fichier ca.crt.

Après avoir créé ce certificat, le serveur peut générer d'autres certificats qui lui permettront, ainsi qu'aux machines qui y seront autorisées, de se connecter au VPN.


Configuration pour la génération de clefs

Créer un répertoire /etc/openvpn/ en exécutant :

mkdir /etc/openvpn

Dans ce répertoire, nous allons faire une copie conforme des scripts présents dans la documentation:

cp -R /usr/local/share/examples/openvpn/easy-rsa/ /etc/openvpn/

Il faut éditer ensuite les caractéristiques des certificats à générer :

vi /etc/openvpn/easy-rsa/vars

Par exemple:
export KEY_COUNTRY=FR
export KEY_PROVINCE=07
export KEY_CITY="PRIVAS"
export KEY_ORG="OpenVPN-TEST"
export KEY_EMAIL="mon.email@mondomaine.fr"

Les clefs seront générées dans le répertoire /etc/openvpn/easy-rsa/keys/ . Se placer dans /etc/openvpn/easy-rsa/ et initialiser ce répertoire:

cd /etc/openvpn/easy-rsa/
. ./vars && ./clean-all


Générer le certificat racine:

./build-ca
Generating a 1024 bit RSA private key
............++++++
...........++++++
writing new private key to 'ca.key'
-----
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.
-----
Country Name (2 letter code) [FR]:
State or Province Name (full name) [07]:
Locality Name (eg, city) [PRIVAS]:
Organization Name (eg, company) [OpenVPN-TEST]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:OpenVPN-CA
Email Address [
mon.email@mondomaine.fr]:

Le script va poser une série de questions. La seule à laquelle il faut obligatoirement donner une réponse est Common Name.


Génération de clefs

Pour générer la clef du serveur :

./build-key-server server

De la même manière que précédemment, le script va poser une série de questions. Répondre server à la question Common Name. Ensuite, répondre y aux deux questions Sign the certificate? [y/n] et 1 out of 1 certificate requests certified, commit? [y/n].

Il est ensuite possible de générer des clefs pour le (ou les) poste(s) client(s):

./build-key client1
./build-key client2
./build-key client3
...

Pour générer des clefs protégées par un mot de passe, utiliser le script build-key-pass au lieu de build-key.

Génération de paramètres Diffie Hellman (nécessaires à l'échange des clefs) :

./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
.................+...........................................
...................+.............+.................+.........
......................................


Configuration du serveur

OpenVPN se configure par l'intermédiaire du fichier /etc/openvpn/openvpn.conf :

vi /etc/openvpn/openvpn.conf

Le fichier de référence se trouve dans /usr/local/share/examples/openvpn/sample-config-files/server.conf. Voici un exemple de configuration:

# port sur lequel écoute le serveur
port 5550

# protocole utilisé (udp est plus approprié
# pour encapsuler du tcp)

proto udp

# périphérique à utiliser (ici, /dev/tun0)
dev tun0

# Certificat racine (à distribuer aux clients)
ca ca.crt

# Clef publique du serveur
cert server.crt

# Clef privée du serveur (à garder secrète)
key server.key

# Paramètres de Diffie Hellman
dh dh1024.pem

# Caractéristiques du réseau à mettre en place
server 172.16.0.0 255.255.255.0

# Fichier associant à chaque client qui se connecte
# une adresse IP
ifconfig-pool-persist ipp.txt

keepalive 10 120

# Activer la compression
comp-lz

# Exécuter avec l'utilisateur _openvpn
# et le groupe _openvpn

user _openvpn
group _openvpn

# Conserver les clefs et autres paramètres en
# mémoire (après les changements d'UID et de GID)

persist-key
persist-tun

# Niveau de détails du fichier journal
verb 5



Lancement du service au démarrage

Comme d'habitude sous OpenBSD, éditer le fichier /etc/rc.local et y ajouter:

if [ -x /usr/local/sbin/openvpn ]; then
  echo -n ' openvpn'
  /usr/local/sbin/openvpn --config /etc/openvpn/openvpn.conf --daemon > /dev/null 2>&1
fi


Fichier journal séparé

Par défaut, les messages de log d'OpenVPN sont publiés via syslog dans /var/log/messages. Pour qu'ils apparaissent dans un fichier séparé, ajouter les lignes suivantes dans /etc/syslog.conf :

!openvpn
*.* /var/log/openvpn.log

créer ensuite le nouveau fichier :
touch /var/log/openvpn.log


Protection avec pf

Packet Filter est le firewall d'OpenBSD. Voici un exemple de règles à ajouter à /etc/pf.conf pour ne laisser passer que les paquets qui concernent le protocole de partage réseau sous Windows (SMB) sur l'interface VPN du serveur :

# Définition de l'interface réseau correspondant au VPN
vpn_if="tun0"

[...]

# Bloquer tous les paquets entrants
block in on $vpn_if
# Laisser passer les paquets sortants
pass out on $vpn_if keep state

[...]

# Laisser passer les paquets entrants de type SMB
pass in on $vpn_if inet proto udp from any to ($vpn_if) port {netbios-ns, netbios-dgm}
pass in on $vpn_if inet proto tcp from any to ($vpn_if) port {netbios-ssn, microsoft-ds}


Partie client

Installation et configuration

Pour Windows, installer OpenVPN GUI. Ensuite, ouvrir son répertoire de configuration à partir du menu démarrer -> tous les programmes -> OpenVPN -> OpenVPN configuration file directory.

Copier dans ce répertoire le certificat racine ca.crt ainsi que les clefs générés précédemment pour le poste client, client1.crt et client1.key, à partir du serveur.

Sous windows, les fichiers de configuration OpenVPN sont munis de l'extension ovpn. En créer un dans ce même répertoire ; par exemple, privas.ovpn.

Le fichier de référence est C:\Program Files\OpenVPN\sample-config\client.ovpn. Voici un exemple de configuration:

; Mode (client ou serveur)
client

; Adresse IP du serveur OpenVPN
remote 209.85.135.147

; Port sur lequel écoute le serveur
port 5550

dev tun

; Activation de la compression
comp-lzo

; Certificat racine du serveur
ca ca.crt

; Certificat attribué au client
cert client1.crt

; Clef attribuée client
key client.key

Il ne reste plus qu'à cliquer droit sur l'icône d'OpenVPN puis cliquer sur Connect.



Désactiver un certificat sur le serveur

Dans certains cas, il peut être souhaitable d'annuler l'accès au VPN par le biais de clefs précédemment générées (vol d'un portable, ...). Pour ce faire, utiliser le script revoke-full:

cd /etc/openvpn/easy-rsa && . ./vars && ./revoke-full client1

Un fichier crl.pem est alors généré dans /etc/openvpn/easy-rsa/keys. Il contient la liste de certificats révoqués, et doit être accessible par l'utilisateur _openvpn (en effet, ce fichier est vérifié chaque fois qu'une connexion est faite). Pour cela, on peut déplacer le fichier vers /etc/openvpn :

mv /etc/openvpn/easy-rsa/keys/crl.pem /etc/openvpn/

puis faire un lien vers le répertoire où il a été généré:

ln -sf /etc/openvpn/crl.pem /etc/openvpn/easy-rsa/keys/

De cette manière, le fichier sera accessible par l'utilisateur _openvpn, et sera mis à jour lorsqu'on fera de nouveau appel à revoke-full.

Ajouter cette ligne dans /etc/openvpn/openvpn.conf :

crl-verify /etc/openvpn/crl.pem

afin qu'un contrôle soit effectué à chaque connexion au VPN. Redémarrer OpenVPN.



Conclusion

OpenVPN est un peu plus complexe à mettre en place qu'une solution comme Hamachi. Cependant, sa configuration de base reste relativement simple. Il est possible de l'utiliser en mode bridge. On peut s'y connecter via un proxy http. De plus, il ne dépend pas d'un serveur tiers, et est disponible sur un plus grand nombre de platformes.

Plus d'informations sur http://openvpn.net/howto.html#quick.

Libellés : , , ,


Commentaires:
J'ai tout fait,
mais un moment je comprends pas, il met:
"fatal error, hard drive failure"
je fais quoi maintenant?

un lecteur innocent.
 
fallait pas acheter un mac :-P
 
c'est pas la commande "source" mais "ksh" (j'ai mis du temps à trouver).

Voila pour la version 4.2 de openbsd.
 
Effectivement, ça dépend du shell utilisé. La commande "." fonctionne avec ksh et avec bash - http://www.developpez.net/forums/showthread.php?t=272230
 
Hop c'est corrigé, merci.
 
Enregistrer un commentaire



<< Home

This page is powered by Blogger. Isn't yours?