Organizacija udaljenog rada SMB organizacije na OpenVPN

Postavljanje zadatka

Ovaj članak opisuje organizaciju udaljenog pristupa zaposlenika putem proizvoda s otvorenim izvorom i može se koristiti za izgradnju potpuno autonomnog sustava ili kao pomoć pri proširenju, kada postojeći komercijalni sustav pati od nedostatka licenci ili njegova izvedba nije dovoljna.

Cilj članka je implementirati završen sustav za pružanje udaljenog pristupa organizaciji, što je malo više od „instalacije OpenVPN-a za 10 minuta”.

Kao rezultat toga, dobit ćemo sustav u kojem će se za autentifikaciju korisnika koristiti certifikati i (opcionalno) korporativni direktorij Active Directory. Tako ćemo dobiti sustav s dvostrukom provjerom — što posjedujem (certifikat) i što znam (lozinka).

Znaku da je korisniku dopušteno povezivanje je njegovo članstvo u grupi myVPNUsr. Centar za certifikaciju će biti autonoman.

Cijena implementacije rješenja je samo mali hardverski resursi i 1 sat rada sistem administratora.

Koristit ćemo virtualnu mašinu s OpenVPN-om i Easy-RSA verzije 3 na CentOS 7, kojoj su raspoređena 4 vCPU i 4 GiB RAM-a za 100 povezanih korisnika.

U primjeru, mreža naše organizacije je 172.16.0.0/16, u kojoj je VPN poslužitelj s adresom 172.16.19.123 smješten u segmentu 172.16.19.0/24, DNS poslužitelji su 172.16.16.16 i 172.16.17.17, a za VPN klijente je dodijeljena podmreža 172.16.20.0/23.

Za vanjsko povezivanje koristi se veza putem porta 1194/udp, a u DNS-u za naš poslužitelj je kreirana A-zapis gw.abc.ru.

Kategorijski se ne preporučuje isključivanje SELinux-a! OpenVPN radi bez isključivanja politika sigurnosti.

Sadržaj

  1. Instalacija OS-a i aplikativnog softvera
  2. Podešavanje kriptografije
  3. Podešavanje OpenVPN-a
  4. Autentifikacija u AD
  5. Pokretanje i dijagnostika
  6. Izdavanje i opoziv certifikata
  7. Podešavanje mreže
  8. Što dalje

Instalacija OS-a i aplikativnog softvera

Koristimo distribuciju CentOS 7.8.2003. Potrebna nam je instalacija OS-a u minimalnoj konfiguraciji. Praktično je to raditi koristeći kickstart, kloniranje prethodno instaliranog OS-a i drugim sredstvima.

Nakon instalacije, dodeljivanja adrese mrežnom sučelju (prema zadatku 172.16.19.123), izvršavamo ažuriranje OS-a:

$ sudo yum update -y && reboot

Također je potrebno osigurati da se na našoj mašini vrši sinkronizacija vremena.
Za instalaciju aplikativnog softvera potrebni su paketi openvpn, openvpn-auth-ldap, easy-rsa i vim kao glavni urednik (trebat će nam EPEL repozitorij).

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

Za virtualnu mašinu korisno je instalirati gostujuću agenciju:

$ sudo yum install open-vm-tools

za VMware ESXi hotele ili za oVirt

$ sudo yum install ovirt-guest-agent

Podešavanje kriptografije

Idemo u mapu easy-rsa:

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

Kreiramo datoteku s varijablama:

$ sudo vim vars

sljedeće sadržaje:

export KEY_COUNTRY="HR"
export KEY_PROVINCE="MojaRegija"
export KEY_CITY="MojGrad"
export KEY_ORG="ABC d.o.o."
export KEY_EMAIL="admin@abc.hr"
export KEY_CN="sviKorisnici"
export KEY_OU="sviKorisnici"
export KEY_NAME="gw.abc.hr"
export KEY_ALTNAMES="abc-openvpn-server"
export EASYRSA_CERT_EXPIRE=3652

