OpenVPN avec hiérarchie CA à deux niveaux

J'ai rĂ©cemment eu la tĂąche de crĂ©er une hiĂ©rarchie Ă  deux niveaux d'autoritĂ© de certification pour OpenVPN sur Debian. Plusieurs fois, j'ai eu la chance d'Ă©lever OpenVPN avec une autoritĂ© de certification et j'ai parfaitement compris comment cela devrait ĂȘtre en thĂ©orie avec deux CA, mais en pratique, j'ai Ă©tĂ© confrontĂ© au fait que je ne comprenais pas quoi et oĂč signer. Google ne m'a pas donnĂ© de rĂ©ponses adaptĂ©es Ă  Linux (ou je ne l'ai pas fait sur Google) et j'ai commencĂ© Ă  comprendre. Ci-dessous, j'ai fourni un manuel que j'ai compilĂ© dans le processus de crĂ©ation et de configuration.



Je tiens à noter tout de suite qu'ici je mets plus l'accent sur la configuration de l'autorité de certification que sur OpenVPN.



Avant de commencer, je vais dire Ă  quelqu'un qui peut l'utiliser avec mon exemple.



J'ai eu pour tùche de créer un systÚme pour une grande entreprise de telle sorte qu'une seule personne ait signé les certificats de serveur OpenVPN, il y a beaucoup de serveurs VPN, plusieurs serveurs VPN ont été installés pour chaque département. Il y a encore plus d'employés (clients) et de certificats de contrÎle (émettre / révoquer) chaque fois qu'un employé vient / quitte un trÚs lourd fardeau (sans parler des employés temporaires). Les employés de chaque service sont supervisés par le chef de service, qui délivre ou révoque les certificats pour les nouveaux / anciens employés, respectivement.



Pour quels certificats et clés numériques sont nécessaires, beaucoup a été dit et je ne répéterai pas les autres auteurs, mais en bref, alors:



  • pour vĂ©rifier la fiabilitĂ© (une "double prise de contact" se produit), le client et le serveur s'assurent de qui ils sont, s'ils peuvent se faire confiance et Ă©tablir une connexion;
  • cryptage / dĂ©cryptage;
  • exceptions «Homme au milieu (MITM)» pour s'assurer que quelqu'un n'intercepte pas les messages / trafic;
  • pour crĂ©er des mots de passe chiffrĂ©s, ce qui augmente la sĂ©curitĂ© et rend plus difficile l'accĂšs des attaquants Ă  l'hĂŽte.


Le principe de fonctionnement de la hiĂ©rarchie d'autoritĂ© de certification Ă  plusieurs niveaux est que l'autoritĂ© de certification de niveau supĂ©rieur (RootCA) signe son certificat pour elle-mĂȘme pendant une pĂ©riode de temps suffisamment longue (mais il s'agit d'une question purement individuelle), chaque prochain niveau infĂ©rieur dans la hiĂ©rarchie ou le service de l'autoritĂ© de certification signe ses certificats avec une autoritĂ© de certification supĂ©rieure (gĂ©nĂ©ralement bureaucratie) Ă  condition que le certificat de niveau infĂ©rieur ait une pĂ©riode de validitĂ© ne dĂ©passant pas la moitiĂ© de la pĂ©riode de validitĂ© du certificat de niveau supĂ©rieur.







Lors de la création d'une autorité de certification, deux fichiers sont créés: ca.crt - la clé publique et ca.key - la clé privée.

La clĂ© privĂ©e doit ĂȘtre protĂ©gĂ©e et ne doit pas ĂȘtre partagĂ©e avec des tiers.



Lorsque nous devons créer une autorité de certification subordonnée / signataire, nous créons une clé privée dessus et une demande de signature de RootCA.



Comment les ordinateurs et les utilisateurs du monde entier sauront-ils qu'ils peuvent faire confiance à un service ou à un site, demandez-vous? C'est simple (enfin, en théorie), la clé publique de l'autorité de certification (RootCA) est placée sur les ordinateurs de l'utilisateur et ces ordinateurs font confiance à tous les certificats émis par cette autorité de certification. Dans la pratique, c'est certainement plus difficile et pas cher. Mais au sein de votre propre entreprise, c'est assez facile à faire.



