-
Configurer un tunnel OpenVPN entre 2 serveurs
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 clientderrière des pare-feux, il ne faudra pas oublier de le DNAT (UDP 1194) sur le pare-feu abritant le serveurCette 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
### Sur SERVEUR-OPENVPN et sur CLIENT-OPENVPN :
(je considère la configuration IP déjà faîte)
- Installer OpenVPNpkg 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
### 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 !
Aussi, vous devez d'abord changer les valeurs par défauts indiquées ici en rouge (dans les champs :
countryName_default, stateOrProvinceName_default, localityName_default, organizationalUnitName_default, commonName_default, emailAddress_default - Ne touchez pas au reste !).
Une fois modifié, copiez/collez le bloc tout entier pour créer le fichier.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éeopenssl 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 extensionsopenssl 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éeopenssl 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 (/etc/opt/ooce/openvpn/server.conf) :
(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)
Ne touchez pas au reste de la configuration, puis copiez/collez le bloc entier pour créer le fichier.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
### Sur SERVEUR-OPENVPN uniquement :Créer le certificat pour notre client CLIENT-OPENVPN
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/
### 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
Une fois que tout est bon, n'oubliez pas d'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
Tags : vpn, openvpn, omnios
-
Commentaires