Organizacija daljinskog rada SMB organizacije na OpenVPN-u

Izjava o problemu

Članak opisuje organizaciju udaljenog pristupa za zaposlene na open source proizvodima i može se koristiti i za izgradnju potpuno autonomnog sistema, a biće koristan i za proširenje kada postoji nedostatak licenci u postojećem komercijalnom sistemu ili su njegove performanse nedostatne.

Cilj članka je implementacija kompletnog sistema za omogućavanje udaljenog pristupa organizaciji, što je nešto više od “instaliranja OpenVPN-a za 10 minuta”.

Kao rezultat, dobićemo sistem u kojem će se sertifikati i (opciono) korporativni Active Directory koristiti za autentifikaciju korisnika. To. dobićemo sistem sa dva faktora verifikacije - šta imam (sertifikat) i šta znam (lozinka).

Znak da je korisniku dozvoljeno da se poveže je njegovo članstvo u myVPNUsr grupi. Certifikacijski autoritet će se koristiti van mreže.

Troškovi implementacije rješenja su samo mali hardverski resursi i 1 sat rada sistem administratora.

Koristićemo virtuelnu mašinu sa OpenVPN i Easy-RSA verzijom 3 na CetntOS 7, kojoj je dodeljeno 100 vCPU-a i 4 GiB RAM-a na 4 konekcija.

U primjeru, mreža naše organizacije je 172.16.0.0/16, u kojoj se VPN server sa adresom 172.16.19.123 nalazi u segmentu 172.16.19.0/24, DNS serveri 172.16.16.16 i 172.16.17.17 i 172.16.20.0 subnet. .23/XNUMX je dodijeljen za VPN klijente.

Za povezivanje izvana koristi se veza preko porta 1194/udp, a u DNS-u je kreiran A-zapis gw.abc.ru za naš server.

Strogo se ne preporučuje onemogućavanje SELinuxa! OpenVPN radi bez onemogućavanja sigurnosnih politika.

Sadržaj

  1. Instalacija OS i aplikativnog softvera
  2. Postavljanje kriptografije
  3. Postavljanje OpenVPN-a
  4. AD Authentication
  5. Pokretanje i dijagnostika
  6. Izdavanje i opoziv certifikata
  7. Konfiguracija mreže
  8. Šta sledi

Instalacija OS i aplikativnog softvera

Koristimo distribuciju CentOS 7.8.2003. Moramo instalirati OS u minimalnoj konfiguraciji. Zgodno je to učiniti koristeći kick start, kloniranje prethodno instalirane slike OS-a i druga sredstva.

Nakon instalacije, dodjeljujući adresu mrežnom sučelju (prema uslovima zadatka 172.16.19.123), ažuriramo OS:

$ sudo yum update -y && reboot

Također moramo osigurati da se vremenska sinhronizacija vrši na našoj mašini.
Da biste instalirali aplikativni softver, potrebni su vam paketi openvpn, openvpn-auth-ldap, easy-rsa i vim kao glavni uređivač (trebaće vam EPEL spremište).

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

Korisno je instalirati agenta za goste za virtuelnu mašinu:

$ sudo yum install open-vm-tools

za VMware ESXi hostove ili za oVirt

$ sudo yum install ovirt-guest-agent

Postavljanje kriptografije

Idite na easy-rsa direktorij:

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

Kreirajte varijabilnu datoteku:

$ sudo vim vars

sljedeći sadržaj:

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

Ovdje su opisani parametri za uvjetnu organizaciju ABC LLC; možete ih ispraviti na stvarne ili ih ostaviti iz primjera. Najvažnija stvar u parametrima je zadnji red, koji određuje rok važenja sertifikata u danima. Primjer koristi vrijednost 10 godina (365*10+2 prijestupne godine). Ova vrijednost će se morati prilagoditi prije izdavanja korisničkih certifikata.

Zatim konfiguriramo autonomno certifikacijsko tijelo.

Postavljanje uključuje izvoz varijabli, inicijalizaciju CA, izdavanje CA korijenskog ključa i certifikata, Diffie-Hellman ključa, TLS ključa i serverskog ključa i certifikata. CA ključ mora biti pažljivo zaštićen i čuvan u tajnosti! Svi parametri upita mogu se ostaviti kao zadani.

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

Ovim je završen glavni dio postavljanja kriptografskog mehanizma.

Postavljanje OpenVPN-a

Idite na OpenVPN direktorij, kreirajte servisne direktorije i dodajte link 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/

Kreirajte glavnu OpenVPN konfiguracijsku datoteku:

$ sudo vim server.conf

sledeći sadržaji

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

Neke napomene o parametrima:

  • ako je prilikom izdavanja sertifikata navedeno drugačije ime, navesti ga;
  • odredite skup adresa koje odgovaraju vašim zadacima*;
  • može postojati jedna ili više ruta i DNS servera;
  • Posljednja 2 reda su potrebna za implementaciju autentifikacije u AD**.

*Raspon adresa odabranih u primjeru će omogućiti do 127 klijenata da se povežu istovremeno, jer mreža /23 je odabrana, a OpenVPN kreira podmrežu za svakog klijenta koristeći /30 masku.
Ako je posebno potrebno, port i protokol se mogu promeniti, međutim, treba imati na umu da će promena broja porta porta podrazumevati konfigurisanje SELinuxa, a korišćenje tcp protokola će povećati troškove, jer Kontrola isporuke TCP paketa se već izvodi na nivou paketa inkapsuliranih u tunelu.

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

