Organizacija oddaljenega dela podjetij SMB na OpenVPN

Definisanje zadatka

Članek opisuje organizacijo oddaljenega dostopa zaposlenih na izdelkih z odprto kodo in lahko se uporablja tako za gradnjo popolnoma avtonomnega sistema kot tudi za razširitev, ko v obstoječem komercialnem sistemu zmanjkuje licenc ali se njegovih zmogljivosti izkaže za nezadostne.

Cilj članka je uvedba zaključnega sistema zagotavljanja oddaljenega dostopa za organizacijo, kar je nekoliko več kot 'namestitev OpenVPN v 10 minutah'.

Kot rezultat bomo dobili sistem, v katerem bodo za avtorizacijo uporabnikov uporabljeni certifikati in (opcijsko) korporativni katalog Active Directory. Tako bomo dobili sistem z dvema faktorjema preverjanja — kar imam (certifikat) in kar vem (geslo).

Znaki, da je uporabniku dovoljen dostop, so njegovo članstvo v skupini myVPNUsr. Uporabljen bo samostojen certifikacijski center.

Cena uvedbe rešitve je le majhna strojna sredstva in 1 ura dela sistemskega administratorja.

Uporabili bomo virtualni stroj z OpenVPN in Easy-RSA 3. različice na CentOS 7, ki je ob upoštevanju 100 povezav dodeljen 4 vCPU in 4 GiB RAM.

V tem primeru je omrežje naše organizacije 172.16.0.0/16, v katerem je VPN strežnik z naslovom 172.16.19.123 v segmentu 172.16.19.0/24, DNS strežniki 172.16.16.16 in 172.16.17.17, za VPN odjemalce pa je dodeljena podomrežje 172.16.20.0/23.

Za povezovanje od zunaj se uporablja povezava prek vrat 1194/udp, v DNS pa je za naš strežnik ustvarjena A-zapis gw.abc.ru.

Kategorično odsvetujemo izklop SELinux! OpenVPN deluje brez izklopa politik varnosti.

Vsebina

  1. Namestitev OS in aplikativne programske opreme
  2. Nastavitev kriptografije
  3. Nastavitev OpenVPN
  4. Avtorizacija v AD
  5. Zagon in diagnostika
  6. Izdaja in preklic certifikata
  7. Nastavitev omrežja
  8. Kaj naprej

Namestitev OS in aplikativne programske opreme

Uporabimo distribucijo CentOS 7.8.2003. Potrebujemo namestitev OS v minimalni konfiguraciji. Udobno je to storiti z uporabo kickstart, kloniranjem prej nameščenega sistema in drugimi sredstvi.

Po namestitvi, dodelitvi naslova omrežnemu vmesniku (po pogojih naloge 172.16.19.123), izvedemo posodobitev OS:

$ sudo yum update -y && reboot

Prav tako je potrebno zagotoviti, da se na našem stroju izvaja sinhronizacija časa.
Za namestitev aplikativne programske opreme potrebujete pakete openvpn, openvpn-auth-ldap, easy-rsa in vim kot osnovni urejevalnik (potrebovali boste repozitorij EPEL).

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

Za virtualni stroj je koristno namestiti gostujočega agenta:

$ sudo yum install open-vm-tools

za gostitelje VMware ESXi ali za oVirt

$ sudo yum install ovirt-guest-agent

Nastavitev kriptografije

Pojdite v imenik easy-rsa:

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

Ustvarite datoteko spremenljivk:

$ sudo vim vars

z naslednjo vsebino:

export KEY_COUNTRY="SI"
export KEY_PROVINCE="MojaRegija"
export KEY_CITY="MojeMesto"
export KEY_ORG="ABC LLC"
export KEY_EMAIL="admin@abc.si"
export KEY_CN="allUsers"
export KEY_OU="allUsers"
export KEY_NAME="gw.abc.si"
export KEY_ALTNAMES="abc-openvpn-server"
export EASYRSA_CERT_EXPIRE=3652

Tu so opisani parametri za domnevno organizacijo LLC «ABC», lahko jih spremenite na resnične ali pustite iz primera. Najbolj pomembna v parametrih je zadnja vrstica, ki določa obdobje veljavnosti potrdila v dneh. V primeru je uporabljena vrednost 10 let (365*10+2 prestopna leta). To vrednost bo potrebno prilagoditi pred izdajo potrdil uporabnikov.

Nato nastavimo avtonomni center za sertifikacijo.

Nastavitev vključuje izvoz spremenljivk, inicializacijo CA, izdajo korenskega ključa in potrdila CA, Diffie-Hellman ključa, TLS ključa ter ključa in potrdila strežnika. Ključ centra za certificiranje je potrebno skrbno zaščititi in hraniti v skrivnosti! Vse parametre ob zahtevah lahko pustite privzete.

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

S tem je glavni del nastavitve kriptografskega mehanizma končan.

Nastavitev OpenVPN

Pojdite v imenik OpenVPN, ustvarite delovne imenike in dodajte povezavo na easy-rsa:

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/

Ustvarite glavno datoteko konfiguracije OpenVPN:

$ sudo vim server.conf

naslednje vsebine

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

Nekaj opomb glede parametrov:

  • če je bilo pri izdaji potrdila navedeno drugo ime — navedite ga;
  • Navedite opseg adresa za svoje zadatke*;
  • Može biti jedan ili više ruta i DNS servera;
  • Zadnje 2 linije su potrebne za implementaciju autentifikacije u AD**.

*Odabrani opseg adresa u primeru omogućava simultanu konekciju do 127 klijenata, jer je odabrana mreža /23, a OpenVPN kreira podmrežu po maski /30 za svakog klijenta.
U slučaju posebne potrebe, port i protokol mogu biti izmenjeni, međutim treba imati na umu da promena broja porta implicira podešavanje SELinux-a, a korišćenje tcp protokola povećava troškove, jer se kontrola isporuke tcp paketa već vrši na nivou paketa koji su inkapsulirani u tunelu.

**Ako autentifikacija u AD nije potrebna, komentarišite ih, sledeći deo - preskočite, a u šablonu uklonite liniju auth-user-pass.

Avtorizacija v AD

Za podršku drugog faktora koristićemo proveru naloga u AD.

Potrebna nam je korisnička račun u domeni sa pravima običnog korisnika i grupa, čije članstvo će odrediti mogućnost konekcije.

Kreiramo konfiguracioni fajl:

/etc/openvpn/ldap.conf

naslednje vsebine

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


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

Osnovne postavke:

  • URL „ldap://ldap.abc.si“ — adresa kontrolera domena;
  • BindDN „CN=bindUsr,CN=Users,DC=abc,DC=si“ — kanoničko ime za vezu sa LDAP (korisnički nalog — bindUsr u kontejneru abc.si/Users);
  • Password b1ndP@SS — lozinka korisnika za vezu;
  • BaseDN „OU=allUsr,DC=abc,DC=si“ — putanja od koje započinjemo pretragu korisnika;
  • BaseDN „OU=myGrp,DC=abc,DC=si“ — kontejner grupe sa pravima (grupa myVPNUsr u kontejneru abc.si/myGrp);
  • SearchFilter "(cn=myVPNUsr)" — ime grupe sa pravima.

Zagon in diagnostika

Sada možemo pokušati da uključimo i pokrenemo naš server:

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

Provera pokretanja:

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

Izdaja in preklic certifikata

Pošto su pored samih sertifikata potrebni ključevi i ostale postavke, vrlo je zgodno sve to obaviti u jedan fajl profila. Ovaj fajl se zatim predaje korisniku i profil se uveza na klijent OpenVPN. Za to ćemo kreirati šablon postavki i skript koji formira profil.

V profilu je treba dodati vsebino datotek korenskega certifikata (ca.crt) in TLS ključa (ta.key).

Pred izdajo uporabniških certifikatov ne pozabite nastaviti zahtevanega obdobja veljavnosti certifikatov v datoteki parametrov. Ne sme biti predolg, priporočam omejitev na največ 180 dni.

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-----
PUT YOUR CA CERT (ca.crt) HERE
-----END CERTIFICATE-----


key-direction 1

-----BEGIN OpenVPN Static key V1-----
PUT YOUR TA KEY (ta.key) HERE
-----END OpenVPN Static key V1-----

Opombe:

  • vrstice PUT YOUR… spremeni v vsebino svojih certifikatov;
  • v direktivi remote navedite ime/naslov svojega prehodnika;
  • direktiva auth-user-pass se uporablja za dodatno zunanjo avtentikacijo.

V domačem direktoriju (ali drugem primernem mestu) ustvarite skript za zahtevo certifikata in ustvarjanje profila:

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 ~

Datoteko naredimo izvršno:

chmod a+x ~/make.profile.sh

In lahko izdajamo naš prvi certifikat.

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

Preklic

V primeru kompromitacije certifikata (izguba, kraja) je treba ta certifikat preklicati:

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

Ogled izdanih in preklicanih certifikatov

Za ogled izdanih in preklicanih certifikatov je dovolj, da si ogledate indeksno datoteko:

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

Pojasnila:

  • prva vrstica vsebuje certifikat strežnika;
  • prvi znak
    • V (Valid) — veljaven;
    • R (Revoked) — preklican.

Nastavitev omrežja

Zadnji koraki — nastavitev omrežja za posredovanje — usmerjanje in požarni zidovi.

Dovoljenje povezav v lokalnem požarnem zidu:

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

Nato omogočimo usmerjanje IP prometa:

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

V korporativnem okolju zagotovo obstaja razdelitev na podomrežja in obvestiti moramo usmerjevalnik(-e), kako naj pošilja pakete, naslovljene našim VPN strankam. V ukazni vrstici izvedemo ukaz na način (odvisno od uporabljenega pomnilnika):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

in shranimo konfiguracijo.

Poleg tega je na vmesniku mejnega usmerjevalnika, kjer se obravnava zunanji naslov gw.abc.ru, potrebno dovoliti prehod paketov udp/1194.

V primeru, da v organizaciji veljajo stroga pravila varnosti, je potrebno na našem VPN strežniku nastaviti tudi požarni zid. Po mojem mnenju največjo prilagodljivost ponuja nastavitev iptables verig FORWARD, čeprav je njihovo nastavljanje manj priročno. Malce podrobneje o njihovi nastavitvi. Za to je najbolje koristiti "direktna pravila" — direct rules, shranjena v datoteki /etc/firewalld/direct.xml. Trenutno konfiguracijo pravil lahko ugotovite tako:

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

Pred spremembo datoteke ustvarite varnostno kopijo:

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

Približno vsebino datoteke je takole:


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

Razlage

V bistvu so to običajna pravila iptables, sicer spakirano po pojavu firewalld.

Ciljni vmesnik pri privzetih nastavitvah je tun0, zunanji za tunel pa je lahko drugačen, npr. ens192, odvisno od uporabljene platforme.

Zadnji vrstica je namenjena beleženju zavrženih paketov. Da beleženje deluje, je treba v konfiguraciji firewalld spremeniti raven odpravljanja napak:

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

Uporaba nastavitev — običajna ukaz firewalld za ponovno nalaganje nastavitev:

$ sudo firewall-cmd --reload

Zavržene pakete lahko pregledate tako:

grep forward_fw /var/log/messages

Kaj naprej

S tem je nastavitev končana!

Preostalo je le še na strani odjemalca namestiti odjemalsko programsko opremo, uvoziti profil in se povezati. Za operacijski sistem Windows je izvorna datoteka na spletni strani razvijalca.

Na koncu priključimo naš novi strežnik na sisteme za nadzor in arhiviranje ter ne pozabimo redno nameščati posodobitve.

Stabilne povezave!

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster