Organisation du travail à distance d'une organisation SMB sur OpenVPN

Formulation du problème

L'article décrit l'organisation de l'accès à distance pour les employés aux produits open source et peut être utilisé à la fois pour construire un système complètement autonome, et sera utile pour une expansion en cas de pénurie de licences dans le système commercial existant ou si ses performances sont insuffisantes.

L’objectif de l’article est de mettre en œuvre un système complet permettant de fournir un accès à distance à une organisation, ce qui ne représente guère plus que « installer OpenVPN en 10 minutes ».

En conséquence, nous obtiendrons un système dans lequel les certificats et (éventuellement) l'Active Directory de l'entreprise seront utilisés pour authentifier les utilisateurs. Que. nous obtiendrons un système avec deux facteurs de vérification : ce que j'ai (certificat) et ce que je sais (mot de passe).

Un signe qu'un utilisateur est autorisé à se connecter est son appartenance au groupe myVPNUsr. L'autorité de certification sera utilisée hors ligne.

Le coût de mise en œuvre de la solution ne représente que de petites ressources matérielles et 1 heure de travail de l'administrateur système.

Nous utiliserons une machine virtuelle avec OpenVPN et Easy-RSA version 3 sur CetntOS 7, à laquelle sont alloués 100 vCPU et 4 Go de RAM pour 4 connexions.

Dans l'exemple, le réseau de notre organisation est 172.16.0.0/16, dans lequel le serveur VPN avec l'adresse 172.16.19.123 se trouve dans le segment 172.16.19.0/24, les serveurs DNS 172.16.16.16 et 172.16.17.17 et le sous-réseau 172.16.20.0. .23/XNUMX est alloué aux clients VPN.

Pour se connecter de l'extérieur, une connexion via le port 1194/udp est utilisée et un enregistrement A gw.abc.ru a été créé dans le DNS pour notre serveur.

Il est strictement déconseillé de désactiver SELinux ! OpenVPN fonctionne sans désactiver les politiques de sécurité.

Teneur

  1. Installation du système d'exploitation et des logiciels d'application
  2. Mise en place de la cryptographie
  3. Configuration d'OpenVPN
  4. Authentification AD
  5. Démarrage et diagnostic
  6. Émission et révocation du certificat
  7. Configuration du réseau
  8. Quelle est la prochaine

Installation du système d'exploitation et des logiciels d'application

Nous utilisons la distribution CentOS 7.8.2003. Nous devons installer le système d'exploitation dans une configuration minimale. Il est pratique de le faire en utilisant kickstart, clonage d'une image du système d'exploitation précédemment installée et d'autres moyens.

Après installation, en attribuant une adresse à l'interface réseau (selon les termes de la tâche 172.16.19.123), nous mettons à jour l'OS :

$ sudo yum update -y && reboot

Nous devons également nous assurer que la synchronisation de l'heure est effectuée sur notre machine.
Pour installer le logiciel d'application, vous avez besoin des packages openvpn, openvpn-auth-ldap, easy-rsa et vim comme éditeur principal (vous aurez besoin du référentiel EPEL).

$ sudo yum install epel-release
$ sudo yum install openvpn openvpn-auth-ldap easy-rsa vim

Il est utile d'installer un agent invité pour une machine virtuelle :

$ sudo yum install open-vm-tools

pour les hôtes VMware ESXi ou pour oVirt

$ sudo yum install ovirt-guest-agent

Mise en place de la cryptographie

Accédez au répertoire easy-rsa :

$ cd /usr/share/easy-rsa/3/

Créez un fichier de variables :

$ sudo vim vars

le contenu suivant:

export KEY_COUNTRY="RU"
export KEY_PROVINCE="MyRegion"
export KEY_CITY="MyCity"
export KEY_ORG="ABC LLC"
export KEY_EMAIL="[email protected]"
export KEY_CN="allUsers"
export KEY_OU="allUsers"
export KEY_NAME="gw.abc.ru"
export KEY_ALTNAMES="abc-openvpn-server"
export EASYRSA_CERT_EXPIRE=3652

Les paramètres de l'organisation conditionnelle ABC LLC sont décrits ici, vous pouvez les corriger par les réels ou les laisser de l'exemple. La chose la plus importante dans les paramètres est la dernière ligne, qui détermine la durée de validité du certificat en jours. L'exemple utilise la valeur 10 ans (365*10+2 années bissextiles). Cette valeur devra être ajustée avant la délivrance des certificats utilisateur.

