Organisation du travail à distance pour les entreprises SMB avec OpenVPN

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

  1. Installation du système d'exploitation et du logiciel applicatif
  2. Configuration de la cryptographie
  3. Configuration d'OpenVPN
  4. Authentification dans AD
  5. Lancement et diagnostic
  6. Émission et révocation de certificat
  7. Configuration du réseau
  8. Que faire ensuite

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 kickstart, 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-tools

pour 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 vars

avec 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.conf

avec 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.conf

avec 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.ovpn

client
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.sh

Et nous pouvons délivrer notre premier certificat.

~/make.profile.sh my-first-user

Ré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.123

et 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-rule

Avant de modifier le fichier, faites-en une sauvegarde :

cp /etc/firewalld/direct.xml /etc/firewalld/direct.xml.`date +%F.%T`.bak

Le 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 --reload

Les 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 le site du développeur.

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

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster