Organisatie van externe werkprocessen voor SMB-organisaties op OpenVPN

Taakstelling

Dit artikel beschrijft de organisatie van externe toegang voor medewerkers op basis van open source-producten en kan worden gebruikt voor zowel het opzetten van een volledig autonoom systeem als voor uitbreiding wanneer er een tekort aan licenties in het bestaande commerciële systeem is of wanneer de prestaties onvoldoende blijken te zijn.

Het doel van dit artikel is om een volledige oplossing voor externe toegang in de organisatie te implementeren, wat meer is dan alleen 'OpenVPN in 10 minuten installeren'.

Het resultaat zal een systeem zijn waarin certificaten en (optioneel) de Active Directory-catalogus voor gebruikersauthenticatie worden gebruikt. Zo krijgen we een systeem met twee verificatiefactoren — wat je hebt (certificaat) en wat je weet (wachtwoord).

Het teken dat de gebruiker is toegestaan om verbinding te maken, is zijn lidmaatschap in de groep myVPNUsr. Een autonome certificeringsautoriteit zal worden gebruikt.

De kosten voor de implementatie van de oplossing zijn slechts enkele hardwarebronnen en 1 uur van de systeembeheerder.

We zullen een virtuele machine met OpenVPN en Easy-RSA versie 3 op CentOS 7 gebruiken, waarvoor 4 vCPU en 4 GiB RAM zijn toegewezen op basis van 100 verbindingen.

In ons voorbeeld is het netwerk van onze organisatie 172.16.0.0/16, waarbij de VPN-server met adres 172.16.19.123 zich in het segment 172.16.19.0/24 bevindt, de DNS-servers zijn 172.16.16.16 en 172.16.17.17, en voor de VPN-klanten is er een subnet 172.16.20.0/23 toegewezen.

Voor externe verbindingen wordt poort 1194/udp gebruikt, en in DNS is er een A-record voor onze server gemaakt met de naam gw.abc.ru.

Het is ten zeerste afgeraden om SELinux uit te schakelen! OpenVPN functioneert zonder de beveiligingsbeleid uit te schakelen.

Inhoud

  1. Installatie van het besturingssysteem en de applicatiesoftware
  2. Configuratie van cryptografie
  3. Configuratie van OpenVPN
  4. Authenticatie in AD
  5. Start en diagnose
  6. Uitgifte en intrekking van certificaten
  7. Netwerkconfiguratie
  8. Hier was eigenlijk een praktische sectie gepland met demonstratie van drie projecten op STM32 en STM8, speciaal voor dit artikel gemaakt met behulp van datasheets, met lampen, SPI, timers, PWM en interrupts:

Installatie van het besturingssysteem en de applicatiesoftware

We gebruiken de distributie CentOS 7.8.2003. We hebben een installatie van het besturingssysteem in minimale configuratie nodig. Dit is handig om te doen met behulp van kickstart, het klonen van een eerder geïnstalleerd besturingssysteem-image en andere middelen.

Na de installatie, het toewijzen van een adres aan de netwerkinterface (volgens de vereisten 172.16.19.123), voeren we de OS-update uit:

$ sudo yum update -y && reboot

Ook moet worden gecontroleerd of onze machine de tijd synchroniseert.
Voor de installatie van de applicatiesoftware zijn de pakketten openvpn, openvpn-auth-ldap, easy-rsa en vim als hoofdeditor nodig (de EPEL-repository is nodig).

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

Voor een virtuele machine is het nuttig om een gastagent te installeren:

$ sudo yum install open-vm-tools

voor VMware ESXi-hosts, of voor oVirt

$ sudo yum install ovirt-guest-agent

Configuratie van cryptografie

We gaan naar de easy-rsa directory:

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

We maken een bestand met variabelen aan:

$ sudo vim vars

met de volgende inhoud:

export KEY_COUNTRY="NL"
export KEY_PROVINCE="MijnRegio"
export KEY_CITY="MijnStad"
export KEY_ORG="ABC BV"
export KEY_EMAIL="admin@abc.nl"
export KEY_CN="allUsers"
export KEY_OU="allUsers"
export KEY_NAME="gw.abc.nl"
export KEY_ALTNAMES="abc-openvpn-server"
export EASYRSA_CERT_EXPIRE=3652

Hier worden parameters beschreven voor de hypothetische organisatie BV "ABC"; je kunt ze aanpassen met echte gegevens of 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 is een waarde van 10 jaar gebruikt (365*10+2 schrikkeljaren). Deze waarde moet worden aangepast voor de uitgifte van gebruikerscertificaten.

Vervolgens configureren we een autonome certificeringsautoriteit.

De configuratie omvat het exporteren van variabelen, het initialiseren van de CA, het uitgeven van de root sleutel en het CA-certificaat, de Diffie-Hellman sleutel, de TLS sleutel, evenals de server sleutel en certificaat. De sleutel van de certificeringsautoriteit moet zorgvuldig worden beschermd en geheim worden gehouden! Alle parameters kunnen op de standaardinstellingen blijven.

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 belangrijkste deel van de configuratie van het cryptografische mechanisme voltooid.

Configuratie van OpenVPN

We gaan naar de OpenVPN directory, maken de benodigde directories aan en voegen 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/

We maken het hoofdconfiguratiebestand voor OpenVPN aan:

$ sudo vim server.conf

met 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 een andere naam is opgegeven tijdens de uitgifte van het certificaat, geef deze dan op;
  • geef het adresbereik op voor jouw behoeften*;
  • routes en DNS-servers kunnen één of meerdere zijn;
  • De laatste 2 regels zijn nodig voor de implementatie van authenticatie in AD.

Het geselecteerde bereik in het voorbeeld stelt in staat om tegelijkertijd tot 127 clients aan te sluiten, omdat er een netwerk /23 is gekozen en OpenVPN voor elke client een subnet met een masker /30 aanmaakt.
In geval van speciale behoefte kunnen de poort en het protocol worden gewijzigd, echter moet men in gedachten houden dat een wijziging van het poortnummer de configuratie van SELinux met zich mee kan brengen, en het gebruik van het TCP-protocol de overhead zal verhogen, aangezien de controle van de aflevering van TCP-pakketten al op het niveau van de in de tunnel ingekapselde pakketten wordt uitgevoerd.

Als authenticatie in AD niet nodig is, commentarieer ze dan uit, sla de volgende sectie over en verwijder in de sjabloon. verwijder de regel auth-user-pass..

Authenticatie in AD

Voor de ondersteuning van de tweede factor zullen we de 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 tot verbinding bepaalt.

We maken een configuratiebestand aan:

/etc/openvpn/ldap.conf

met de volgende inhoud:

URL             "ldap://ldap.abc.nl"
        BindDN          "CN=bindUsr,CN=Users,DC=abc,DC=nl"
        Password        b1ndP@SS
        Timeout         15
        TLSEnable       no
        FollowReferrals yes


        BaseDN          "OU=allUsr,DC=abc,DC=nl"
        SearchFilter    "(sAMAccountName=%u)"
        RequireGroup    true
        
                BaseDN          "OU=myGrp,DC=abc,DC=nl"
                SearchFilter    "(cn=myVPNUsr)"
                MemberAttribute "member"

Hoofdpuntparameters:

  • URL "ldap://ldap.abc.nl" — het adres van de domeincontroller;
  • BindDN "CN=bindUsr,CN=Users,DC=abc,DC=nl" — het canonieke naam voor binding met LDAP (gebruikersnaam — bindUsr in de container abc.nl/Users);
  • Password b1ndP@SS — het wachtwoord van de gebruiker voor binding;
  • BaseDN "OU=allUsr,DC=abc,DC=nl" — het pad van waaruit de gebruikerszoekopdracht begint;
  • BaseDN "OU=myGrp,DC=abc,DC=nl" — de container van de goedkeuringsgroep (groep myVPNUsr in de container abc.nl/myGrp);
  • SearchFilter "(cn=myVPNUsr)" — de naam van de goedkeuringsgroep.

Start en diagnose

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

$ sudo systemctl enable openvpn@server.service
$ sudo systemctl start openvpn@server.service

Statuscontrole:

systemctl status openvpn@server.service
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log

Uitgifte en intrekking van certificaten

Aangezien naast de certificaten ook sleutels en andere instellingen nodig zijn, is het erg handig om dit alles in één profielbestand te wikkelen. Dit bestand wordt vervolgens naar de gebruiker verzonden en het profiel wordt vervolgens op de OpenVPN-client geïmporteerd. Daarom maken we een sjabloon voor de instellingen en een script dat het profiel vormt.

In het profiel moet de inhoud van de bestanden van het root-certificaat (ca.crt) en de TLS-sleutel (ta.key) worden toegevoegd.

Voordat u gebruikerscertificaten uitgeeft vergeet niet de vereiste geldigheidsduur van certificaten in te stellen in het configuratiebestand. Maak het niet te groot, ik raad aan om maximaal 180 dagen te beperken.

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


-----BEGIN CERTIFICATE-----
PLAATS HIER UW CA CERT (ca.crt)
-----END CERTIFICATE-----