Ovdje su opisane postavke za fiktivnu organizaciju d.o.o. "ABC"; možete ih ispraviti na stvarne ili ostaviti iz primjera. Najvažnija stavka kod postavki je posljednji red, koji definira razdoblje valjanosti certifikata u danima. U primjeru je postavljena vrijednost 10 godina (365*10+2 prijestupne godine). Ovu vrijednost treba prilagoditi prije izdavanja korisničkih certifikata.

Nakon toga postavljamo autonomni centar za certificiranje.

Postavke uključuju izvoz varijabli, inicializaciju CA, izdavanje korijenskih ključeva i certifikata CA, Diffie-Hellman ključ, TLS ključ, kao i ključ i certifikat poslužitelja. Ključ centra za certificiranje treba čuvati i čuvati u tajnosti! Sve postavke kod zahtjeva mogu ostati prema zadanim vrijednostima.

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

Time je osnovni dio postavke kriptografskog mehanizma završen.

Podešavanje OpenVPN-a

Idemo u mapu OpenVPN, kreiramo radne mape i dodajemo poveznicu 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/

Kreiramo glavni konfiguracijski fajl OpenVPN:

$ sudo vim server.conf

sljedeće sadržine

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

Nekoliko napomena u vezi s parametrima:

  • ako je prilikom izdavanja certifikata navedeno drugo ime — navedite ga;
  • pulp adresâ navedite prema svojim potrebama*;
  • ruta i DNS serveri mogu biti jedan ili više;
  • Posljednje 2 linije potrebne su za implementaciju autentifikacije u AD**.

*Odabrani raspon adresa u primjeru omogućit će povezivanje do 127 klijenata, jer je odabrana mreža /23, a OpenVPN stvara podmrežu s maskom /30 za svakog korisnika.
U slučaju posebne potrebe, port i protokol mogu se promijeniti, no treba imati na umu da će promjena broja porta zahtijevati podešavanje SELinux-a, a korištenje TCP protokola povećat će troškove, jer kontrola isporuke TCP paketa već se vrši na razini paketa koji su encapsulirani u tunelu.

**Ako AD autentifikacija nije potrebna, komentirajte ih, sljedeći odjeljak — preskočite, a u predlošku izbrišite redak auth-user-pass.

Autentifikacija u AD

Kako bismo podržali drugi faktor, koristit ćemo provjeru računa u AD-u.

Trebamo korisnički račun u domeni s pravima običnog korisnika i grupu, čije članstvo će odrediti mogućnost povezivanja.

Stvaramo konfiguracijsku datoteku:

/etc/openvpn/ldap.conf

sljedeće sadržine

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


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

Osnovni parametri:

  • URL „ldap://ldap.abc.hr“ — adresa kontrolera domene;
  • BindDN „CN=bindUsr,CN=Users,DC=abc,DC=hr“ — kanoničko ime za vezivanje uz LDAP (korisnik — bindUsr u kontejneru abc.hr/Users);
  • Password b1ndP@SS — lozinka korisnika za vezivanje;
  • BaseDN „OU=allUsr,DC=abc,DC=hr“ — putanja s koje počinjemo pretraživanje korisnika;
  • BaseDN „OU=myGrp,DC=abc,DC=hr“ — kontejner odobravajuće grupe (grupa myVPNUsr u kontejneru abc.hrmmyGrp);
  • SearchFilter "(cn=myVPNUsr)" — ime odobravajuće grupe.

Pokretanje i dijagnostika

Sada možemo probati uključiti i pokrenuti naš server:

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

Provjera pokretanja:

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

Izdavanje i opoziv certifikata

Budući da osim samih certifikata trebaju i ključevi i ostale postavke, vrlo je praktično sve to obaviti u jednu datoteku profila. Ova datoteka se zatim predaje korisniku i profil se već uvozi na klijentu OpenVPN. Za ovo ćemo stvoriti predložak postavki i skriptu koja formira profil.

U profil treba dodati sadržaj datoteka korijenskog certifikata (ca.crt) i TLS ključ (ta.key).

Prije izdavanja korisničkih certifikata ne zaboravite postaviti potrebni rok važenja certifikata u datoteci parametara. Ne bi trebao biti predug, preporučujem ograničenje na maksimalno 180 dana.

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

Napomene:

  • redovi PUT YOUR… mijenjamo na sadržaj svojih certifikata;
  • u direktivi remote navedite ime/adresu svog gateway-a;
  • direktiva auth-user-pass koristi se za dodatnu vanjsku autentifikaciju.

U svom domaćem direktoriju (ili drugom prikladnom mjestu) kreiramo skriptu za zahtjev certifikata i izradu 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 ~

Učinimo datoteku izvršnom:

chmod a+x ~/make.profile.sh

I možemo izdati naš prvi certifikat.

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

Revokacija

U slučaju kompromitacije certifikata (gubitak, krađa) potrebno je opozvati taj certifikat:

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

Pregled izdanih i opozvanih certifikata

Za pregled izdanih i opozvanih certifikata dovoljno je pregledati indeksnu datoteku:

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

Objašnjenja:

  • prvi redak sadrži certifikat servera;
  • prvi simbol
    • V (Valid) — važeći;
    • R (Revoked) — opozvan.

Podešavanje mreže

Zadnji koraci — konfiguracija mrežne transmisije — rutiranja i vatrozida.

Dopustite povezivanja u lokalnom vatrozidu:

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

Nakon toga, uključite IP promet rutiranja:

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

U korporativnom okruženju sigurno ovise o podmrežama i moramo obavijestiti usmjerivače kako slati pakete usmjereni našim VPN klijentima. U komandnoj liniji izvršite naredbu u stilu (ovisno o korištenoj opremi):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

i spremite konfiguraciju.

Osim toga, na sučelju vanjskog usmjerivača, gdje se obrađuje vanjska adresa gw.abc.ru, potrebno je omogućiti prolazak paketa udp/1194.

U slučaju da u organizaciji vrijede stroga pravila sigurnosti, također je potrebno konfigurirati vatrozid na našem VPN poslužitelju. Po mom mišljenju, najveću fleksibilnost osigurava konfiguracija iptables lanaca FORWARD, iako je njihovo postavljanje manje praktično. Malo više o njihovoj konfiguraciji. Najlakše je koristiti "izravna pravila" – direct rules, pohranjena u datoteci /etc/firewalld/direct.xml. Aktivnu konfiguraciju pravila možete saznati na sljedeći način:

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

Prije promjene datoteke napravite sigurnosnu kopiju:

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

Približan sadržaj datoteke je sljedeći:


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

Objašnjenja

Zahtjev se zapravo radi o uobičajenim pravilima iptables, samo pakiranim nakon dolaska firewalld-a.

Odredišni sučelje prema zadanim postavkama je tun0, a vanjsko za tunel može biti drugo, npr. ens192, ovisno o korištenoj platformi.

Zadnji redak je namijenjen za evidentiranje odbijenih paketa. Kako bi evidentiranje radilo, potrebno je promijeniti razinu otklanjanja pogrešaka u konfiguraciji firewalld:

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

Primjena postavki – uobičajena naredba firewalld-a za ponovno učitavanje postavki:

$ sudo firewall-cmd --reload

Odbijene pakete možete pregledati na sljedeći način:

grep forward_fw /var/log/messages

Što dalje

S ovim je postavljanje završeno!

Preostaje samo na strani klijenta instalirati klijentski softver, uvesti profil i povezati se. Za Windows sustave distribuirani paket je smješten na web stranici programera.

Na kraju, povezujemo naš novi poslužitelj s sustavima za nadgledanje i arhiviranje, i ne zaboravimo redovito instalirati ažuriranja.

Stabilne veze!

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster