{{tag>VPN OpenVPN easy_rsa nouveau client certficat openSSL push-reset override ccd client_config_dir}}
====== Ajouter un nouveau client à notre serveur OpenVPN ======
Pour faire suite a l'article (qui n'existe pas encore ;-) )sur le serveur, voici comment ajouter un nouveau client.
Prérequis :
* un serveur OpenVPN correctement configuré (hébergé sur une debian wheezy, mais une distribution inférieure autre fera l'affaire aussi
* un client dans mon cas sous linuxmint 17, mais la encore peu de choses vont changer dans la suite
Coté client il existe 2 manières de faire :
* Utiliser une configuration globale système (avec connexion automatique au VPN au démarrage) ce que nous allons faire
* Utiliser une configuration plus orientée poste nomade avec une connexion VPN à la demande via network-manager
Nous allons nous intéresser au premier cas
Nous allons configurer une connexion VPN automatique sans mot de passe avec notre réseau. Ne faites pas ceci sur une machine susceptible de se faire voler ou d'être perdue. Sur ce type de machine il faudra préférer :
* une clef avec passphrase
* une connexion manuelle
Et bien sur si le pire arrivait, notifier au plus vite votre administrateur système (ca tombe bien ca devrait être vous ;) ) et révoquer dans les plus brefs délais les certificats perdus/volés
===== Prérequis =====
==== Poste client ====
* Sur notre poste client il nous faudra ... openvpn ;p :# apt-get install openvpn
==== Générer le certificat ====
Nous allons supposer ici que vous utilisez easy-rsa pour la gestion de votre PKI OpenVPN, ce qui est souvent le cas par défaut. Sinon vous devriez savoir adapter la suite.
* Depuis le serveur :
* importer votre configuration easy-rsa :# cd /etc/openvpn/easy-rsa
# source ./vars
* générer un certificat pour ce futur nouveau client que nous allons baptiser "nouveauClient" dans la suite (remplacer ce nom par le votre) :# ./pkitool nouveauClient
ce qui devrait vous afficher quelque chose de similaire à :# ./pkitool nouveauClient
Generating a 1024 bit RSA private key
.....................++++++
....................................++++++
writing new private key to 'nouveauClient.key'
-----
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'FR'
stateOrProvinceName :PRINTABLE:'MaProvince'
localityName :PRINTABLE:'MaVille'
organizationName :T61STRING:'Chez_oam'
commonName :PRINTABLE:'nouveauClient'
emailAddress :IA5STRING:'root@mondomaine.com'
Certificate is to be certified until Jan 11 10:29:19 2025 GMT (3650 days)
Write out database with 1 new entries
Data Base Updated
* Le certificat est généré dans le sous répertoire "keys", pour s'en convaincre un petit ls :
# ls /etc/openvpn/easy-rsa/keys/nouveauClient.*
/etc/openvpn/easy-rsa/keys/nouveauClient.crt /etc/openvpn/easy-rsa/keys/nouveauClient.csr /etc/openvpn/easy-rsa/keys/nouveauClient.key
===== Configuration du client =====
* Transférer les fichiers suivants sur votre poste client en utilisant un moyen "sécurisé" : clef USB, scp, .... :
* le certificat et sa clef (respectivement fichiers nouveauClient.crt et nouveauClient.key)
* le certificat de votre serveur (pour savoir de quel fichier il s'agit, vous pouvez utiliser la commande # grep "^ca" /etc/openvpn/server.conf
qui devrait vous donner quelque chose comme :
# grep "^ca" /etc/openvpn/server.conf
ca keys/ca.crt
* Déposer ces fichiers dans le répertoire /etc/openvpn/, de telle sorte que vous devriez y trouver les fichiers suivants :
# ls /etc/openvpn/
nouveauClient.crt nouveauClient.key ca.crt update-resolv-conf
* Ecrire le fichier de configuration **/etc/openvpn/client.conf** qu'il faudra bien sur adapter a vos besoins :
# cat << EOF > /etc/openvpn/client.conf
client
remote vpn.mondomaine.com 1194
proto udp
nobind
persist-key
persist-tun
dev-type tun
dev vpn-chezoam
user nobody
group nogroup
ca ca.crt
cert nouveauClient.crt
key nouveauClient.key
comp-lzo
verb 4
EOF
Ceci est une configuration standard :
* on définit le mode client, l'adresse/port/protocole du serveur (ici vpn.mondomaine.com en udp sur le port 1194 : vous devriez vouloir changer au moins le nom du serveur)
* le mode de l'interface réseau utilisé : j'ai choisi tun. On peut aussi noter que j'aime bien nommer cette interface avec un nom explicite : "vpn-chezoam"
* Il faut bien sur adapter les noms "nouveauClient.crt" et "nouveauClient.key" des directives **cert** et **key** à votre client
* Enfin j'active la compression lzo (qui doit aussi être activée coté serveur)
* Et un peu de verbosité parce que ça ne fait pas de mal
C'en est fini de la configuration coté client : il ne reste plus qu'à configurer notre serveur pour ce nouveau client.
===== Configuration du serveur =====
Le serveur utilise un "client configuration directory" (aka ccd). Il faut donc ajouter un nouveau fichier dans ce répertoire pour notre nouveau client.
C'est le moment d'assigner une IP à notre nouveau client avec la directive **ifconfig-push**
Chaque paire d'adresse de ifconfig-push représente les adresses virtuelles du client et du serveur. Elles doivent être prises dans des sous réseaux /30 pour être compatibles avec les clients windows (et plus spécifiquement le driver TAP windows).
Si la phrase ci dessus est du chinois, sachez juste qu'il faut prendre les couples d'adresses dans les couples suivants :
[ 1, 2] [ 5, 6] [ 9, 10] [ 13, 14] [ 17, 18]
[ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38]
[ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58]
[ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78]
[ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98]
[101,102] [105,106] [109,110] [113,114] [117,118]
[121,122] [125,126] [129,130] [133,134] [137,138]
[141,142] [145,146] [149,150] [153,154] [157,158]
[161,162] [165,166] [169,170] [173,174] [177,178]
[181,182] [185,186] [189,190] [193,194] [197,198]
[201,202] [205,206] [209,210] [213,214] [217,218]
[221,222] [225,226] [229,230] [233,234] [237,238]
[241,242] [245,246] [249,250] [253,254]
Je vais donc choisir [13,14] (qui sont bien sur libres sur le réseau OpenVPN auquel je veux associer ce nouveauClient : 192.168.3.0/24) :
# cat << EOF > /etc/openvpn/ccd/nouveauClient
ifconfig-push 192.168.3.13 192.168.3.14
EOF
Noter ici que l'on utilise le nom du client "nouveauClient" et donc qu'il ne faut pas mettre d'extension à ce fichier, mais le nommer en accord avec votre nom de client
===== Finalisation =====
Tout devrait maintenant être en place pour nous permettre de tenter une connexion. Pour ce faire, sur votre client :
# service openvpn restart
Vous pouvez vérifier les logs coté client et serveur (dans /var/log/syslog) pour découvrir pourquoi si jamais la connexion échoue
===== Un peu plus loin =====
==== Utiliser le ccd pour passer moins de paramètres a certains clients ====
On peut utiliser le fichier ccd de chaque client pour lui ajouter des paramètres donnés par le serveur, mais on peut aussi dire au serveur de ne lui en donner que quelques-uns.
Par exemple si sur un des clients vous ne voulez pas qu'il ait la route vers un sous réseau interne définie dans la conf générale de votre serveur.
Il faut pour cela utiliser **push-reset** dans le fichier ccd qui flush ce qui va être envoyé du serveur vers ce client spécifique.
Cete directive fait néanmoins un peu trop le ménage et il faut donc lui redonner la route vers le sous réseau du serveur openvpn lui meme (ici 192.168.3.0/24), comme par exemple dans l'exemple suivant :
$ cat ccd/monClient
push-reset
push "route 192.168.3.0 255.255.255.0"
ifconfig-push 192.168.3.201 192.168.3.202
==== Relancer des services apres la connexion du client openvpn ====
Il peut être utile de (re)lancer un script et/ou des services une fois le client connecté, par exemple un service qui doit se binder sur l'ip VPN (monitoring nagios, munin, backup, ....)
Pour se faire:
* ajouter du contenu dans le fichier client.conf :
# cat << EOF >> /etc/openvpn/client.conf
# on ajoute un script de restart pour nrpe et munin-node
script-security 2
# run /etc/openvpn/up.sh when the connection is set up
up /etc/openvpn/up.sh
EOF
* créer notre script et le remplir, par exemple :
# cat << EOF > /etc/openvpn/up.sh
#!/bin/bash
#
# restart services so they can bind to VPN ip address
#
service munin-node restart
service nagios-nrpe-server restart
EOF
* rendre ce script exécutable :# chmod +x /etc/openvpn/up.sh
* Il ne reste plus qu'a relancer le client openvpn et attendre que la connexion s'établisse avant de regarder le resultat :
# service openvpn restart
Il va sans dire qu'il ne faut pas donner les droits de modifier ce script a n'importe qui étant donné qu'il sera lancé en root ;-)
===== Références =====
* http://openvpn.net/index.php/open-source/documentation/howto.html#policy
* https://community.openvpn.net/openvpn/ticket/29