AD Authentication

Da bismo podržali drugi faktor, koristićemo verifikaciju naloga u AD.

Potreban nam je nalog u domenu sa pravima običnog korisnika i grupa, članstvo u kojoj će odrediti mogućnost povezivanja.

Kreirajte konfiguracijski fajl:

/etc/openvpn/ldap.conf

sledeći sadržaji

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

Ključni parametri:

  • URL “ldap://ldap.abc.ru” - adresa kontrolera domena;
  • BindDN “CN=bindUsr,CN=Users,DC=abc,DC=ru” - kanonsko ime za vezivanje za LDAP (UZ - bindUsr u kontejneru abc.ru/Users);
  • Lozinka b1ndP@SS — korisnička lozinka za povezivanje;
  • BaseDN “OU=allUsr,DC=abc,DC=ru” — putanja sa koje treba započeti traženje korisnika;
  • BaseDN “OU=myGrp,DC=abc,DC=ru” – kontejner grupe koja dozvoljava (grupa myVPNUsr u kontejneru abc.rumyGrp);
  • SearchFilter "(cn=myVPNUsr)" je naziv grupe koja dozvoljava.

Pokretanje i dijagnostika

Sada možemo pokušati omogućiti i pokrenuti naš server:

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

Provjera pokretanja:

systemctl status [email protected]
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log

Izdavanje i opoziv certifikata

Jer Osim samih certifikata, potrebni su vam ključevi i druga podešavanja, vrlo je zgodno sve ovo umotati u jednu datoteku profila. Ova datoteka se zatim prenosi korisniku i profil se uvozi na OpenVPN klijent. Da bismo to učinili, kreirat ćemo predložak postavki i skriptu koja generira profil.

Morate dodati sadržaj root certifikata (ca.crt) i TLS ključ (ta.key) datoteka u profil.

Prije izdavanja korisničkih certifikata ne zaboravite postaviti traženi period važenja certifikata u datoteci parametara. Ne bi trebalo da bude predugo; preporučujem da se ograničite 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

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

Napomene:

  • žice STAVITE SVOJ... promijeniti u sadržaj njihovih certifikati;
  • u udaljenoj direktivi navedite ime/adresu vašeg gatewaya;
  • direktiva auth-user-pass se koristi za dodatnu eksternu autentifikaciju.

U početnom direktoriju (ili drugom prikladnom mjestu) kreiramo skriptu za traženje certifikata i kreiranje 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činite datoteku izvršnom:

chmod a+x ~/make.profile.sh

I možemo izdati naš prvi certifikat.

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

Povratna informacija

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

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

Pogledajte izdate i opozvane certifikate

Da vidite izdate i opozvane certifikate, jednostavno pogledajte indeksni fajl:

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

Objašnjenja:

  • prvi red je certifikat servera;
  • prvi lik
    • V (Valjan) - važeći;
    • R (Opozvano) - opozvano.

Konfiguracija mreže

Posljednji koraci su konfiguracija mreže prijenosa - rutiranja i zaštitnih zidova.

Dozvoljavanje konekcija u lokalnom firewall-u:

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

Zatim omogućite usmjeravanje IP saobraćaja:

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

U korporativnom okruženju, vjerovatno će postojati podmreže i moramo reći ruterima kako da šalju pakete namijenjene našim VPN klijentima. Na komandnoj liniji izvršavamo naredbu na način (u zavisnosti od opreme koja se koristi):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

i sačuvajte konfiguraciju.

Pored toga, na interfejsu graničnog rutera gde se servira eksterna adresa gw.abc.ru, potrebno je dozvoliti prolaz udp/1194 paketa.

U slučaju da organizacija ima stroga sigurnosna pravila, firewall također mora biti konfigurisan na našem VPN serveru. Po mom mišljenju, najveću fleksibilnost pruža postavljanje iptables FORWARD lanaca, iako je njihovo postavljanje manje zgodno. Još malo o njihovom postavljanju. Da biste to učinili, najpogodnije je koristiti "direktna pravila" - direktna pravila, pohranjena u datoteci /etc/firewalld/direct.xml. Trenutna konfiguracija pravila može se pronaći na sljedeći način:

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

Prije promjene fajla, napravite njegovu sigurnosnu kopiju:

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

Približan sadržaj datoteke je:

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

Objašnjenja

Ovo su u suštini redovna pravila za iptables, inače pakirana nakon pojave firewalla.

Odredišni interfejs sa podrazumevanim postavkama je tun0, a spoljni interfejs za tunel može biti drugačiji, na primer, ens192, u zavisnosti od platforme koja se koristi.

Zadnji red je za evidentiranje ispuštenih paketa. Da bi evidentiranje funkcioniralo, morate promijeniti nivo otklanjanja grešaka u konfiguraciji firewalld-a:

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

Primjena postavki je uobičajena firewalld naredba za ponovno čitanje postavki:

$ sudo firewall-cmd --reload

Otpuštene pakete možete pogledati ovako:

grep forward_fw /var/log/messages

Šta sledi

Ovim je podešavanje završeno!

Ostaje samo da instalirate klijentski softver na strani klijenta, uvezete profil i povežete se. Za Windows operativne sisteme, distributivni komplet se nalazi na developer site.

Konačno, povezujemo naš novi server sa sistemima za praćenje i arhiviranje, i ne zaboravite da redovno instalirate ažuriranja.

Stabilna veza!

izvor: www.habr.com

Dodajte komentar