Organizacija udaljenog rada SMB organizacije na OpenVPN

Formuliranje problema

Članak opisuje organizaciju daljinskog pristupa za zaposlenike na proizvodima otvorenog koda i može se koristiti kako za izgradnju potpuno autonomnog sustava, tako i bit će koristan za proširenje kada postoji manjak licenci u postojećem komercijalnom sustavu ili njegove performanse nisu dovoljne.

Cilj članka je implementacija cjelovitog sustava za pružanje udaljenog pristupa organizaciji, što je malo više od “instalacije OpenVPN-a u 10 minuta”.

Kao rezultat, dobit ćemo sustav u kojem će se za autentifikaciju korisnika koristiti certifikati i (po izboru) korporativni Active Directory. Da. dobit ćemo sustav s dva faktora provjere - što imam (certifikat) i što znam (lozinka).

Znak da je korisniku dopušteno povezivanje je njegovo članstvo u grupi myVPNUsr. Tijelo za izdavanje certifikata koristit će se izvan mreže.

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

Koristit ćemo virtualni stroj s OpenVPN i Easy-RSA verzijom 3 na CetntOS 7, kojem su dodijeljena 100 vCPU-a i 4 GiB RAM-a na 4 veza.

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

Za spajanje izvana koristi se veza preko porta 1194/udp, a za naš poslužitelj je u DNS-u kreiran A-record gw.abc.ru.

Strogo se ne preporučuje isključivanje SELinuxa! OpenVPN radi bez onemogućavanja sigurnosnih pravila.

sadržaj

  1. Instalacija OS-a i aplikativnog softvera
  2. Postavljanje kriptografije
  3. Postavljanje OpenVPN-a
  4. AD autentifikacija
  5. Pokretanje i dijagnostika
  6. Izdavanje i opoziv certifikata
  7. Konfiguracija mreže
  8. što dalje

Instalacija OS-a i aplikativnog softvera

Koristimo distribuciju CentOS 7.8.2003. Moramo instalirati OS u minimalnoj konfiguraciji. Prikladno je to učiniti pomoću Kickstart, kloniranje prethodno instalirane slike OS-a i druga sredstva.

Nakon instalacije, dodjeljivanjem adrese mrežnom sučelju (prema uvjetima zadatka 172.16.19.123), ažuriramo OS:

$ sudo yum update -y && reboot

Također moramo biti sigurni da se sinkronizacija vremena izvodi na našem stroju.
Za instaliranje aplikacijskog softvera potrebni su vam paketi openvpn, openvpn-auth-ldap, easy-rsa i vim kao glavni editor (trebat će vam EPEL repozitorij).

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

Korisno je instalirati gostujućeg agenta za virtualni stroj:

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

Napravite datoteku varijable:

$ 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 ostaviti iz primjera. Najvažnija stvar u parametrima je zadnji redak koji određuje rok valjanosti certifikata u danima. Primjer koristi vrijednost 10 godina (365*10+2 prijestupne godine). Ovu će vrijednost trebati prilagoditi prije izdavanja korisničkih certifikata.

Zatim konfiguriramo autonomno tijelo za izdavanje certifikata.

Postavljanje uključuje izvoz varijabli, inicijaliziranje CA, izdavanje CA korijenskog ključa i certifikata, Diffie-Hellman ključa, TLS ključa te poslužiteljskog ključa i certifikata. CA ključ mora biti pažljivo zaštićen i tajan! 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

Time je završen glavni dio postavljanja kriptografskog mehanizma.

Postavljanje OpenVPN-a

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

Napravite glavnu OpenVPN konfiguracijsku datoteku:

$ sudo vim server.conf

sljedeće sadržaje

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 potvrde navedeno drugo ime, navesti ga;
  • navedite skup adresa koje odgovaraju vašim zadacima*;
  • može postojati jedna ili više ruta i DNS poslužitelja;
  • Zadnja 2 retka potrebna su za implementaciju autentifikacije u AD**.

*Raspon adresa odabranih u primjeru omogućit će do 127 klijenata da se povežu istovremeno, jer odabrana je mreža /23, a OpenVPN stvara podmrežu za svakog klijenta koristeći masku /30.
Ako je posebno potrebno, port i protokol se mogu promijeniti, međutim, treba imati na umu da će promjena broja porta porta podrazumijevati konfiguraciju SELinuxa, a korištenje tcp protokola će povećati troškove, jer Kontrola isporuke TCP paketa već se izvodi na razini paketa enkapsuliranih u tunelu.

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

AD autentifikacija

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

Potreban nam je račun u domeni s pravima običnog korisnika i grupe, članstvo u kojoj će odrediti mogućnost povezivanja.

Napravite konfiguracijsku datoteku:

/etc/openvpn/ldap.conf

sljedeće sadržaje

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

Osnovni podaci:

  • URL “ldap://ldap.abc.ru” - adresa kontrolera domene;
  • BindDN “CN=bindUsr,CN=Users,DC=abc,DC=ru” - kanonski naziv za vezanje na LDAP (UZ - bindUsr u spremniku abc.ru/Users);
  • Lozinka b1ndP@SS — korisnička lozinka za vezanje;
  • BaseDN “OU=allUsr,DC=abc,DC=ru” — staza s koje počinje traženje korisnika;
  • BaseDN “OU=myGrp,DC=abc,DC=ru” – spremnik dopuštajuće grupe (grupa myVPNUsr u spremniku abc.rumyGrp);
  • SearchFilter "(cn=myVPNUsr)" naziv je dopuštajuće grupe.

Pokretanje i dijagnostika

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

$ 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 druge postavke; vrlo je zgodno sve to zamotati u jednu datoteku profila. Ta se datoteka zatim prenosi korisniku, a profil se uvozi na OpenVPN klijent. Da bismo to učinili, izradit ćemo predložak postavki i skriptu koja generira profil.

Profilu morate dodati sadržaj datoteka korijenskog certifikata (ca.crt) i TLS ključa (ta.key).

Prije izdavanja korisničkih certifikata ne zaboravite postaviti potrebno razdoblje valjanosti za certifikate u datoteci s parametrima. Ne biste trebali trajati predugo; preporučujem da se ograničite na najviše 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>

Bilješke:

  • žice STAVI SVOJ... promijeniti sadržaj njihov potvrde;
  • u udaljenoj direktivi navedite naziv/adresu vašeg pristupnika;
  • direktiva auth-user-pass koristi se za dodatnu vanjsku provjeru autentičnosti.

U početnom imeniku (ili na 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

Pregledajte

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

Pregledajte izdane i opozvane certifikate

Za pregled izdanih i opozvanih certifikata jednostavno pogledajte indeksnu datoteku:

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

Objašnjenje:

  • prvi redak je certifikat poslužitelja;
  • prvi lik
    • V (Validan) - valjan;
    • R (Revoked) - opozvano.

Konfiguracija mreže

Posljednji koraci su konfiguracija prijenosne mreže - usmjeravanje i vatrozid.

Dopuštanje veza u lokalnom vatrozidu:

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

Zatim omogućite usmjeravanje IP prometa:

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

U poslovnom okruženju vjerojatno će postojati podmreža i moramo usmjerivačima reći kako da šalju pakete namijenjene našim VPN klijentima. Na naredbenom retku izvršavamo naredbu na način (ovisno o opremi koja se koristi):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

i spremite konfiguraciju.

Dodatno, na sučelju graničnog usmjerivača gdje se poslužuje vanjska adresa gw.abc.ru, potrebno je omogućiti prolaz udp/1194 paketa.

U slučaju da organizacija ima stroga sigurnosna pravila, vatrozid također mora biti konfiguriran na našem VPN poslužitelju. 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, najprikladnije je koristiti "izravna pravila" - izravna 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 datoteke napravite 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 biti redovita pravila za iptables, inače pakirana nakon pojave firewallda.

Odredišno sučelje sa zadanim postavkama je tun0, a vanjsko sučelje za tunel može biti drugačije, na primjer, ens192, ovisno o korištenoj platformi.

Posljednji red je za bilježenje odbačenih paketa. Da bi prijavljivanje radilo, trebate promijeniti razinu otklanjanja pogrešaka u konfiguraciji vatrozida:

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

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

$ sudo firewall-cmd --reload

Ispuštene pakete možete vidjeti ovako:

grep forward_fw /var/log/messages

što dalje

Ovo dovršava postavljanje!

Ostaje samo instalirati klijentski softver na strani klijenta, uvesti profil i spojiti se. Za Windows operativne sustave, distribucijski komplet se nalazi na stranica za programere.

Konačno, povezujemo naš novi server sa sustavima za praćenje i arhiviranje, i ne zaboravite redovito instalirati ažuriranja.

Stabilna veza!

Izvor: www.habr.com

Dodajte komentar