key-direction 1

-----BEGIN OpenVPN Static key V1-----
PLAATS HIER UW TA KEY (ta.key)
-----END OpenVPN Static key V1-----

Aantekeningen:

  • lijnen PLAATS HIER... vervangen door de inhoud van uw certificaten;
  • geef in de directive remote de naam/adres van uw gateway op;
  • de directive auth-user-pass wordt gebruikt voor aanvullende externe authenticatie.

In de home directory (of een andere handige locatie) maken we een script aan voor het aanvragen van certificaten en het creëren van profielen:

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 ~

Maak het bestand uitvoerbaar:

chmod a+x ~/make.profile.sh

En we kunnen ons eerste certificaat uitgeven.

~/make.profile.sh my-first-user

Review

In het geval van compromittering van het certificaat (verlies, diefstal) moet dit certificaat worden ingetrokken:

cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl

Bekijk uitgegeven en ingetrokken certificaten

Om de uitgegeven en ingetrokken certificaten te bekijken, volstaat het de indexfile te bekijken:

cd /usr/share/easy-rsa/3/
cat pki/index.txt

Uitleg:

  • de eerste regel bevat het servercertificaat;
  • het eerste teken
    • V (Valid) — geldig;
    • R (Revoked) — ingetrokken.

Netwerkconfiguratie

De laatste stappen — configuratie van de overdrachtsnetwerken — routering en firewalls.

Toestaan van verbindingen in de lokale firewall:

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

Vervolgens schakelen we IP-verkeer routering 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 een verdeling in subnetten en moeten we de router(s) vertellen hoe ze de pakketten moeten verzenden die zijn gericht aan onze VPN-clients. Voer de volgende opdracht uit in de commandoregel (afhangend van de gebruikte apparatuur):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

en sla de configuratie op.

Daarnaast moet op de interface van de randrouter, waar het externe adres gw.abc.ru wordt bediend, toegestaan worden om pakketten udp/1194 door te laten.

Als er strikte beveiligingsregels in de organisatie gelden, moet er op onze VPN-server ook een firewall worden ingesteld. Naar mijn mening biedt de configuratie van iptables ketens FORWARD de grootste flexibiliteit, hoewel het minder eenvoudig is om ze in te stellen. Hier is meer informatie over de configuratie. Het handigst is om 'directe regels' — direct rules, die in een bestand zijn opgeslagen, te gebruiken. /etc/firewalld/direct.xml. De actieve regelconfiguratie kan als volgt worden opgevraagd:

$ sudo firewall-cmd --direct --get-all-rule

Maak een reservekopie van het bestand voordat u het wijzigt:

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

Een voorbeeldinhoud van het bestand is als volgt:


  
    -i tun0 -o ens192 -p udp --dport 53 -j ACCEPT
  
    -i tun0 -o eth0 -p tcp -d 172.16.19.200 --dport 80 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
    -i tun0 -o eth0 -p tcp -d 172.16.19.201 --dport 443 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
  
    -i tun0 -o eth0 -p udp -d 172.16.19.100 --dport 7000 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
  
    -i tun0 -o eth0 -j LOG --log-prefix 'forward_fw '

Uitleg

In wezen zijn dit gewone iptables-regels, verpakt na de komst van firewalld.

Het doelinterface is standaard tun0, en het externe tunnelinterface kan iets anders zijn, bijvoorbeeld ens192, afhankelijk van het gebruikte platform.

De laatste regel is bedoeld voor het loggen van weggegooide pakketten. Om het loggen te laten werken, moet het foutopsporingsniveau in de firewalld-configuratie worden aangepast:

vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2

Toepassen van de instellingen — de gebruikelijke firewalld-opdracht om de instellingen opnieuw te lezen:

$ sudo firewall-cmd --reload

Afgewezen pakketten kunnen als volgt worden bekeken:

grep forward_fw /var/log/messages

Hier was eigenlijk een praktische sectie gepland met demonstratie van drie projecten op STM32 en STM8, speciaal voor dit artikel gemaakt met behulp van datasheets, met lampen, SPI, timers, PWM en interrupts:

De configuratie is hiermee voltooid!

Het enige wat overblijft is het clientsoftware aan de kant van de klant te installeren, het profiel te importeren en verbinding te maken. Voor Windows-besturingssystemen is de distributie beschikbaar op de ontwikkelaarswebsite.

Tot slot verbinden we onze nieuwe server met monitoring- en archiveringssystemen, en vergeten we niet regelmatig updates te installeren.

Stabiele verbinding!

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster