Configurer un tunnel OpenVPN entre 2 serveurs

Introduction

OmniOSce ne dispose pas du script easy-rsa dans ses propres dépôts, néanmoins, on peut l'obtenir via le dépôt pkgsrc pour plus de commodité.
D'ordinaire on utilise easy-rsa pour des raisons de simplicité (c'est beaucoup plus casse-pied sans !)
Voici comment faire SANS easy-rsa.

Le but est de créer un tunnel VPN entre 2 serveurs sous OmniOSce
Nous allons rester simple ici et créer un tunnel entre 2 serveurs en frontal sur internet.
Au cas où vous souhaiteriez cacher votre serveur et votre client derrière des pare-feux, il ne faudra pas oublier de le DNAT (UDP 1194) sur le pare-feu abritant le serveur

Capture d'écran

Cette configuration est relativement délicate.. Je vous suggère de ne pas trop vous écarter de ce que je fais (sauf si vous êtes aguerris).
Tout au long la procédure, des passphrases devront être créées, je vous suggère de les stocker dans un keepass.. au moindre oubli, tout est foutu !

(Soyez root tout au long de la procédure, sur les 2 serveurs.)


ETAPE 1 - Installation sur les deux serveurs

Sur SERVEUR-OPENVPN et sur CLIENT-OPENVPN

(je considère la configuration IP déjà faîte)

Installer OpenVPN :

pkg install pkg://extra.omnios/ooce/network/openvpn

Régler le bon fuseau horaire sur les 2 serveurs (c'est fondamental !) :

pkg install ntpsec && /usr/bin/ntpdate 0.fr.pool.ntp.org && date && svcadm enable svc:/network/ntp:default

ETAPE 2 - Configuration du serveur

Sur SERVEUR-OPENVPN uniquement

Créer un répertoire pour les configurations et les clés et s'y rendre :

mkdir -p /etc/opt/ooce/openvpn/keys ; cd /etc/opt/ooce/openvpn/keys

Créer un fichier de configuration OpenSSL pour les certificats.
Ce fichier est très important car pour être valides lors du handshake, vos certificats devront être complets et avec extensions !
Vous devez d'abord changer les valeurs par défauts (countryName_default, stateOrProvinceName_default, localityName_default, organizationalUnitName_default, commonName_default, emailAddress_default - Ne touchez pas au reste !).

cat << EOF > /etc/opt/ooce/openvpn/keys/openssl.cnf
# openssl.cnf
[ req ]
distinguished_name = req_distinguished_name
x509_extensions = v3_ca
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = FR
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = VOTRE-REGION
localityName = Locality Name (eg, city)
localityName_default = VOTRE-VILLE
organizationName = Organization Name (eg, company)
organizationName_default = NOM-DE-LENTREPRISE
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = DEPARTEMENT-DE-LENTREPRISE
commonName = Common Name (eg, fully qualified host name)
commonName_default = CA-VPN
emailAddress = Email Address
emailAddress_default = admin@example.com
[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = CA:true
keyUsage = keyCertSign, cRLSign
[ v3_req ]
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
EOF

Créer notre Autorité de certification (CA)

A moins d'utiliser une autorité de certification reconnue sur internet ou venant d'un autre serveur (type AD), il va nous falloir créer la nôtre pour certifier à la fois notre serveur OpenVPN ainsi que notre CLIENT-OPENVPN.

Générer la clé privée :

openssl genpkey -algorithm RSA -out ca.key -aes256

(Vous créez ici une première passphrase - nous la désignerons sous 'PASS-01' pour la suite)

Créer la demande de signature du certificat (CSR) :

openssl req -new -x509 -key ca.key -sha256 -out ca.crt -days 3650 -config openssl.cnf

(Vous entrez ici 'PASS-01', créé avec la commande précédente)
(Vous n'êtes pas obligés de compléter les informations demandées puisque nous avons défini des valeurs par défaut dans le fichier openssl.cnf, tapez simplement ENTRER jusqu'au bout. N'entrez pas de passphrase finale !!)

Signer le certificat avec l'autorité de certification (CA) en utilisant les extensions :

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650 -sha256 -extensions v3_req -extfile openssl.cnf

(Vous entrez ici 'PASS-01', créé avec la commande précédente)


Créer un certificat pour notre serveur SERVEUR-OPENVPN

Générer la clé privée :

openssl genpkey -algorithm RSA -out server.key -aes256

(Vous créez ici une seconde passphrase - nous la désignerons sous 'PASS-02' pour la suite)

Créer la demande de signature de certificat (CSR) pour le serveur :

openssl req -new -key server.key -out server.csr -config openssl.cnf

(Vous entrez ici 'PASS-02', créé avec la commande précédente)
(Vous n'êtes pas obligés de modifier les informations par défaut proposées - celles entrées précedemment dans openssl.cnf, tapez simplement ENTRER jusqu'au bout)

Signer le certificat du serveur avec la CA :

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650 -sha256 -extensions v3_req -extfile openssl.cnf

(Ici, vous entrez 'PASS-01' !! Il faut la clé de notre Autorité de Certification pour certifier le certificat du serveur openvpn)

Envoyer votre clef 'PASS-02' dans un fichier (remplacez PASS-02 par la clef que vous aviez créée) :

echo 'PASS-02' > /etc/opt/ooce/openvpn/keys/passphrase.txt

(Je vous vois venir... ce n'est pas très sécure d'envoyer la passphrase en clair dans un fichier. Il y a plusieurs solutions à cela : utiliser des tokens, hashicorp vault, un module PAM, ssh-agent avec un wrapper script... Il vous faudra approfondir un peu pour avoir un truc vraiment solide !)


Sécurité

Générer les clés Diffie-Hellman :

openssl dhparam -out dh2048.pem 2048

Générer la clé HMAC pour renforcer la sécurité :

/opt/ooce/openvpn/sbin/openvpn --genkey secret ta.key

Configuration du serveur OpenVPN

Sauvegarder le fichier server.conf d'example :

mv /etc/opt/ooce/openvpn/server.conf /etc/opt/ooce/openvpn/server.conf.BAK

Créer et éditer le fichier de configuration du serveur OpenVPN :
(La seule chose que vous pouvez modifier ici, c'est le réseau de votre tunnel OpenVPN : 10.8.0.0 255.255.255.0)
Vous pouvez modifier le masque jusqu'à 255.255.255.240.. mais pas au-delà, ça ne fonctionnera pas)

cat << EOF > /etc/opt/ooce/openvpn/server.conf
port 1194
proto udp
dev tun
ca /etc/opt/ooce/openvpn/keys/ca.crt
cert /etc/opt/ooce/openvpn/keys/server.crt
key /etc/opt/ooce/openvpn/keys/server.key
dh /etc/opt/ooce/openvpn/keys/dh2048.pem
askpass /etc/opt/ooce/openvpn/keys/passphrase.txt
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
client-to-client
keepalive 10 120
tls-server
tls-auth /etc/opt/ooce/openvpn/keys/ta.key 0
key-direction 0
cipher AES-256-GCM
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
compress stub-v2
user nobody
group nogroup
persist-key
persist-tun
status /var/log/opt/ooce/openvpn/openvpn-status.log
log-append /var/log/opt/ooce/openvpn/server.log
verb 3
explicit-exit-notify 1
EOF

Démarrer le serveur OpenVPN :

svcadm enable openvpn:server

Vérifier l'état du service :

svcs openvpn:server

Le service doit être 'online'.


ETAPE 3 - Créer le certificat pour notre client

Sur SERVEUR-OPENVPN uniquement

Nous le créons directement depuis le serveur SERVEUR-OPENVPN pour gagner du temps (puisqu'il faut qu'il soit validé par notre autorité de certification), puis nous le transfèrerons sur CLIENT-OPENVPN.

Générer la clé privée du client :

cd /etc/opt/ooce/openvpn/keys ; openssl genpkey -algorithm RSA -out client1.key -aes256

(Vous créez ici une troisième passphrase - nous la désignerons sous 'PASS-03' pour la suite)

Créer la demande de signature de certificat (CSR) pour le client :

openssl req -new -key client1.key -out client1.csr -config openssl.cnf

(Vous entrez ici 'PASS-03', créé avec la commande précédente)
(Ici, vous pouvez modifier les informations par défaut proposées que nous avions entrées dans openssl.cnf puisqu'il s'agît d'éditer la demande de signature pour notre client... qui n'est donc logiquement pas au même endroit que le serveur ! - cela dit si vous ne modifiez rien aux choix par défaut, ça fonctionnera aussi)

Signer le certificat du client avec la CA :

openssl x509 -req -in client1.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client1.crt -days 3650 -sha256 -extensions v3_req -extfile openssl.cnf

(Vous entrez ici 'PASS-01' !!)

Le certificat de notre client CLIENT-OPENVPN est à présent validé par notre autorité de certification, nous pouvons donc l'envoyer sur CLIENT-OPENVPN et faire la configuration du CLIENT-OPENVPN.

Transférer les fichiers nécessaires depuis SERVEUR-OPENVPN vers CLIENT-OPENVPN :
(Utilisez la méthode que vous voulez, voici avec ssh au besoin : remplacez le USER par le nom d'un utilisateur sur CLIENT-OPENVPN)

scp /etc/opt/ooce/openvpn/keys/ca.crt /etc/opt/ooce/openvpn/keys/ta.key /etc/opt/ooce/openvpn/keys/client1.crt /etc/opt/ooce/openvpn/keys/client1.key USER@45.56.67.78:/tmp/

Configuration du client

Sur CLIENT-OPENVPN uniquement

Déplacer les fichiers transférés vers le dossier /etc/opt/ooce/openvpn/keys :

mkdir /etc/opt/ooce/openvpn/keys

mv /tmp/ca.crt /etc/opt/ooce/openvpn/keys/

mv /tmp/ta.key /etc/opt/ooce/openvpn/keys/

mv /tmp/client1.crt /etc/opt/ooce/openvpn/keys/

mv /tmp/client1.key /etc/opt/ooce/openvpn/keys/

Envoyer 'PASS-03' dans un fichier (remplacez PASS-03 par la clé que vous aviez créée) :

echo 'PASS-03' > /etc/opt/ooce/openvpn/keys/passphrase.txt

Sauvegarder le fichier client.conf d'example :

mv /etc/opt/ooce/openvpn/client.conf /etc/opt/ooce/openvpn/client.conf.BAK

Créer et éditer le fichier de configuration du CLIENT-OPENVPN :
La seule chose que vous devez modifier ici, c'est l'adresse IP de SERVEUR-OPENVPN. Ne touchez pas au reste !

cat << EOF > /etc/opt/ooce/openvpn/client.conf
client
dev tun
proto udp
remote 56.67.78.89 1194
resolv-retry infinite
nobind
float
persist-key
persist-tun
ca /etc/opt/ooce/openvpn/keys/ca.crt
cert /etc/opt/ooce/openvpn/keys/client1.crt
key /etc/opt/ooce/openvpn/keys/client1.key
askpass /etc/opt/ooce/openvpn/keys/passphrase.txt
remote-cert-tls server
tls-client
tls-auth /etc/opt/ooce/openvpn/keys/ta.key 1
key-direction 1
cipher AES-256-GCM
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
verb 3
EOF

Démarrer le client OpenVPN :

svcadm enable openvpn:client

Vérifier l'état du service :

svcs openvpn:client

Il doit être 'online'.

Vérifier les logs en direct :

tail -f /var/log/opt/ooce/openvpn/client.log

Vérifier la connexion :

ipadm | grep tun0

Effectuer un ping de CLIENT-OPENVPN vers SERVEUR-OPENVPN :

ping 10.8.0.1

Appliquer les permissions sur les fichiers

Sur CLIENT-OPENVPN uniquement

chmod 600 /etc/opt/ooce/openvpn/keys/passphrase.txt

chmod 644 /etc/opt/ooce/openvpn/keys/ca.crt

chmod 600 /etc/opt/ooce/openvpn/keys/ta.key

chmod 644 /etc/opt/ooce/openvpn/keys/client1.crt

chmod 600 /etc/opt/ooce/openvpn/keys/client1.key

Sur SERVEUR-OPENVPN uniquement

chmod 600 /etc/opt/ooce/openvpn/keys/ca.key

chmod 600 /etc/opt/ooce/openvpn/keys/server.key

chmod 644 /etc/opt/ooce/openvpn/keys/ca.crt

chmod 644 /etc/opt/ooce/openvpn/keys/server.crt

chmod 644 /etc/opt/ooce/openvpn/keys/dh2048.pem

chmod 600 /etc/opt/ooce/openvpn/keys/ta.key

chmod 600 /etc/opt/ooce/openvpn/keys/passphrase.txt


↑ Haut de page