Organizarea lucrului de la distanță a unei organizații IMM-uri pe OpenVPN

Declarație de problemă

Articolul descrie organizarea accesului de la distanță pentru angajați pe produse open source și poate fi folosit atât pentru a construi un sistem complet autonom, cât și va fi util pentru extindere atunci când există un deficit de licențe în sistemul comercial existent sau performanța acestuia este insuficientă.

Scopul articolului este de a implementa un sistem complet pentru a oferi acces de la distanță unei organizații, care este puțin mai mult decât „instalarea OpenVPN în 10 minute”.

Ca urmare, vom obține un sistem în care certificatele și (opțional) Active Directory corporative vor fi folosite pentru autentificarea utilizatorilor. Acea. vom obține un sistem cu doi factori de verificare - ce am (certificat) și ce știu (parola).

Un semn că un utilizator are permisiunea de a se conecta este apartenența sa la grupul myVPNUsr. Autoritatea de certificare va fi utilizată offline.

Costul implementării soluției este doar resurse hardware mici și 1 oră de muncă a administratorului de sistem.

Vom folosi o mașină virtuală cu OpenVPN și Easy-RSA versiunea 3 pe CetntOS 7, căreia îi sunt alocate 100 vCPU-uri și 4 GiB RAM la 4 de conexiuni.

În exemplu, rețeaua organizației noastre este 172.16.0.0/16, în care serverul VPN cu adresa 172.16.19.123 se află în segmentul 172.16.19.0/24, serverele DNS 172.16.16.16 și 172.16.17.17 și 172.16.20.0 sub.23, și sub.XNUMX. .XNUMX/XNUMX este alocat pentru clienții VPN .

Pentru a vă conecta din exterior, se folosește o conexiune prin portul 1194/udp, iar un A-record gw.abc.ru a fost creat în DNS pentru serverul nostru.

Nu este strict recomandat să dezactivați SELinux! OpenVPN funcționează fără a dezactiva politicile de securitate.

Conținut

  1. Instalarea sistemului de operare și a aplicațiilor software
  2. Configurarea criptografiei
  3. Configurarea OpenVPN
  4. Autentificare AD
  5. Pornire și diagnosticare
  6. Eliberarea și revocarea certificatului
  7. Configurare rețea
  8. Ce urmează

Instalarea sistemului de operare și a aplicațiilor software

Folosim distribuția CentOS 7.8.2003. Trebuie să instalăm sistemul de operare într-o configurație minimă. Este convenabil să faceți acest lucru folosind pornire cu piciorul, clonând o imagine OS instalată anterior și alte mijloace.

După instalare, atribuirea unei adrese interfeței de rețea (conform termenilor sarcinii 172.16.19.123), actualizăm sistemul de operare:

$ sudo yum update -y && reboot

De asemenea, trebuie să ne asigurăm că sincronizarea orei este efectuată pe mașina noastră.
Pentru a instala aplicația software, aveți nevoie de pachetele openvpn, openvpn-auth-ldap, easy-rsa și vim ca editor principal (veți avea nevoie de depozitul EPEL).

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

Este util să instalați un agent invitat pentru o mașină virtuală:

$ sudo yum install open-vm-tools

pentru gazdele VMware ESXi sau pentru oVirt

$ sudo yum install ovirt-guest-agent

Configurarea criptografiei

Accesați directorul easy-rsa:

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

Creați un fișier variabil:

$ sudo vim vars

urmatorul continut:

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

Aici sunt descriși parametrii pentru organizarea condiționată ABC LLC; îi puteți corecta la cei reali sau îi puteți lăsa din exemplu. Cel mai important lucru în parametri este ultima linie, care determină perioada de valabilitate a certificatului în zile. Exemplul folosește valoarea 10 ani (365*10+2 ani bisecți). Această valoare va trebui ajustată înainte ca certificatele de utilizator să fie emise.

În continuare, vom configura o autoritate de certificare autonomă.

Configurarea include exportarea variabilelor, inițializarea CA, emiterea cheii și certificatului rădăcină CA, cheia Diffie-Hellman, cheia TLS și cheia și certificatul de server. Cheia CA trebuie protejată cu grijă și păstrată secretă! Toți parametrii de interogare pot fi lăsați implicit.

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

Aceasta completează partea principală a instalării mecanismului criptografic.

Configurarea OpenVPN

Accesați directorul OpenVPN, creați directoare de servicii și adăugați un link către 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/

Creați fișierul principal de configurare OpenVPN:

$ sudo vim server.conf

următorul conținut

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

Câteva note despre parametri:

  • dacă la emiterea certificatului a fost specificat un alt nume, indicați-l;
  • specificați grupul de adrese care să se potrivească sarcinilor dvs.*;
  • pot exista una sau mai multe rute și servere DNS;
  • Ultimele 2 linii sunt necesare pentru a implementa autentificarea în AD**.

*Gama de adrese selectată în exemplu va permite până la 127 de clienți să se conecteze simultan, deoarece este selectată rețeaua /23 și OpenVPN creează o subrețea pentru fiecare client folosind masca /30.
Dacă este deosebit de necesar, portul și protocolul pot fi schimbate, totuși, trebuie avut în vedere că schimbarea numărului portului va presupune configurarea SELinux, iar utilizarea protocolului tcp va crește supraîncărcarea, deoarece Controlul livrării pachetelor TCP este deja efectuat la nivelul pachetelor încapsulate în tunel.

**Dacă nu este necesară autentificarea în AD, comentați-le, omiteți următoarea secțiune și în șablon eliminați linia auth-user-pass.

Autentificare AD

Pentru a susține al doilea factor, vom folosi verificarea contului în AD.

Avem nevoie de un cont în domeniul cu drepturi de utilizator obișnuit și de un grup, apartenența la care va determina capacitatea de conectare.

Creați un fișier de configurare:

/etc/openvpn/ldap.conf

următorul conținut

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

Основен параметры:

  • URL „ldap://ldap.abc.ru” - adresa controlerului de domeniu;
  • BindDN „CN=bindUsr,CN=Users,DC=abc,DC=ru” - nume canonic pentru legarea la LDAP (UZ - bindUsr în containerul abc.ru/Users);
  • Parola b1ndP@SS — parola de utilizator pentru legare;
  • BaseDN „OU=allUsr,DC=abc,DC=ru” — calea de la care să începeți căutarea utilizatorului;
  • BaseDN „OU=myGrp,DC=abc,DC=ru” – container al grupului de autorizare (grup myVPNUsr în containerul abc.rumyGrp);
  • SearchFilter „(cn=myVPNUsr)” este numele grupului care permite.

Pornire și diagnosticare

Acum putem încerca să activăm și să pornim serverul nostru:

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

Verificare la pornire:

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

Eliberarea și revocarea certificatului

Deoarece Pe lângă certificatele în sine, aveți nevoie de chei și alte setări; este foarte convenabil să includeți toate acestea într-un singur fișier de profil. Acest fișier este apoi transferat utilizatorului și profilul este importat pe clientul OpenVPN. Pentru a face acest lucru, vom crea un șablon de setări și un script care generează profilul.

Trebuie să adăugați conținutul fișierelor certificatului rădăcină (ca.crt) și cheii TLS (ta.key) la profil.

Înainte de eliberarea certificatelor de utilizator nu uitați să setați perioada de valabilitate necesară pentru certificate în fișierul de parametri. Nu ar trebui să-l lungiți prea mult; vă recomand să vă limitați la maximum 180 de zile.

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>

Note:

  • linii PUNE-TI... schimbare la conținut a lor certificate;
  • în directiva la distanță, specificați numele/adresa gateway-ului dvs.;
  • directiva auth-user-pass este utilizată pentru autentificare externă suplimentară.

În directorul principal (sau alt loc convenabil) creăm un script pentru solicitarea unui certificat și crearea unui profil:

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 ~

Faceți fișierul executabil:

chmod a+x ~/make.profile.sh

Și putem emite primul nostru certificat.

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

Revizuirea

În cazul compromiterii unui certificat (pierdere, furt), este necesară revocarea acestui certificat:

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

Vedeți certificatele emise și revocate

Pentru a vedea certificatele emise și revocate, pur și simplu vizualizați fișierul index:

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

Explicație:

  • prima linie este certificatul serverului;
  • primul personaj
    • V (Valid) - valabil;
    • R (Revocat) - rechemat.

Configurare rețea

Ultimii pași sunt configurarea rețelei de transmisie - rutare și firewall-uri.

Permiterea conexiunilor în firewall-ul local:

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

Apoi, activați rutarea traficului IP:

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

Într-un mediu corporativ, este probabil să existe subrețea și trebuie să spunem ruterului (ruterelor) cum să trimită pachete destinate clienților noștri VPN. Pe linia de comandă executăm comanda în modul (în funcție de echipamentul utilizat):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

și salvați configurația.

În plus, pe interfața routerului de frontieră unde este deservită adresa externă gw.abc.ru, este necesar să se permită trecerea pachetelor udp/1194.

În cazul în care organizația are reguli stricte de securitate, trebuie configurat și un firewall pe serverul nostru VPN. În opinia mea, cea mai mare flexibilitate este oferită de configurarea lanțurilor iptables FORWARD, deși configurarea lor este mai puțin convenabilă. Mai multe despre configurarea lor. Pentru a face acest lucru, este cel mai convenabil să folosiți „reguli directe” - reguli directe, stocate într-un fișier /etc/firewalld/direct.xml. Configurația actuală a regulilor poate fi găsită după cum urmează:

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

Înainte de a schimba un fișier, faceți o copie de rezervă a acestuia:

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

Conținutul aproximativ al fișierului este:

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

explicații

Acestea sunt în esență reguli obișnuite pentru iptables, altfel ambalate după apariția firewalld.

Interfața de destinație cu setări implicite este tun0, iar interfața externă pentru tunel poate fi diferită, de exemplu, ens192, în funcție de platforma utilizată.

Ultima linie este pentru înregistrarea pachetelor abandonate. Pentru ca înregistrarea să funcționeze, trebuie să modificați nivelul de depanare în configurația firewalld:

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

Aplicarea setărilor este comanda obișnuită firewalld pentru a reciti setările:

$ sudo firewall-cmd --reload

Puteți vizualiza pachetele aruncate astfel:

grep forward_fw /var/log/messages

Ce urmează

Aceasta completează configurarea!

Tot ce rămâne este să instalați software-ul client pe partea client, să importați profilul și să vă conectați. Pentru sistemele de operare Windows, kitul de distribuție se află pe site-ul dezvoltatorului.

În cele din urmă, conectăm noul nostru server la sistemele de monitorizare și arhivare și nu uităm să instalăm în mod regulat actualizări.

Conexiune stabilă!

Sursa: www.habr.com

Adauga un comentariu