Hallo!
Op een gegeven moment heeft elk bedrijf plotseling remote toegang nodig.
Bij de noodzaak om remote toegang tot netwerken binnen het bedrijf te organiseren, komt iedere IT-specialist in aanraking.
Net als velen werd ik met deze behoefte geconfronteerd en die had dringend aandacht nodig. Na het analyseren van alle voors en tegens, en het doorlezen van een heleboel informatie en wat theorie, besloot ik om met de installatie te beginnen.
Omwille van de veiligheid koos ik voor OpenVPN in de volgende opzet: op een server met Windows Server 2012 werd een virtuele machine geïnstalleerd, waarop opnieuw Windows Server 2012 draaide, en daarop draaide de OpenVPN-server die certificaten uitgaf en ondertekende.
Voor de gemakelijkheid noem ik het "certificeringsserver". Vervolgens nam ik het servercertificaat, plaatste het in Mikrotik en op de Mikrotik-router draaide ik OpenVPN met accounts en profielen. Voor het uitgeven van het clientcertificaat gebruikte ik eveneens de certificeringsserver.
De implementatie was natuurlijk verre van perfect en hoewel mijn ervaring op dat moment niet erg groot was, was dit op het gebied van beveiliging toch een redelijk besluit.
Deze configuratie heeft enige tijd gewerkt en ik ontving een nieuwe instructie: verplaats de certificeringsserver naar Linux, terwijl de verbinding met Mikrotik behouden moet blijven — de cliënten mogen niet lijden.
Mijn kennis van Linux reikte toen niet verder dan Ubuntu 16.04 LTS met een grafische interface, waarmee ik via RDP verbinding maakte met de Windows-server. Dat wil zeggen, sudo apt-get -f install -y, en niet verder.
Na onderzoek naar welk Linux-besturingssysteem het meest stabiel en veelbelovend was voor mijn organisatie, besloot ik om CentOS 7 Minimal te gebruiken.
Eerst besloot ik om me wat in de theorie te verdiepen, om te begrijpen hoe dit eigenlijk werkt. Ik bekeek tutorials op het kanaal (Helemaal geen reclame, het was gewoon wat ik als eerste tegenkwam). Een meisje met een aangename stem maakte me wegwijs in de basisprincipes van de gekozen OS.
Eerst startte ik Hyper-V op mijn computer, installeerde CentOS 7 Minimal, creëerde een gebruiker Admin tijdens de installatie en sloot ssh volledig voor root af. Na afscheid van het mooie kleurrijke scherm, dook ik in de zwart-witte wereld van de terminal.
Ik denk niet dat het nodig is om het installatieproces van software te beschrijven. Laten we ons richten op de problemen die tijdens het proces zijn ontstaan en waarvoor ik een klein script heb moeten schrijven (het script staat hieronder). Beschrijvingen van elke tool zijn online te vinden, maar op dat moment dat ik dit allemaal deed, was dat script er nog niet; alles gebeurde voor het eerst, op gevoel en willekeurig.
In het script heb ik geprobeerd de installatie van de minimaal noodzakelijke tools voor de server te automatiseren, Selinux uit te schakelen, de Epel-repository te verbinden, OpenVPN te installeren, enzovoorts. Hieronder staat het script zelf. Het is eenvoudig, maar het kan gebruikt worden. Ik zal het niet uitleggen, maar als iemand het nodig heeft, schrijf gerust en ik zal antwoorden.
Na het gebruik van het script krijg je een al geconfigureerde OpenVPN-server, die met een groene lamp knippert.
#!/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
mkdir /var/log/openvpn
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
chmod 755 /etc/resolv.conf
echo nameserver 8.8.8.8 >>/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 755 /etc/sysctl.conf
echo net.ipv4.ip_forward=1 >>/etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf
sudo systemctl enable openvpn@server
sudo systemctl start openvpn@server
sudo systemctl status openvpn@serverDe installatie van OpenVPN is niet helemaal succesvol verlopen.
Zonder te weten over de specifieke rechten-beleid op Linux-systemen, heb ik veel tijd besteed aan het bestuderen van de logbestanden en het toekennen van de vereiste rechten aan alle bestanden.
Toen de OpenVPN-knop groen werd, was ik erg blij, maar het bleek slechts het begin te zijn. In mijn eenvoudigheid dacht ik de root-certificaten en het crl.pem-bestand te kunnen vervangen in de hoop dat alles zou werken. Uiteindelijk moest ik de volgende bestanden van de server naar Windows overbrengen:
Serv.crt — Servercertificaat
Serv.key — Server sleutel
Ca.crt — Rootcertificaat
Ca.key — Root sleutel
Crl.pem — Bestanden met ingetrokken certificaten
Dh.pem — Diffie-Hellman sleutel
Index.txt — Bestand met informatie over actuele certificaten
Serial — dit is ook verantwoordelijk voor de geldigheid van de certificaten
Ik had ook de map certs_by_serial, het bestand vars, en alle client sleutels en certificaten nodig.
Op Mikrotik bleven de certificaten op hun plek, dus werkte alles.
Er kwamen problemen toen ik probeerde het certificaat in te trekken, dat werkte totaal niet — het bestand index.txt moest in unix-formaat worden gebracht, wat ik niet meteen deed. Ik heb de utility dos2unix gebruikt.
Nu konden de certificaten worden ingetrokken, maar bleven zonder problemen werken, omdat Mikrotik niet wist dat ze ingetrokken waren en hij hierin geïnformeerd moest worden.
Na het lezen van de instructies en na overleg met Alexander ERI (erg bedankt!), zette ik een eenvoudige http-server Apache op de certificeringsserver en publiceerde daar het bestand met ingetrokken certificaten. Toegang hiertoe heb ik volledig afgesloten, behalve tot het gepubliceerde bestand vanaf één IP-adres.
In de Mikrotik-terminal, onder de tab /System/Certificates/CRL, heb ik het pad naar de gepubliceerde crl.pem aangegeven. Het moet worden opgemerkt dat Mikrotik voor de CRL-tab alleen http en een absoluut adres accepteert, dat wil zeggen dat het er ongeveer zo uit zou moeten zien:
Alles werkte, tenminste voor versies 6.4.2.x van RouterOS, maar de klantconfiguraties moesten handmatig worden aangemaakt, wat voor mij teleurstellend was en veel ongemak veroorzaakte. Toen ik een week later configuraties moest aanmaken voor ongeveer 50 klanten, besloot ik dit proces te versnellen en gebruikte een stukje van een script dat ik op het internet vond.
Het script werkt als volgt: na het starten geven we de 'klantnaam' op, antwoorden we op de vraag 'wilt u een wachtwoord instellen of niet', waarna we het kant-en-klare configuratiebestand 'klant.ovpn' ophalen, met daarin geïntegreerde certificaten en instellingen. Om het te gebruiken, moet je je bevinden in /etc/openvpn. Ik zal de regels ondertekenen met opmerkingen, waarin het pad moet worden vervangen door het jouwe. Er moet ook een bestand met klantinstellingen worden aangemaakt, zodat het script deze tijdens het maken van de configuratie kan invoegen.
#!/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 "(e.g. 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
Na enige tijd dwong een nieuwe invoering om externe toegang te verbieden mij om ook deze server uit te schakelen, evenals de werkende combinatie met Mikrotik. Er werd een nieuwe OpenVPN-server gemaakt voor de IT-afdeling medewerkers, die nu volledig op CentOS draait. Maar dat is alweer een heel ander verhaal.
Ik wil Ivan en Pavel enorm bedanken voor hun hulp bij het redigeren van het artikel.
Bron: habr.com
