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
- Installation du système d'exploitation et des logiciels d'application
- Paramètre de cryptographie
- Configurer OpenVPN
- Authentification dans AD
- Lancement et diagnostics
- Délivrance et révocation du certificat
- Configuration du réseau
- 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 suivantport 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
basepath=/usr/share/easy-rsa/3
clntpath=$basepath/client
privpath=$basepath/pki/private
certpath=$basepath/pki/issued
profile=$clntpath/$1.ovpn
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
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
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é):
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>
<rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o ens192 -p udp --dport 53 -j ACCEPT</rule>
<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>
<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>
<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!