Un tas d'OpenVPN sur Windows Server et Mikrotik avec la migration de ce truc vers Linux

Bon

Tôt ou tard, chaque entreprise a soudainement besoin d'un accès à distance.
Pratiquement tous les informaticiens sont confrontés à la nécessité d'organiser l'accès à distance à leurs réseaux dans l'entreprise.
Moi, comme beaucoup, ce besoin couvert par le timbre "hier". Après avoir analysé tous les avantages et les inconvénients, ainsi que pelleter des tonnes d'informations et creuser un peu en théorie, j'ai décidé de procéder à l'installation.

Pour des raisons de sécurité, j'ai choisi OpenVPN dans l'implémentation suivante: une machine virtuelle a été installée sur un serveur exécutant Windows Server 2012, Windows Server 2012 y était également installé, et à son tour, se trouvait un serveur OpenVPN qui émettait et signait des certificats.

Pour plus de commodité, nous l'appellerons un «serveur de certification». De plus, il a pris un certificat de serveur, l'a poussé dans Mikrotik, et sur le routeur Mikrotik a soulevé OpenVPN avec des comptes, des profils. J'ai également utilisé un serveur de certification pour émettre un certificat client.

La mise en œuvre, bien sûr, est horrible, et bien qu'à cette époque mon expérience dans de telles choses n'était pas, disons, suffisante en matière de sécurité, ce n'était pas une mauvaise décision.

Ce bundle a fonctionné pendant un certain temps et on m'a donné une nouvelle introduction: transférer le serveur de certification vers Linux, tout en maintenant la connexion avec Mikrotik - les clients ne devraient pas en souffrir.

Ma connaissance de Linux à cette époque s'est terminée sur Ubuntu 16.04LTS avec une interface graphique qui a été utilisée comme terminal pour se connecter via RDP à un serveur Windows. Autrement dit, sudo apt-get -f install -y, et pas un centimètre de plus.

Après avoir étudié la question de savoir quel système d'exploitation de la famille Linux est plus stable et prometteur pour mon organisation, je me suis installé sur CentOS 7 Minimal.

