Organisatie van werken op afstand van een MKB-organisatie op OpenVPN
Formulering van het probleem
Het artikel beschrijft de organisatie van externe toegang voor medewerkers op open source-producten en kan zowel worden gebruikt om een volledig autonoom systeem te bouwen, als nuttig zijn voor uitbreiding wanneer er een tekort aan licenties is in het bestaande commerciële systeem of de prestaties ervan onvoldoende zijn.
Het doel van het artikel is om een compleet systeem te implementeren voor het bieden van externe toegang tot een organisatie, wat niet veel meer is dan “OpenVPN installeren in 10 minuten.”
Als gevolg hiervan krijgen we een systeem waarin certificaten en (optioneel) de Active Directory van het bedrijf worden gebruikt om gebruikers te authenticeren. Dat. we krijgen een systeem met twee verificatiefactoren: wat ik heb (certificaat) en wat ik weet (wachtwoord).
Een teken dat een gebruiker verbinding mag maken, is zijn of haar lidmaatschap van de myVPNUsr-groep. De certificeringsinstantie wordt offline gebruikt.
De kosten voor het implementeren van de oplossing bedragen slechts kleine hardwarebronnen en 1 uur werk van de systeembeheerder.
We zullen een virtuele machine gebruiken met OpenVPN en Easy-RSA versie 3 op CetntOS 7, die 100 vCPU's en 4 GiB RAM per 4 verbindingen toegewezen krijgt.
In het voorbeeld is het netwerk van onze organisatie 172.16.0.0/16, waarbij de VPN-server met het adres 172.16.19.123 zich in het segment 172.16.19.0/24 bevindt, DNS-servers 172.16.16.16 en 172.16.17.17, en het subnet 172.16.20.0 .23/XNUMX is toegewezen voor VPN-clients.
Om van buitenaf verbinding te maken wordt gebruik gemaakt van een verbinding via poort 1194/udp en is voor onze server een A-record gw.abc.ru aangemaakt in de DNS.
Het wordt ten strengste afgeraden om SELinux uit te schakelen! OpenVPN werkt zonder het beveiligingsbeleid uit te schakelen.
Installatie van besturingssysteem en applicatiesoftware
We gebruiken de CentOS 7.8.2003-distributie. We moeten het besturingssysteem in een minimale configuratie installeren. Het is handig om dit te doen met behulp van kickstart, het klonen van een eerder geïnstalleerde OS-image en andere middelen.
Na de installatie, door een adres toe te wijzen aan de netwerkinterface (volgens de voorwaarden van taak 172.16.19.123), werken we het besturingssysteem bij:
$ sudo yum update -y && reboot
We moeten er ook voor zorgen dat tijdsynchronisatie op onze machine wordt uitgevoerd.
Om applicatiesoftware te installeren, hebt u de pakketten openvpn, openvpn-auth-ldap, easy-rsa en vim nodig als hoofdeditor (u hebt de EPEL-repository nodig).
De parameters voor de voorwaardelijke organisatie ABC LLC worden hier beschreven; u kunt ze corrigeren naar de echte of ze uit het voorbeeld laten staan. Het belangrijkste in de parameters is de laatste regel, die de geldigheidsduur van het certificaat in dagen bepaalt. In het voorbeeld wordt de waarde 10 jaar gebruikt (365*10+2 schrikkeljaren). Deze waarde moet worden aangepast voordat gebruikerscertificaten worden uitgegeven.
Vervolgens configureren we een autonome certificeringsinstantie.
De installatie omvat het exporteren van variabelen, het initialiseren van de CA, het uitgeven van de CA-hoofdsleutel en het certificaat, de Diffie-Hellman-sleutel, de TLS-sleutel en de serversleutel en het certificaat. De CA-sleutel moet zorgvuldig worden beschermd en geheim gehouden! Alle queryparameters kunnen als standaard blijven staan.
Hiermee is het grootste deel van het opzetten van het cryptografische mechanisme voltooid.
OpenVPN configureren
Ga naar de OpenVPN-directory, maak servicemappen aan en voeg een link naar easy-rsa toe:
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/
Maak het belangrijkste OpenVPN-configuratiebestand:
$ sudo vim server.conf
de volgende inhoud:
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
Enkele opmerkingen over de parameters:
als er bij de afgifte van het certificaat een andere naam is opgegeven, geef deze dan aan;
specificeer de adressenpool die bij uw taken past*;
er kunnen een of meer routes en DNS-servers zijn;
De laatste 2 regels zijn nodig om authenticatie in AD** te implementeren.
*Met het in het voorbeeld geselecteerde adressenbereik kunnen maximaal 127 clients tegelijkertijd verbinding maken, omdat het /23-netwerk is geselecteerd en OpenVPN maakt voor elke client een subnet met behulp van het /30-masker.
Indien bijzonder noodzakelijk kunnen de poort en het protocol worden gewijzigd. Houd er echter rekening mee dat het wijzigen van het poortpoortnummer het configureren van SELinux met zich meebrengt, en het gebruik van het TCP-protocol de overhead zal vergroten, omdat TCP-pakketafleveringscontrole wordt al uitgevoerd op het niveau van pakketten die in de tunnel zijn ingekapseld.
**Als authenticatie in AD niet nodig is, geef dan commentaar, sla het volgende gedeelte over en in de sjabloon verwijder de auth-user-pass-regel.
AD-verificatie
Om de tweede factor te ondersteunen, zullen we accountverificatie in AD gebruiken.
We hebben een account in het domein nodig met de rechten van een gewone gebruiker en een groep, waarvan het lidmaatschap de mogelijkheid om verbinding te maken zal bepalen.
systemctl status [email protected]
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log
Certificaatuitgifte en intrekking
Omdat Naast de certificaten zelf heb je sleutels en andere instellingen nodig, het is erg handig om dit allemaal in één profielbestand te verpakken. Dit bestand wordt vervolgens overgedragen naar de gebruiker en het profiel wordt geïmporteerd op de OpenVPN-client. Om dit te doen, zullen we een instellingensjabloon en een script maken dat het profiel genereert.
U moet de inhoud van de rootcertificaatbestanden (ca.crt) en de TLS-sleutelbestanden (ta.key) aan het profiel toevoegen.
Voordat u gebruikerscertificaten uitgeeft Vergeet niet de vereiste geldigheidsduur voor certificaten in te stellen in het parameterbestand. Je moet het niet te lang maken, ik raad aan om je te beperken tot maximaal 180 dagen.
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>
Opmerkingen:
lijnen ZET JE... inhoudelijk veranderen hun certificaten;
specificeer in de externe instructie de naam/het adres van uw gateway;
de instructie auth-user-pass wordt gebruikt voor aanvullende externe authenticatie.
In de homedirectory (of een andere handige plek) maken we een script aan voor het aanvragen van een certificaat en het aanmaken van een profiel:
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 ~
Het bestand uitvoerbaar maken:
chmod a+x ~/make.profile.sh
En we kunnen ons eerste certificaat uitreiken.
~/make.profile.sh my-first-user
terugroepen
In geval van compromittering van een certificaat (verlies, diefstal), is het noodzakelijk om dit certificaat in te trekken:
cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl
Bekijk uitgegeven en ingetrokken certificaten
Om uitgegeven en ingetrokken certificaten te bekijken, bekijkt u eenvoudigweg het indexbestand:
cd /usr/share/easy-rsa/3/
cat pki/index.txt
Toelichting:
de eerste regel is het servercertificaat;
eerste karakter
V (Geldig) - geldig;
R (ingetrokken) - teruggeroepen.
Netwerk configuratie
De laatste stappen zijn het configureren van het transmissienetwerk - routing en firewalls.
In een bedrijfsomgeving is er waarschijnlijk sprake van subnetten en moeten we de router(s) vertellen hoe ze pakketten moeten verzenden die bestemd zijn voor onze VPN-clients. Op de opdrachtregel voeren we de opdracht uit op de manier (afhankelijk van de gebruikte apparatuur):
# ip route 172.16.20.0 255.255.254.0 172.16.19.123
en sla de configuratie op.
Bovendien is het op de grensrouterinterface waar het externe adres gw.abc.ru wordt aangeboden, noodzakelijk om de doorgang van udp/1194-pakketten toe te staan.
Indien de organisatie strenge beveiligingsregels hanteert, dient er tevens een firewall op onze VPN-server te worden geconfigureerd. Naar mijn mening wordt de grootste flexibiliteit geboden door het opzetten van iptables FORWARD-ketens, hoewel het opzetten ervan minder handig is. Nog even over het instellen ervan. Om dit te doen, is het het handigst om "directe regels" te gebruiken - directe regels, opgeslagen in een bestand /etc/firewalld/direct.xml. De huidige configuratie van de regels is als volgt te vinden:
$ sudo firewall-cmd --direct --get-all-rule
Voordat u een bestand wijzigt, moet u er een reservekopie van maken:
Dit zijn in wezen reguliere iptables-regels, anders verpakt na de komst van firewalld.
De bestemmingsinterface met standaardinstellingen is tun0, en de externe interface voor de tunnel kan verschillen, bijvoorbeeld ens192, afhankelijk van het gebruikte platform.
De laatste regel is voor het loggen van gevallen pakketten. Om loggen te laten werken, moet u het foutopsporingsniveau in de firewalld-configuratie wijzigen:
vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2
Het toepassen van instellingen is het gebruikelijke firewalld-commando om de instellingen opnieuw te lezen:
$ sudo firewall-cmd --reload
U kunt verwijderde pakketten als volgt bekijken:
grep forward_fw /var/log/messages
What's Next
Hiermee is de installatie voltooid!
Het enige dat overblijft is om de clientsoftware aan de clientzijde te installeren, het profiel te importeren en verbinding te maken. Voor Windows-besturingssystemen bevindt de distributiekit zich op ontwikkelaarssite.
Ten slotte verbinden we onze nieuwe server met de monitoring- en archiveringssystemen en vergeten we niet regelmatig updates te installeren.