Ensuite, nous configurons une autorité de certification autonome.

La configuration comprend l'exportation de variables, l'initialisation de l'autorité de certification, l'émission de la clé racine et du certificat de l'autorité de certification, de la clé Diffie-Hellman, de la clé TLS, ainsi que de la clé et du certificat du serveur. La clé CA doit être soigneusement protégée et gardée secrète ! Tous les paramètres de requête peuvent être laissés 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

Ceci termine la partie principale de la mise en place du mécanisme cryptographique.

Configuration d'OpenVPN

Accédez au répertoire OpenVPN, créez des répertoires de services et ajoutez 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éez le fichier de configuration principal d'OpenVPN :

$ sudo vim server.conf

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 notes sur les paramètres :

  • si un nom différent a été précisé lors de la délivrance du certificat, indiquez-le ;
  • précisez le pool d'adresses adapté à vos missions* ;
  • il peut y avoir une ou plusieurs routes et serveurs DNS ;
  • Les 2 dernières lignes sont nécessaires pour implémenter l'authentification dans AD**.

*La plage d'adresses sélectionnée dans l'exemple permettra à jusqu'à 127 clients de se connecter simultanément, car le réseau /23 est sélectionné et OpenVPN crée un sous-réseau pour chaque client en utilisant le masque /30.
Si cela est particulièrement nécessaire, le port et le protocole peuvent être modifiés, cependant, il convient de garder à l'esprit que la modification du numéro de port du port entraînera la configuration de SELinux et que l'utilisation du protocole TCP augmentera la surcharge, car Le contrôle de livraison des paquets TCP est déjà effectué au niveau des paquets encapsulés dans le tunnel.

**Si l'authentification dans AD n'est pas nécessaire, commentez-la, ignorez la section suivante et dans le modèle supprimer la ligne auth-user-pass.

Authentification AD

Pour prendre en charge le deuxième facteur, nous utiliserons la vérification de compte dans AD.

Nous avons besoin d'un compte dans le domaine avec les droits d'un utilisateur ordinaire et d'un groupe, dont l'adhésion déterminera la possibilité de se connecter.

Créez un fichier de configuration :

/etc/openvpn/ldap.conf

le contenu suivant

<LDAP>
        URL             "ldap://ldap.abc.ru"
        BindDN          "CN=bindUsr,CN=Users,DC=abc,DC=ru"
        Password        b1ndP@SS
        Timeout         15
        TLSEnable       no
        FollowReferrals yes
</LDAP>
<Authorization>
        BaseDN          "OU=allUsr,DC=abc,DC=ru"
        SearchFilter    "(sAMAccountName=%u)"
        RequireGroup    true
        <Group>
                BaseDN          "OU=myGrp,DC=abc,DC=ru"
                SearchFilter    "(cn=myVPNUsr)"
                MemberAttribute "member"
        </Group>
</Authorization>

Les principaux paramètres:

  • 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 (UZ - bindUsr dans le conteneur abc.ru/Users) ;
  • Mot de passe b1ndP@SS — mot de passe utilisateur pour la liaison ;
  • BaseDN « OU=allUsr,DC=abc,DC=ru » — le chemin à partir duquel commencer la recherche de l'utilisateur ;
  • BaseDN « OU=myGrp,DC=abc,DC=ru » – conteneur du groupe d'autorisation (groupe myVPNUsr dans le conteneur abc.rumyGrp) ;
  • SearchFilter "(cn=myVPNUsr)" est le nom du groupe autorisant.

Démarrage et diagnostic

Nous pouvons maintenant essayer d'activer et de démarrer notre serveur :

$ sudo systemctl enable [email protected]
$ sudo systemctl start [email protected]

Vérification du démarrage :

systemctl status [email protected]
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log

Émission et révocation du certificat

Parce que En plus des certificats eux-mêmes, vous avez besoin de clés et d'autres paramètres, il est très pratique de regrouper tout cela dans un seul fichier de profil. Ce fichier est ensuite transféré à l'utilisateur et le profil est importé sur le client OpenVPN. Pour ce faire, nous allons créer un modèle de paramètres et un script qui génère le profil.

