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.

Inhoud

  1. Installatie van besturingssysteem en applicatiesoftware
  2. Cryptografie instellen
  3. OpenVPN configureren
  4. AD-verificatie
  5. Opstarten en diagnostiek
  6. Certificaatuitgifte en intrekking
  7. Netwerk configuratie
  8. What's Next

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

$ sudo yum install epel-release
$ sudo yum install openvpn openvpn-auth-ldap easy-rsa vim

Het is handig om een ​​gastagent voor een virtuele machine te installeren:

$ sudo yum install open-vm-tools

voor VMware ESXi-hosts, of voor oVirt

$ sudo yum install ovirt-guest-agent

Cryptografie instellen

Ga naar de easy-rsa-directory:

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

Maak een variabel bestand:

$ sudo vim vars

de volgende inhoud:

export KEY_COUNTRY="RU"
export KEY_PROVINCE="MyRegion"
export KEY_CITY="MyCity"
export KEY_ORG="ABC LLC"
export KEY_EMAIL="[email protected]"
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

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.

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

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.

Maak een configuratiebestand:

/etc/openvpn/ldap.conf

de volgende inhoud:

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

De belangrijkste parameters:

  • URL “ldap://ldap.abc.ru” - domeincontrolleradres;
  • BindDN “CN=bindUsr,CN=Users,DC=abc,DC=ru” - canonieke naam voor binding aan LDAP (UZ - bindUsr in de container abc.ru/Users);
  • Wachtwoord b1ndP@SS — gebruikerswachtwoord voor binding;
  • BaseDN “OU=allUsr,DC=abc,DC=ru” — het pad van waaruit naar de gebruiker moet worden gezocht;
  • BaseDN “OU=myGrp,DC=abc,DC=ru” – container van de toegestane groep (groep myVPNUsr in de container abc.rumyGrp);
  • Zoekfilter "(cn=myVPNUsr)" is de naam van de toegestane groep.

Opstarten en diagnostiek

Nu kunnen we proberen onze server in te schakelen en te starten:

$ sudo systemctl enable [email protected]
$ sudo systemctl start [email protected]

Opstartcontrole:

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.

Verbindingen toestaan ​​in de lokale firewall:

$ sudo firewall-cmd --add-service=openvpn
$ sudo firewall-cmd --add-service=openvpn --permanent

Schakel vervolgens IP-verkeersroutering in:

$ sudo sysctl net.ipv4.ip_forward=1
$ sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/50-sysctl.conf

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:

cp /etc/firewalld/direct.xml /etc/firewalld/direct.xml.`date +%F.%T`.bak

De geschatte inhoud van het bestand is:

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

Uitleg

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.

Stabiele verbinding!

Bron: www.habr.com

Voeg een reactie