Pour commencer, j'ai décidé de me plonger un peu dans la théorie, de comprendre comment elle fonctionne et fonctionne généralement. J'ai regardé les didacticiels vidéo sur la chaîne www.youtube.com/channel/UCKdRgZWgy42YxoFcTJ30LTA (En général, pas de publicité, ils m'ont juste eu le premier). La fille avec une voix agréable m'a présenté les bases du travail dans le système d'exploitation sélectionné.

Pour commencer, j'ai lancé Hyper-V sur mon ordinateur, y ai installé CentOS 7 Minimal, lors de l'installation j'ai créé l'utilisateur Admin et fermé complètement ssh pour root. Dire au revoir à un bel écran multicolore, plongé dans le monde noir et blanc du terminal.

Je pense que cela n'a aucun sens de décrire le processus d'installation du logiciel, il vaut mieux se concentrer sur les problèmes qui se sont posés dans le processus et pour lesquels j'ai dû écrire un petit script (il est sous un chat. Une description de chacun des utilitaires peut être trouvée sur Internet, mais à ce moment où je suis tout l'a fait, ce script n'était pas encore là, tout a été fait pour la première fois, au toucher et au hasard).

Dans le script, j'ai essayé d'automatiser l'installation des utilitaires minimum nécessaires pour le serveur, de désactiver Selinux, de connecter le référentiel Epel, d'installer OpenVPN, etc. Ci-dessous le script lui-même, c'est simple, mais il peut être utilisé. Je ne vais pas le démonter, mais si quelqu'un en a besoin, écrivez une réponse.

Après avoir utilisé le script, un serveur OpenVPN déjà configuré apparaîtra, clignotant d'un œil vert.

UPD: A fait quelques ajustements au script, tirant des conclusions des commentaires. Il n'a pas commencé à supprimer ses erreurs, mais a simplement commenté afin que le fil des commentaires ne soit pas perdu. Ajout de lignes repoussées pour la visibilité.

#!/bin/bash cd /etc/sysconfig/ sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' selinux sudo setenforce 0 cd /home/Admin sudo yum update -y sudo yum install epel-release -y sudo yum install mc -y sudo yum install nano -y sudo cp /usr/share/mc/syntax/sh.syntax /usr/share/mc/syntax/unknown.syntax sudo yum install chrony -y sudo systemctl start chronyd sudo systemctl enable chronyd sudo yum install net-tools -y sudo yum install iftop -y sudo yum install htop -y sudo yum install lsof -y sudo yum install dos2unix -y sudo yum install wget -y sudo yum install tcpdump -y sudo yum install openvpn -y wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.3/EasyRSA-3.0.3.tgz sudo tar -xvzf EasyRSA-3.0.3.tgz #sudo chown -R Admin:Admin /var/log #sudo chmod 755 /var/log sudo mkdir /var/log/openvpn sudo mkdir /etc/openvpn/ccd sudo chown -R Admin:Admin /etc/openvpn/ccd sudo chown -R Admin:Admin /var/log/openvpn chmod 755 /etc/openvpn/ccd chmod 755 /var/log/openvpn echo >/var/log/openvpn/openvpn-status.log echo >/var/log/openvpn/openvpn.log #sudo chown -R Admin:Admin /etc/resolv.conf sudo chmod 777 /etc/resolv.conf echo nameserver 8.8.8.8 >>/etc/resolv.conf chmod 755 /etc/resolv.conf cd /etc/openvpn/ sudo /home/Admin/EasyRSA-3.0.3/easyrsa init-pki sudo chown -R Admin:Admin /etc/openvpn chmod 755 /etc/openvpn echo set_var EASYRSA_DN "org" >/home/Admin/EasyRSA-3.0.3/test echo set_var EASYRSA_REQ_COUNTRY "RU" >>/home/Admin/EasyRSA-3.0.3/test echo set_var EASYRSA_KEY_SIZE 4096 >>/home/Admin/EasyRSA-3.0.3/test echo set_var EASYRSA_REQ_PROVINCE "LIP" >>/home/Admin/EasyRSA-3.0.3/test echo set_var EASYRSA_REQ_CITY "Lipetsk" >>/home/Admin/EasyRSA-3.0.3/test echo set_var EASYRSA_REQ_ORG "Cool-Admin" >>/home/Admin/EasyRSA-3.0.3/test echo set_var EASYRSA_REQ_EMAIL "xxx.ru" >>/home/Admin/EasyRSA-3.0.3/test echo set_var EASYRSA_REQ_OU "Our_ORG" >>/home/Admin/EasyRSA-3.0.3/test echo set_var EASYRSA_REQ_CN "changeme" >>/home/Admin/EasyRSA-3.0.3/test echo set_var EASYRSA_CERT_EXPIRE 3650 >>/home/Admin/EasyRSA-3.0.3/test echo set_var EASYRSA_DH_KEY_SIZE=2048 >>/home/Admin/EasyRSA-3.0.3/test sudo /home/Admin/EasyRSA-3.0.3/easyrsa build-ca nopass sudo /home/Admin/EasyRSA-3.0.3/easyrsa build-server-full Serv nopass sudo /home/Admin/EasyRSA-3.0.3/easyrsa build-client-full Client1 nopass sudo /home/Admin/EasyRSA-3.0.3/easyrsa --vars=vars gen-dh sudo /home/Admin/EasyRSA-3.0.3/easyrsa --vars=vars gen-crl mkdir keys sudo chown -R Admin:Admin /etc/openvpn/keys chmod 755 /etc/openvpn/keys sudo cp /etc/openvpn/pki/ca.crt /etc/openvpn/keys sudo cp /etc/openvpn/pki/dh.pem /etc/openvpn/keys sudo cp /etc/openvpn/pki/crl.pem /etc/openvpn/keys sudo cp /etc/openvpn/pki/issued/Serv.crt /etc/openvpn/keys sudo cp /etc/openvpn/pki/private/Serv.key /etc/openvpn/keys echo port 443 >/etc/openvpn/server.conf echo proto udp >>/etc/openvpn/server.conf echo dev tun >>/etc/openvpn/server.conf echo ca /etc/openvpn/keys/ca.crt >>/etc/openvpn/server.conf echo cert /etc/openvpn/keys/Serv.crt >>/etc/openvpn/server.conf echo key /etc/openvpn/keys/Serv.key >>/etc/openvpn/server.conf echo dh /etc/openvpn/keys/dh.pem >>/etc/openvpn/server.conf echo crl-verify /etc/openvpn/keys/crl.pem >>/etc/openvpn/server.conf echo client-config-dir /etc/openvpn/ccd >>/etc/openvpn/server.conf echo topology subnet >>/etc/openvpn/server.conf echo server 172.21.0.0 255.255.255.0 >>/etc/openvpn/server.conf echo route 172.21.0.0 255.255.255.0 >>/etc/openvpn/server.conf echo push \"dhcp-option DNS 8.8.8.8\" >>/etc/openvpn/server.conf echo push \"dhcp-option DNS 8.8.4.4\" >>/etc/openvpn/server.conf echo keepalive 10 120 >>/etc/openvpn/server.conf echo persist-key >>/etc/openvpn/server.conf echo persist-tun >>/etc/openvpn/server.conf echo status /var/log/openvpn/openvpn-status.log >>/etc/openvpn/server.conf echo log-append /var/log/openvpn/openvpn.log >>/etc/openvpn/server.conf echo verb 2 >>/etc/openvpn/server.conf echo mute 20 >>/etc/openvpn/server.conf echo daemon >>/etc/openvpn/server.conf echo mode server >>/etc/openvpn/server.conf echo user nobody >>/etc/openvpn/server.conf echo group nobody >>/etc/openvpn/server.conf #sudo chown -R Admin:Admin /etc/sysctl.conf chmod 777 /etc/sysctl.conf echo net.ipv4.ip_forward=1 >>/etc/sysctl.conf chmod 755 /etc/sysctl.conf sudo sysctl -p /etc/sysctl.conf sudo systemctl enable openvpn@server sudo systemctl start openvpn@server sudo systemctl status openvpn@server 

L'installation d'OpenVPN n'a pas été entièrement réussie.

Ne connaissant pas les caractéristiques de la politique des droits sur les systèmes Linux, j'ai passé beaucoup de temps à étudier les journaux et à attribuer à tous les fichiers les droits requis.

Lorsque le bouton OpenVPN est devenu vert, j'étais très heureux, mais il s'est avéré que ce n'était que le début. Par souci de simplicité, je m'attendais à remplacer les certificats racine et le fichier crl.pem, en espérant que tout fonctionnait. Par conséquent, j'ai dû transférer les fichiers suivants du serveur vers Windows:

Serv.crt - Certificat de serveur
Serv.key - Clé de serveur
Ca.crt - Certificat racine
Ca.key - Clé racine
Crl.pem - Fichier de révocation de certificats
Dh.pem - Clé Diffie-Hellman
Index.txt - Fichier contenant des informations sur les certificats actuels
Série - il est également responsable de la pertinence des certificats

Il nécessitait également le dossier certs_by_serial, le fichier vars et toutes les clés et certificats client.
À Mikrotik, les certificats sont restés en place, donc cela a fonctionné.

Des problèmes sont apparus lorsque j'ai essayé de révoquer le certificat, cela ne fonctionnait pas du tout - le fichier index.txt devait être converti au format Unix, mais je ne l'ai pas fait tout de suite. Utilisé l'utilitaire dos2unix.

Maintenant, les certificats ont été révoqués, mais ont continué à fonctionner sans aucun problème, car Mikrotik ne savait pas qu'ils avaient été révoqués et il devait en informer d'une manière ou d'une autre.

Après avoir lu les instructions et consulté Alexander ERI (merci beaucoup!), J'ai récupéré un simple serveur http Apache sur le serveur de certification et publié un fichier de certificats révoqués dessus. Accès complètement fermé, sauf pour le fichier publié à partir d'une adresse IP.

Dans le terminal Mikrotik, dans l'onglet / System / Certificates / CRL, indiqué le chemin vers le crl.pem publié. Ici, il convient de préciser que Mikrotik n'accepte que http et une adresse absolue pour l'onglet CRL, c'est-à-dire Cela devrait ressembler à ceci: 127.0.0.1/crl/1.crl
Tout a fonctionné, au moins pour les versions 6.4.2.x de RouterOS, mais j'ai dû créer des configurations client avec mes mains, et cela a été malheureux pour moi et a causé beaucoup de désagréments. Quand en une semaine j'ai eu besoin de créer des configurations pour environ 50 clients, j'ai décidé d'accélérer ce processus et pour cela j'ai utilisé un morceau du script de quelqu'un d'autre trouvé sur Internet.

Le script fonctionne comme ceci: après le lancement, spécifiez «nom du client», répondez à la question «définissez un mot de passe ou non», après quoi nous prenons le fichier de configuration prêt à l'emploi «client.ovpn», avec des certificats et des paramètres intégrés. Pour l'utiliser, vous devez avoir / etc / openvpn. Je vais signer komenty lignes dans lesquelles le chemin doit être remplacé par le vôtre. Il est également nécessaire de créer un fichier avec les paramètres client afin que le script les remplace dans le processus de création de la configuration.

 #!/bin/bash function newClient () { echo "" echo "Tell me a name for the client." echo "Use one word only, no special characters." until [[ "$CLIENT" =~ ^[a-zA-Z0-9_]+$ ]]; do read -rp "Client name: " -e CLIENT done echo "" echo "Do you want to protect the configuration file with a password?" echo "(eg encrypt the private key with a password)" echo " 1) Add a passwordless client" echo " 2) Use a password for the client" until [[ "$PASS" =~ ^[1-2]$ ]]; do read -rp "Select an option [1-2]: " -e -i 1 PASS done #cd /etc/openvpn/easy-rsa/ || return case $PASS in 1) sudo /home/admin/EasyRSA-3.0.3/easyrsa build-client-full "$CLIENT" nopass ;; 2) echo "You will be asked for the client password below" ./easyrsa build-client-full "$CLIENT" ;; esac # Generates the custom client.ovpn cp /etc/openvpn/client-template.txt "$home/home/admin/IT/Temp/$CLIENT.ovpn" #       . #,      { echo "<ca>" cat "/etc/openvpn/pki/ca.crt" #    echo "</ca>" echo "<cert>" awk '/BEGIN/,/END/' "/etc/openvpn/pki/issued/$CLIENT.crt" #   #  echo "</cert>" echo "<key>" cat "/etc/openvpn/pki/private/$CLIENT.key" #     echo "</key>" } >> "$home/home/admin/IT/Temp/$CLIENT.ovpn" #,     # echo "" echo "Client $CLIENT added, the configuration file is available at $home/admin/IT/OVPN/Temp/$CLIENT.ovpn." echo "Download the .ovpn file and import it in your OpenVPN client." exit 0; } newClient 

Après un certain temps, une nouvelle interdiction d'introduction sur l'accès à distance a obligé à tuer à la fois ce serveur et le groupe de travail avec Mikrotik. Un nouveau serveur OpenVPN a été créé pour le service informatique, qui fonctionne désormais entièrement sur CentOS. Mais c'est une histoire complètement différente.

J'exprime ma gratitude à Ivan et Pavel pour leur aide dans la rédaction de l'article.

Source: https://habr.com/ru/post/fr478526/


All Articles