Pour la mise en Ɠuvre, nous avons besoin de trois serveurs. Dans ce tutoriel, nous utiliserons debian 9. Nous nommerons les serveurs en fonction de leur application: OpenVPN, SubCA, RootCA.



Toutes les actions sont effectuées sous l'utilisateur non root.



Pour ce faire, votre utilisateur doit ĂȘtre dans le groupe sudo.



Si sudo n'est pas installé sur le serveur, connectez-vous en tant que root:



# su - root
# apt-get install sudo -y
# usermod -aG sudo username
# exit


Nous installons les utilitaires nécessaires sur tous les serveurs (les utilitaires peuvent différer selon les croyances et les croyances, wget, ufw, vim sont obligatoires, car ici j'ai donné des commandes avec ces utilitaires):



# sudo apt-get update
# sudo apt-get upgrade
# sudo apt-get install wget curl net-tools ufw vim -y
# cd ~
# wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/EasyRSA-3.0.4.tgz
# tar xvf EasyRSA-3.0.4.tgz


Installez openvpn sur le serveur OpenVPN:



# sudo apt-get install openvpn -y


Accédez au serveur RootCA. Ici, nous devons créer un fichier à partir duquel easyrsa prendra les valeurs des variables:



# mv ~/EasyRSA-3.0.4 ~/easyrsa/
# cd ~/easyrsa/
# cp vars.example vars
# vim vars


Trouvez le bloc, supprimez # et remplacez nos valeurs. Afin de ne pas saisir nos données lors de la signature des certificats, nous les écrirons ici:



#set_var EASYRSA_REQ_COUNTRY	"US"
#set_var EASYRSA_REQ_PROVINCE	"California"
#set_var EASYRSA_REQ_CITY	"San Francisco"
#set_var EASYRSA_REQ_ORG	"Copyleft Certificate Co"
#set_var EASYRSA_REQ_EMAIL	"me@example.net"
#set_var EASYRSA_REQ_OU		"My Organizational Unit"


Ensuite, recherchez les paramÚtres suivants, supprimez # et modifiez leurs valeurs. Ces directives sont responsables de la durée de vie des certificats (la premiÚre concerne la durée de vie du certificat CA, la seconde est la durée de vie du certificat en cours de signature):



#set_var EASYRSA_CA_EXPIRE	3650         #-->  3650
#set_var EASYRSA_CERT_EXPIRE	3650         #-->  1825


Plus loin:



# ./easyrsa init-pki


L'exĂ©cution de la commande suivante demandera CN. Vous pouvez laisser la valeur par dĂ©faut, mais il est prĂ©fĂ©rable de saisir un nom d’identification de nom d’hĂŽte (RootCA). La valeur "nopass" signifie que vous n'avez pas besoin de crĂ©er un mot de passe:



# ./easyrsa build-ca nopass


AccĂ©dez au serveur SubCA et suivez les mĂȘmes Ă©tapes avec des modifications mineures:



# mv ~/EasyRSA-3.0.4 ~/easyrsa/
# cd ~/easyrsa/
# cp vars.example vars
# vim vars


Trouvez le bloc, supprimez # et remplacez nos valeurs:



#set_var EASYRSA_REQ_COUNTRY	"US"
#set_var EASYRSA_REQ_PROVINCE	"California"
#set_var EASYRSA_REQ_CITY	"San Francisco"
#set_var EASYRSA_REQ_ORG	"Copyleft Certificate Co"
#set_var EASYRSA_REQ_EMAIL	"me@example.net"
#set_var EASYRSA_REQ_OU		"My Organizational Unit"


Ensuite, nous trouvons les paramĂštres suivants, supprimons # et modifions leurs valeurs:



#set_var EASYRSA_CA_EXPIRE	3650         #-->  1825
#set_var EASYRSA_CERT_EXPIRE	3650         #-->  365


Plus loin:



# ./easyrsa init-pki


L'exécution de la commande suivante demandera CN. Vous pouvez laisser la valeur par défaut, mais il est préférable de saisir un nom d'identifiant d'hÎte (SubCA). La valeur "subca" signifie que nous créons une autorité de certification subordonnée et que nous devons créer une demande de signature de certificat:



# ./easyrsa build-ca subca nopass


Ensuite, nous trouvons le fichier ~ / easyrsa / pki / reqs / ca.req (c'est la requĂȘte mĂȘme) et le transfĂ©rons sur le serveur RootCA (vous pouvez utiliser deux mĂ©thodes: WinSCP et scp):



# scp ~/easyrsa/pki/reqs/ca.req user@ip_RootCA:/tmp


AccĂ©dez au serveur RootCA et signez la demande. Avant de signer la demande, nous devons l'importer dans le rĂ©pertoire de travail. pour signer le certificat de l'autoritĂ© de certification subordonnĂ©e, nous utilisons l'attribut «ca» et le nom du certificat (vous pouvez l'appeler ca, mais pour ne pas ĂȘtre confus, nous l'appellerons le nom du serveur auquel nous le signons, et lorsque nous le transfĂ©rons sur le serveur, nous le renommerons):



# cd ~/easyrsa/
# ./easyrsa import-req /tmp/ca.req SubCA
# ./easyrsa sign-req ca SubCA


Une confirmation vous sera demandée, vous devez entrer "oui".

Nous renvoyons le certificat signé SubCA.



# scp ~/easyrsa/pki/issued/SubCA.crt user@ip_SubCA:/tmp


Accédez au serveur SubCA et déplacez le certificat vers le répertoire de travail easyrsa:



# mv /tmp/SubCA.crt ~/easyrsa/pki/ca.crt


À ce stade, nous avons dĂ©jĂ  une autoritĂ© de certification racine et une autoritĂ© de certification secondaire racine signĂ©e.

Passons maintenant au serveur OpenVPN. Dans sa configuration, certaines des étapes précédentes sont répétées. Accédez au serveur OpenVPN.



# cd ~/easyrsa/
# ./easyrsa init-pki


Commençons maintenant à créer des certificats pour la signature. Nous allons créer une clé Diffie-Hellman (dh.pem / dh2048.pem / dh1024.pem) à utiliser dans l'échange de clés et créer une signature HMAC (ta.key) pour améliorer la fonction de contrÎle d'intégrité TLS.



Nous signerons des certificats pour le serveur OpenVPN sur RootCA, et nous signerons des certificats pour les utilisateurs sur SubCA. Créez immédiatement un répertoire dans lequel nous ajouterons des clés, des certificats et des configurations client.



# mkdir -p ~/client-configs/files/
# mkdir ~/client-configs/keys/
# chmod 700 ~/client-configs/
# sudo mkdir /etc/openvpn/vpnsrv1/

# ./easyrsa gen-req vpnsrv1 nopass
# ./easyrsa gen-req dumasti nopass
# ./easyrsa gen-dh
# sudo openvpn --genkey --secret ta.key
# cp /home/dumasti/easyrsa/pki/private/dumasti.key ~/client-configs/keys/
# sudo cp /home/dumasti/easyrsa/pki/dh.pem /etc/openvpn/vpnsrv1/
# sudo cp /home/dumasti/easyrsa/ta.key /etc/openvpn/vpnsrv1/
# sudo cp /home/dumasti/easyrsa/ta.key ~/client-configs/keys/
# sudo cp /home/dumasti/easyrsa/pki/private/vpnsrv1.key /etc/openvpn/vpnsrv1/
# scp ~/easyrsa/pki/reqs/vpnsrv1.req user@ip_RootCA:/tmp
# scp ~/easyrsa/pki/reqs/dumasti.req user@ip_SubCA:/tmp


Accédez au serveur RootCA et signez le certificat. Pour signer le certificat pour le serveur, nous utilisons l'attribut "serveur", pour le client "client":



# cd ~/easyrsa/
# ./easyrsa import-req /tmp/vpnsrv1.req vpnsrv1
# ./easyrsa sign-req server vpnsrv1


Une confirmation vous sera demandée, vous devez entrer "oui".



# scp ~/easyrsa/pki/issued/vpnsrv1.crt user@ip_OpenVPN:/tmp
# scp ~/easyrsa/pki/ca.crt user@ip_OpenVPN:/tmp/RootCA.crt


Accédez au serveur SubCA et signez le certificat:



# cd ~/easyrsa/
# ./easyrsa import-req /tmp/dumasti.req dumasti
# ./easyrsa sign-req client dumasti


Une confirmation vous sera demandée, vous devez entrer "oui".



# scp ~/easyrsa/pki/issued/dumasti.crt user@ip_OpenVPN:/tmp
# scp ~/easyrsa/pki/ca.crt user@ip_OpenVPN:/tmp/SubCA.crt


Nous retournons sur le serveur OpenVPN et transférons les certificats signés vers les répertoires requis:



# cd /tmp


Pour que le serveur OpenVPN accepte les clés client, nous devons combiner les clés publiques du client et de l'autorité de certification subordonnée / signataire dans un seul fichier:



# cat dumasti.crt SubCA.crt > ~/client-configs/keys/dumasti.crt
# cp /tmp/RootCA.crt ~/client-configs/keys/ca.crt
# sudo mv /tmp/RootCA.crt /etc/openvpn/vpnsrv1/
# sudo mv /tmp/vpnsrv1.crt /etc/openvpn/vpnsrv1/


Nous avons maintenant toutes les certifications requises aux bons endroits. Il reste à créer la configuration du serveur et du client OpenVPN (chacun peut avoir ses propres croyances et vues en la matiÚre, mais par exemple, il y aura la configuration suivante).



Vous pouvez utiliser le modĂšle de configuration du serveur et du client et modifier vous-mĂȘme:



# sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
# sudo gzip -d /etc/openvpn/server.conf.gz
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf


Mais ci-dessous, je vais donner le contenu des fichiers de configuration prĂȘts Ă  l'emploi (symboles; et # commenter la ligne):



# sudo cat /etc/openvpn/vpnsrv1.conf

port 1194
proto udp
dev tun
ca vpnsrv1/RootCA.crt
cert vpnsrv1/vpnsrv1.crt
key vpnsrv1/vpnsrv1.key
dh vpnsrv1/dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
;client-config-dir ccd
;client-config-dir ccd
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
client-to-client
;duplicate-cn
keepalive 10 120
tls-auth vpnsrv1/ta.key 0
key-direction 0
cipher AES-256-CBC
auth SHA256
max-clients 100
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
;mute 20
explicit-exit-notify 1

# cat ~/client-configs/base.conf

client
dev tun
proto udp
remote your_server_ip 1194
;remote my-server-2 1194
;remote-random
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
remote-cert-tls server
;tls-auth ta.key 1
cipher AES-256-CBC
auth SHA256
key-direction 1
verb 3
;mute 20
# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf


Nous devons Ă©galement configurer le pare-feu et le transfert de paquets. Il est possible de configurer iptables, mais ici nous allons regarder ufw.



Tout d'abord, découvrons le nom de notre interface:



# ip addr 


Ouvrons les ports suivants (j'ai ssh sur le port 22 et openvpn sur 1194, si vous en avez d'autres, agissez en conséquence):



# sudo ufw allow 1194
# sudo ufw allow 22


Ensuite, ouvrez le fichier de configuration ufw et collez-y ce qui suit avant le début de la chaßne de filtres (remplacez mes valeurs par les vÎtres):



# sudo vim /etc/ufw/before.rules

# START OPENVPN RULES

# NAT table rules

*nat

:POSTROUTING ACCEPT [0:0]

# Allow traffic from OpenVPN client to eth0 (change to the interface you discovered!)

-A POSTROUTING -s 10.8.0.0/8 -o ens192 -j MASQUERADE

COMMIT

# END OPENVPN RULES


Avant ça:



# Don't delete these required lines, otherwise there will be errors
*filter


Vous devez activer le transfert UFW des paquets par défaut. Recherchez la ligne requise et remplacez la valeur "DROP" par "ACCEPT":



# sudo vim /etc/default/ufw

DEFAULT_FORWARD_POLICY="ACCEPT"


Configurez le transfert de paquets. Trouvez la ligne # net.ipv4.ip_forward = 0 ou # net.ipv4.ip_forward = 1, supprimez #, si la valeur est 0, changez-la en 1:



# sudo vim /etc/sysctl.conf

net.ipv4.ip_forward=1

# sudo sysctl -p
# sudo ufw enable


Ensuite, nous lançons notre VPN:



# sudo systemctl start openvpn@vpnsrv1


VĂ©rification du lancement:



# ip addr


Il devrait y avoir une nouvelle interface réseau tun0 avec ip 10.8.0.1



# sudo systemctl status openvpn@vpnsrv1


Si vous avez besoin que le VPN démarre seul aprÚs le redémarrage, ajoutez le service à l'exécution automatique:



# sudo systemctl enable openvpn@vpnsrv1


Ensuite, nous créons une configuration client. Auparavant, nous avons placé toutes les clés et certificats dans le répertoire ~ / client-configs / keys /.



Créons un script qui rassemblera la configuration, les clés et les certificats dans un seul fichier user.ovpn:



# cd ~/client-configs/
# vim configs-maker.sh

#!/bin/bash
# First argument: Client identifier
KEY_DIR=/home/dumasti/client-configs/keys
OUTPUT_DIR=/home/dumasti/client-configs/files
BASE_CONFIG=/home/dumasti/client-configs/base.conf
cat ${BASE_CONFIG} \
	<(echo -e '<ca>') \
	${KEY_DIR}/ca.crt \
	<(echo -e '</ca>\n<cert>') \
	${KEY_DIR}/${1}.crt \
	<(echo -e '</cert>\n<key>') \
	${KEY_DIR}/${1}.key \
	<(echo -e '</key>\n<tls-auth>') \
	${KEY_DIR}/ta.key \
	<(echo -e '</tls-auth>') \
	> ${OUTPUT_DIR}/${1}.ovpn


Ce script prendra les fichiers avec le nom que vous lui donnez au démarrage et configurera un fichier dans le répertoire des fichiers.



Rendons le fichier exécutable:



# chmod +x configs-maker.sh


Lançons-le:



# sudo ./configs-maker.sh dumasti


Nous transférons maintenant la configuration du client sur votre ordinateur à partir du répertoire / home / dumasti / client-configs / files /



Run VPN.



Pour des raisons de sĂ©curitĂ©, les serveurs hĂ©bergeant l'autoritĂ© de certification doivent ĂȘtre dĂ©sactivĂ©s et activĂ©s uniquement pour la signature de certificats.



Nous n'ignorerons pas la révocation des certificats. Afin de révoquer le certificat, nous allons sur le serveur CA sur lequel le certificat a été signé et faisons ce qui suit (par exemple, nous révoquerons le certificat utilisateur (dumasti) que nous avons signé sur le serveur SubCA). Nous allons sur le serveur SubCA:



# cd ~/easyrsa/
# ./easyrsa revoke dumasti


Il vous sera demandé de confirmer la révocation, entrez «oui»



# ./easyrsa gen-crl


Le fichier crl.pem a été généré. Nous devons le placer sur le serveur OpenVPN et ajouter la directive et le chemin d'accÚs au fichier dans la configuration du serveur:



# scp ~/easyrsa/pki/crl.pem user@ip_OpenVPN:/tmp


Accédez au serveur OpenVPN:



# sudo mv /tmp/crl.pem /etc/openvpn/vpnsrv1/
# sudo vim /etc/openvpn/vpnsrv1.conf


Ajoutez la ligne suivante oĂč les clĂ©s et les certificats sont Ă©crits:



crl-verify vpnsrv1/crl.pem


Redémarrez openvpn:



# sudo systemctl restart openvpn@vpnsrv1


DĂ©sormais, le client dumasti ne pourra pas se connecter au VPN.



Merci de votre attention!



All Articles