Vous devez ajouter le contenu des fichiers de certificat racine (ca.crt) et de clé TLS (ta.key) au profil.

Avant de délivrer des certificats d'utilisateur n'oubliez pas de définir la durée de validité requise pour les certificats dans le fichier de paramètres. Il ne faut pas le faire trop longtemps, je recommande de se 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

<ca>
-----BEGIN CERTIFICATE-----
PUT YOUR CA CERT (ca.crt) HERE
-----END CERTIFICATE-----
</ca>

key-direction 1
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
PUT YOUR TA KEY (ta.key) HERE
-----END OpenVPN Static key V1-----
</tls-auth>

Notes:

  • les lignes METTRE VOTRE... changement de contenu Feu certificats;
  • dans la directive remote, précisez le nom/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), nous 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 ~

Rendre le fichier exécutable :

chmod a+x ~/make.profile.sh

Et nous pouvons délivrer notre premier certificat.

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

rappel

En cas de compromission d'un 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

Afficher les certificats émis et révoqués

Pour afficher les certificats émis et révoqués, affichez simplement le fichier d'index :

cd /usr/share/easy-rsa/3/
cat pki/index.txt

Explication:

  • la première ligne est le certificat du serveur ;
  • premier personnage
    • V (Valide) - valide ;
    • R (Révoqué) - rappelé.

Configuration du réseau

Les dernières étapes consistent à configurer le 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, activez 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 est probable qu'il y ait des sous-réseaux et nous devons indiquer au(x) routeur(s) comment envoyer les paquets destinés à nos clients VPN. Sur la ligne de commande nous exécutons la commande de la manière (en fonction de l'équipement utilisé) :

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

et enregistrez la configuration.

De plus, sur l'interface du routeur frontalier où est servie l'adresse externe gw.abc.ru, il est nécessaire d'autoriser le passage des paquets udp/1194.

Dans le cas où l'organisation a des règles de sécurité strictes, un pare-feu doit également être configuré sur notre serveur VPN. À mon avis, la plus grande flexibilité est fournie par la configuration des chaînes iptables FORWARD, bien que leur configuration soit moins pratique. Un peu plus sur leur configuration. Pour ce faire, il est plus pratique d'utiliser des « règles directes » - des règles directes, stockées dans un fichier /etc/firewalld/direct.xml. La configuration actuelle des règles se présente comme suit :

$ sudo firewall-cmd --direct --get-all-rule

Avant de modifier un fichier, faites-en une copie de sauvegarde :

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

Le contenu approximatif du fichier est :

<?xml version="1.0" encoding="utf-8"?>
<direct>
 <!--Common Remote Services-->
  <!--DNS-->
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o ens192 -p udp --dport 53 -j ACCEPT</rule>
  <!--web-->
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p tcp -d 172.16.19.200 --dport 80 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p tcp -d 172.16.19.201 --dport 443 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
  <!--Some Other Systems-->
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p udp -d 172.16.19.100 --dport 7000 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
  <!--just logging-->
    <rule priority="1" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -j LOG --log-prefix 'forward_fw '</rule>
</direct>

Explication

Il s'agit essentiellement de règles iptables classiques, autrement conditionnées après l'avènement de firewalld.

L'interface de destination avec les paramètres par défaut est tun0 et l'interface externe du tunnel peut être différente, par exemple ens192, selon la plateforme utilisée.

La dernière ligne sert à enregistrer les paquets abandonnés. Pour que la journalisation fonctionne, vous devez modifier le niveau de débogage dans la configuration de firewalld :

vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2

L'application des paramètres est la commande firewalld habituelle pour relire les paramètres :

$ sudo firewall-cmd --reload

Vous pouvez afficher les paquets abandonnés comme ceci :

grep forward_fw /var/log/messages

Quelle est la prochaine

Ceci termine la configuration !

Il ne reste plus qu'à installer le logiciel client côté client, importer le profil et se connecter. Pour les systèmes d'exploitation Windows, le kit de distribution se trouve sur site de développeur.

Enfin, nous connectons notre nouveau serveur aux systèmes de surveillance et d'archivage, et n'oublions pas d'installer régulièrement des mises à jour.

Connexion stable !

Source: habr.com

Ajouter un commentaire