Organisation du travail à distance Organisation SMB sur OpenVPN

Formulation du problème


L'article décrit l'organisation de l'accès à distance pour les employés sur les produits open source et peut être utilisé à la fois pour construire un système entièrement autonome et sera utile pour l'expansion en cas de manque de licences dans un système commercial existant ou lorsque ses performances sont insuffisantes.

Le but de l'article est de présenter un système complet pour fournir un accès à distance à une organisation, ce qui est un peu plus que «installer OpenVPN en 10 minutes».

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

Un signe que l'utilisateur est autorisé à se connecter est son appartenance au groupe myVPNUsr. L'autorité de certification sera utilisée de manière autonome.

Le coût de mise en œuvre de la solution n'est 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 3e version sur CetntOS 7, qui sur la base de 100 connexions a émis 4 vCPU, 4 Go de RAM.

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 est situé dans le segment 172.16.19.0/24, les serveurs DNS sont 172.16.16.16 et 172.16.17.17 et le sous-réseau 172.16.20.0/23 est alloué aux clients VPN .

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

Il est fortement 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 des logiciels d'application
  2. Paramètre de cryptographie
  3. Configurer OpenVPN
  4. Authentification dans AD
  5. Lancement et diagnostics
  6. Délivrance et révocation du certificat
  7. Configuration du réseau
  8. Et après


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


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

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

$ sudo yum update -y && reboot

Il est également nécessaire de s'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

Pour une machine virtuelle, il est utile d'installer un agent invité:

$ sudo yum install open-vm-tools

pour les hôtes VMware ESXi ou pour oVirt

$ sudo yum install ovirt-guest-agent


Paramètre de cryptographie


Accédez au répertoire easy-rsa:

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

Créez un fichier variable:

$ 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="admin@abc.ru"
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 d'ABC LLC sont décrits ici. Vous pouvez les corriger pour de vrai ou les laisser comme exemple. La chose la plus importante dans les paramètres est la dernière ligne, qui détermine la période de validité du certificat en jours. Dans l'exemple, la valeur de 10 ans est utilisée (365 * 10 + 2 années bissextiles). Cette valeur devra être ajustée avant d'émettre des certificats d'utilisateur.

Ensuite, configurez 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, la clé Diffie-Hellman, la clé TLS, ainsi que la clé du serveur et le certificat. La clé de l'autorité de certification doit être soigneusement gardée et gardée secrète! Tous les paramètres des requêtes 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

Sur ce point, la partie principale de la configuration du mécanisme cryptographique est terminée.

Configurer OpenVPN


Accédez au répertoire OpenVPN, créez des répertoires de service 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é indiqué lors de la délivrance du certificat, indiquez-le;
  • spécifiez le pool d'adresses pour vos tâches *;
  • les routes et les serveurs DNS peuvent être un ou plusieurs;
  • Les 2 dernières lignes sont nécessaires pour implémenter l'authentification dans AD **.

* 127 , .. /23, OpenVPN /30.
, , SELinux, tcp , .. tcp- .

** AD , , — , auth-user-pass.


AD


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

Nous avons besoin d'un compte dans le domaine avec les droits d'un utilisateur ordinaire et d'un groupe, dont l'appartenance déterminera la capacité 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>

Paramètres principaux:

  • URL "ldap: //ldap.abc.ru" - l'adresse du contrôleur de domaine;
  • BindDN «CN = bindUsr, CN = Users, DC = abc, DC = ru» - le 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 d'utilisateur;
  • BaseDN "OU = myGrp, DC = abc, DC = ru" - le conteneur du groupe d'autorisation (le groupe myVPNUsr dans le conteneur abc.ru \ myGrp);
  • SearchFilter "(cn = myVPNUsr)" est le nom du groupe de résolution.


Lancement et diagnostics


Maintenant, nous pouvons essayer d'allumer et de démarrer notre serveur:

$ sudo systemctl enable openvpn@server.service
$ sudo systemctl start openvpn@server.service

Lancer la vérification:

systemctl status openvpn@server.service
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log

Délivrance 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 fichier de profil. Ce fichier est ensuite transféré à l'utilisateur et le profil est déjà importé sur le client OpenVPN. Pour ce faire, créez un modèle de configuration et un script qui forme le profil.

Dans le profil, vous devez ajouter le contenu des fichiers de certificat racine (ca.crt) et la clé TLS (ta.key).

Avant d'émettre des certificats utilisateur, veillez à définir la période de validité de certificat requise dans le fichier de paramètres. Vous ne devriez pas le faire trop grand, 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

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

Remarques:

  • METTEZ VOS ... chaînes sont modifiées pour le contenu de leurs certificats;
  • dans la directive remote, spécifiez 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 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 ~

Nous rendons le fichier exécutable:

chmod a+x ~/make.profile.sh

Et vous pouvez délivrer notre premier certificat.

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


Retour d'information


Si le certificat est compromis (perte, vol), ce certificat doit être révoqué:

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

Explications:

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


Configuration du réseau


Les dernières étapes sont la mise en place d'un réseau de transmission - routage et pare-feu.

Autorisation pour 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 existe probablement une division en sous-réseaux et nous devons indiquer au (x) routeur (s) comment envoyer des paquets adressés à nos clients VPN. Sur la ligne de commande, exécutez 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 frontière, où l'adresse externe gw.abc.ru est desservie, il est nécessaire de permettre le passage des paquets udp / 1194.

Si votre organisation a des règles de sécurité strictes, vous devez également configurer un pare-feu sur notre serveur VPN. À mon avis, la configuration des chaînes iptables FORWARD offre la plus grande flexibilité, bien que leur configuration soit moins pratique. Un peu plus sur leur configuration. Pour cela, il est plus pratique d'utiliser des «règles directes» - des règles directes stockées dans le fichier /etc/firewalld/direct.xml . La configuration de règle actuelle peut être trouvée comme suit:

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

Avant de modifier le 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 le suivant:

<?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>

Explications


Essentiellement, ce sont les règles iptables habituelles, sinon empaquetées après l'apparition de firewalld.

L'interface de destination aux paramètres par défaut est tun0, et l'extérieur du tunnel peut être différent, par exemple ens192, selon la plate-forme utilisée.

La dernière ligne est pour la journalisation des paquets perdus. Pour que la journalisation fonctionne, vous devez modifier le niveau de débogage dans la configuration firewalld:

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

Appliquer les paramètres - la commande firewalld habituelle pour relire les paramètres:

$ sudo firewall-cmd --reload

Les paquets rejetés peuvent être visualisés comme suit:

grep forward_fw /var/log/messages


Et après


La configuration est terminée!

Il reste du côté client pour installer le logiciel client, importer le profil et se connecter. Pour un OS tel que Windows, la distribution est disponible sur le site du développeur .

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

Connexion stable!

All Articles