Définition du problème
Cet article décrit l'organisation de l'accès à distance des employés utilisant des produits open source et peut être utilisée tant pour la construction d'un système entièrement autonome que pour s'avérer utile pour une extension lorsque des licences dans un système commercial existant viennent à manquer ou que ses performances sont insuffisantes.
L'objectif de l'article est de mettre en place un système complet de fourniture d'accès à distance pour l'organisation, qui est un peu plus qu'une « installation d'OpenVPN en 10 minutes ».
En conséquence, nous obtiendrons un système dans lequel des certificats seront utilisés pour l'authentification des utilisateurs et (facultativement) un annuaire corporate Active Directory. Ainsi, nous aurons un système à deux facteurs de vérification — ce que l'on a (le certificat) et ce que l'on sait (le mot de passe).
Un signe indiquant qu'un utilisateur est autorisé à se connecter est son appartenance au groupe myVPNUsr. Une autorité de certification autonome sera utilisée.
Le coût de mise en œuvre de la solution est uniquement de petites ressources matérielles et 1 heure de travail d'un administrateur système.
Nous allons utiliser une machine virtuelle avec OpenVPN et Easy-RSA version 3 sur CentOS 7, qui, sur la base de 100 connexions, a 4 vCPU et 4 Go de RAM.
Dans cet exemple, le réseau de notre organisation est 172.16.0.0/16, où le serveur VPN avec l'adresse 172.16.19.123 est situé dans le segment 172.16.19.0/24, les serveurs DNS 172.16.16.16 et 172.16.17.17, et un sous-réseau 172.16.20.0/23 est attribué aux clients VPN.
Pour les connexions externes, nous utilisons la connexion sur le port 1194/udp, et un enregistrement A a été créé dans le DNS pour notre serveur gw.abc.ru.
Il est catégoriquement déconseillé de désactiver SELinux ! OpenVPN fonctionne sans désactiver les politiques de sécurité.
Contenu
Installation du système d'exploitation et du logiciel applicatif
Nous utilisons la distribution CentOS 7.8.2003. Nous avons besoin d'une installation du système d'exploitation dans une configuration minimale. Il est pratique de le faire avec l'utilisation de , du clonage d'une image de système d'exploitation déjà installée et d'autres moyens.
Après l'installation, l'attribution d'une adresse à l'interface réseau (selon les conditions du travail 172.16.19.123), nous réalisons la mise à jour de l'OS :
$ sudo yum update -y && reboot
Il est également nécessaire de s'assurer que notre machine effectue la synchronisation de l'heure.
Pour installer le logiciel applicatif, nous avons besoin des paquets openvpn, openvpn-auth-ldap, easy-rsa et vim comme éditeur principal (le dépôt EPEL sera nécessaire).
$ sudo yum install epel-release
$ sudo yum install openvpn openvpn-auth-ldap easy-rsa vim
Pour la machine virtuelle, il est utile d'installer l'agent invité :
$ sudo yum install open-vm-toolspour les hôtes VMware ESXi, ou pour oVirt
$ sudo yum install ovirt-guest-agent
Configuration de la cryptographie
Passons au répertoire easy-rsa :
$ cd /usr/share/easy-rsa/3/Créons le fichier de variables :
$ sudo vim varsavec le contenu suivant :
export KEY_COUNTRY="FR"
export KEY_PROVINCE="MyRegion"
export KEY_CITY="MyCity"
export KEY_ORG="ABC LLC"
export KEY_EMAIL="admin@abc.fr"
export KEY_CN="allUsers"
export KEY_OU="allUsers"
export KEY_NAME="gw.abc.fr"
export KEY_ALTNAMES="abc-openvpn-server"
export EASYRSA_CERT_EXPIRE=3652
Ici, les paramètres pour l'organisation fictive LLC « ABC » peuvent être corrigés pour des valeurs réelles ou laissés tel quel. Le plus important dans les paramètres est la dernière ligne, qui définit la durée de vie du certificat en jours. Dans l'exemple, la valeur de 10 ans a été utilisée (365*10+2 années bissextiles). Cette valeur devra être ajustée avant l'émission des certificats des utilisateurs.
Nous configurons ensuite un centre de certification autonome.
La configuration inclut l'exportation des variables, l'initialisation de l'AC, l'émission de la clé racine et du certificat AC, la clé Diffie-Hellman, la clé TLS, ainsi que la clé et le certificat du serveur. La clé du centre de certification doit être soigneusement protégée et gardée secrète ! Tous les paramètres des requêtes peuvent rester par défaut.
cd /usr/share/easy-rsa/3/
. ./vars
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-dh
./easyrsa gen-req myvpngw nopass
./easyrsa sign-req server myvpngw
./easyrsa gen-crl
openvpn --genkey --secret pki/ta.key
À ce stade, la configuration principale du mécanisme cryptographique est terminée.
Configuration d'OpenVPN
Passons au répertoire OpenVPN, créons les répertoires de service et ajoutons un lien vers easy-rsa :
cd /etc/openvpn/
mkdir /var/log/openvpn/ /etc/openvpn/ccd /usr/share/easy-rsa/3/client
ln -s /usr/share/easy-rsa/3/pki/ /etc/openvpn/
Créons le fichier de configuration principal d'OpenVPN :
$ sudo vim server.confavec le contenu suivant
port 1194
proto udp
dev tun
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/myvpngw.crt
key /etc/openvpn/pki/private/myvpngw.key
crl-verify /etc/openvpn/pki/crl.pem
dh /etc/openvpn/pki/dh.pem
server 172.16.20.0 255.255.254.0
ifconfig-pool-persist ipp.txt
push "route 172.16.0.0 255.255.255.0"
push "route 172.17.0.0 255.255.255.0"
client-config-dir ccd
push "dhcp-option DNS 172.16.16.16"
push "dhcp-option DNS 172.16.17.17"
keepalive 10 120
cipher AES-256-CBC
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
explicit-exit-notify 1
username-as-common-name
plugin /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so /etc/openvpn/ldap.conf
Quelques remarques sur les paramètres :
- si un autre nom a été spécifié lors de l'émission du certificat — indiquez-le ;
- indiquez le pool d'adresses selon vos besoins* ;
- les routes et serveurs DNS peuvent être un ou plusieurs ;
- Les 2 dernières lignes sont nécessaires pour mettre en œuvre l'authentification dans AD.
*La plage d'adresses choisie dans l'exemple permettra de se connecter simultanément à 127 clients, car un réseau /23 a été choisi, et OpenVPN crée un sous-réseau /30 pour chaque client.
Si nécessaire, le port et le protocole peuvent être modifiés, mais il convient de garder à l'esprit que changer le numéro de port nécessitera la configuration de SELinux, et l'utilisation du protocole TCP augmentera les coûts, car la vérification de la livraison des paquets TCP est déjà effectuée au niveau des paquets encapsulés dans le tunnel.
**Si l'authentification dans AD n'est pas nécessaire, commentez-les, passez à la section suivante et dans le modèle supprimez la ligne auth-user-pass..
Authentification dans AD
Pour supporter le second facteur, nous allons utiliser la vérification du compte dans AD.
Nous avons besoin d'un compte dans le domaine avec des droits d'utilisateur standard et d'un groupe, dont l'adhésion déterminera la possibilité de connexion.
Créons un fichier de configuration :
/etc/openvpn/ldap.confavec le contenu suivant
URL "ldap://ldap.abc.ru"
BindDN "CN=bindUsr,CN=Users,DC=abc,DC=ru"
Password b1ndP@SS
Timeout 15
TLSEnable no
FollowReferrals yes
BaseDN "OU=allUsr,DC=abc,DC=ru"
SearchFilter "(sAMAccountName=%u)"
RequireGroup true
BaseDN "OU=myGrp,DC=abc,DC=ru"
SearchFilter "(cn=myVPNUsr)"
MemberAttribute "member"
Paramètres principaux :
- URL «ldap://ldap.abc.ru» — adresse du contrôleur de domaine ;
- BindDN «CN=bindUsr,CN=Users,DC=abc,DC=ru» — nom canonique pour la liaison à LDAP (Util. — bindUsr dans le conteneur abc.ru/Users) ;
- Password b1ndP@SS — mot de passe de l'utilisateur pour la liaison ;
- BaseDN «OU=allUsr,DC=abc,DC=ru» — chemin à partir duquel commencer la recherche d'utilisateur ;
- BaseDN «OU=myGrp,DC=abc,DC=ru» — conteneur du groupe autorisé (groupe myVPNUsr dans le conteneur abc.rumyGrp) ;
- SearchFilter "(cn=myVPNUsr)" — nom du groupe autorisé.
Lancement et diagnostic
Nous pouvons maintenant essayer d'activer et de lancer notre serveur :
$ sudo systemctl enable openvpn@server.service
$ sudo systemctl start openvpn@server.service
Vérification du démarrage :
systemctl status openvpn@server.service
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log
Émission et révocation de certificat
Comme les certificats, des clés et d'autres paramètres sont également nécessaires, il est très pratique de tout envelopper dans un seul fichier de profil. Ce fichier est ensuite transmis à l'utilisateur et le profil est importé sur le client OpenVPN. Pour cela, créons un modèle de paramètres et un script qui forme le profil.
Le profil doit contenir le contenu des fichiers du certificat racine (ca.crt) et de la clé TLS (ta.key).
Avant de délivrer les certificats utilisateurs n'oubliez pas de définir la durée de validité des certificats dans le fichier de paramètres. Il ne faut pas le rendre trop long, je recommande de le limiter à un maximum de 180 jours.
vim /usr/share/easy-rsa/3/vars...
export EASYRSA_CERT_EXPIRE=180
vim /usr/share/easy-rsa/3/client/template.ovpnclient
dev tun
proto udp
remote gw.abc.ru 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
verb 3
auth-user-pass
-----BEGIN CERTIFICATE-----
PUT YOUR CA CERT (ca.crt) HERE
-----END CERTIFICATE-----
key-direction 1
-----BEGIN OpenVPN Static key V1-----
PUT YOUR TA KEY (ta.key) HERE
-----END OpenVPN Static key V1-----
Remarques :
- lignes PUT YOUR… remplacer par le contenu de vos certificats;
- dans la directive remote, indiquez le nom/l'adresse de votre passerelle;
- la directive auth-user-pass est utilisée pour une authentification externe supplémentaire.
Dans le répertoire personnel (ou à un autre endroit pratique), créons un script pour demander un certificat et créer un profil :
vim ~/make.profile.sh#!/bin/bash
if [ -z "$1" ] ; then
echo Missing mandatory client name. Usage: $0 vpn-username
exit 1
fi
#Set variables
basepath=/usr/share/easy-rsa/3
clntpath=$basepath/client
privpath=$basepath/pki/private
certpath=$basepath/pki/issued
profile=$clntpath/$1.ovpn
#Get current year and lowercase client name
year=`date +%F`
client=${1,,}
echo Processing $year year cert for user/device $client
cd $basepath
if [ -f client/$client* ]; then
echo "*** ERROR! ***"
echo "Certificate $client already issued!"
echo "*** ERROR! ***"
exit 1
fi
. ./vars
./easyrsa --batch --req-cn=$client gen-req $client nopass
./easyrsa --batch sign-req client $client
#Make profile
cp $clntpath/template.ovpn $profile
echo "<key>" >> $profile
cat $privpath/$1.key >> $profile
echo "</key>" >> $profile
echo -e "n" >> $profile
openssl x509 -in $certpath/$1.crt -out $basepath/$1.crt
echo "<cert>" >> $profile
cat $basepath/$1.crt >> $profile
echo "</cert>" >> $profile
echo -e "n" >> $profile
#remove tmp file
rm -f $basepath/$1.crt
echo Complete. See $profile file.
cd ~
Rendons le fichier exécutable :
chmod a+x ~/make.profile.shEt nous pouvons délivrer notre premier certificat.
~/make.profile.sh my-first-userRévocation
En cas de compromission du certificat (perte, vol), il est nécessaire de révoquer ce certificat :
cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl
Visualisation des certificats délivrés et révoqués
Pour visualiser les certificats délivrés et révoqués, il suffit de consulter le fichier index :
cd /usr/share/easy-rsa/3/
cat pki/index.txt
Explications :
- la première ligne contient le certificat du serveur ;
- le premier caractère
- V (Valid) — valide ;
- R (Revoked) — révoqué.
Configuration du réseau
Les dernières étapes — configuration du réseau de transmission — routage et pare-feu.
Autoriser les connexions dans le pare-feu local :
$ sudo firewall-cmd --add-service=openvpn
$ sudo firewall-cmd --add-service=openvpn --permanent
Ensuite, activons le routage du trafic IP :
$ sudo sysctl net.ipv4.ip_forward=1
$ sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/50-sysctl.conf
Dans un environnement d'entreprise, il y a sûrement une division en sous-réseaux et nous devons indiquer au(x) routeur(s) comment envoyer des paquets destinés à nos clients VPN. Dans la ligne de commande, nous exécutons une commande à la manière de (cela dépend du matériel utilisé) :
# ip route 172.16.20.0 255.255.254.0 172.16.19.123et enregistrons la configuration.
En outre, sur l'interface du routeur frontal, où l'adresse externe gw.abc.ru est desservie, il est nécessaire d'autoriser le passage des paquets udp/1194.
En cas de règles de sécurité strictes au sein de l'organisation, il est également nécessaire de configurer un pare-feu sur notre serveur VPN. À mon avis, la configuration des chaînes FORWARD avec iptables offre la plus grande flexibilité, bien que leur configuration soit moins pratique. Un peu plus de détails sur leur configuration. Pour cela, il est plus facile d'utiliser des « règles directes » — direct rules, stockées dans un fichier. /etc/firewalld/direct.xml. La configuration actuelle des règles peut être consultée comme suit :
$ sudo firewall-cmd --direct --get-all-ruleAvant de modifier le fichier, faites-en une sauvegarde :
cp /etc/firewalld/direct.xml /etc/firewalld/direct.xml.`date +%F.%T`.bakLe contenu approximatif du fichier est le suivant :
-i tun0 -o ens192 -p udp --dport 53 -j ACCEPT
-i tun0 -o eth0 -p tcp -d 172.16.19.200 --dport 80 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-i tun0 -o eth0 -p tcp -d 172.16.19.201 --dport 443 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-i tun0 -o eth0 -p udp -d 172.16.19.100 --dport 7000 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-i tun0 -o eth0 -j LOG --log-prefix 'forward_fw '
Explications
Ce sont essentiellement des règles iptables ordinaires, autrement emballées depuis l'apparition de firewalld.
L'interface de destination par défaut est tun0, et l'interface externe pour le tunnel peut être différente, par exemple, ens192, selon la plateforme utilisée.
La dernière ligne est destinée à journaliser les paquets rejetés. Pour que la journalisation fonctionne, il faut changer le niveau de débogage dans la configuration de firewalld :
vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2
L'application des paramètres se fait par la commande standard de firewalld pour relire les configurations :
$ sudo firewall-cmd --reloadLes paquets rejetés peuvent être consultés de cette manière :
grep forward_fw /var/log/messages
Que faire ensuite
Voilà, la configuration est terminée !
Il ne reste plus qu'à installer le logiciel client côté client, importer le profil et se connecter. Pour les systèmes Windows, le package est disponible sur .
Enfin, connectons notre nouveau serveur aux systèmes de surveillance et d'archivage, et n'oublions pas de mettre à jour régulièrement.
Bonne connexion !
Source : habr.com
