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!