Formularea problemei
Articolul descrie organizarea accesului de la distanță al angajaților pe produse open source și poate fi utilizat atât pentru construirea unui sistem complet autonom, cât și pentru extinderea acestuia atunci când în sistemul comercial existent există o lipsă de licențe sau performanța acestuia devine insuficientă.
Scopul articolului este de a implementa un sistem complet de furnizare a accesului de la distanță pentru organizație, ceea ce este puțin mai mult decât „instalarea OpenVPN în 10 minute”.
În rezultat, vom obține un sistem în care pentru autentificarea utilizatorilor se vor utiliza certificate și (opțional) un director corporativ Active Directory. Astfel, vom avea un sistem cu două componente de verificare — ceva ce am (certificatul) și ceva ce știu (parola).
Semnul că utilizatorului i se permite conectarea este apartenența sa la grupul myVPNUsr. Centrul de certificare va fi folosit în mod autonom.
Costul implementării soluției este doar resurse hardware minime și 1 oră de lucru a administratorului de sistem.
Vom folosi o mașină virtuală cu OpenVPN și Easy-RSA versiunea 3 pe CentOS 7, care, conform calculelor pentru 100 de conexiuni, are alocate 4 vCPU și 4 GiB RAM.
În exemplu, rețeaua organizației noastre este 172.16.0.0/16, în care serverul VPN cu adresa 172.16.19.123 este situat în segmentul 172.16.19.0/24, serverele DNS 172.16.16.16 și 172.16.17.17, iar pentru clienții VPN este alocată subrețeaua 172.16.20.0/23.
Pentru conectarea din exterior se utilizează conexiunea pe portul 1194/udp, iar în DNS pentru serverul nostru a fost creat un A-record gw.abc.ro.
Se recomandă categoric să nu dezactivați SELinux! OpenVPN funcționează fără a dezactiva politicile de securitate.
Cuprins
Instalarea OS-ului și a aplicației
Folosim distribuția CentOS 7.8.2003. Avem nevoie de instalarea OS-ului în configurație minimă. Este convenabil să facem acest lucru folosind , clonarea unei imagini OS instalate anterior și alte metode.
După instalare, atribuirea unei adrese interfeței de rețea (conform cerințelor 172.16.19.123), executăm actualizarea OS-ului:
$ sudo yum update -y && reboot
De asemenea, este necesar să ne asigurăm că pe mașina noastră se realizează sincronizarea timpului.
Pentru instalarea aplicației sunt necesare pachetele openvpn, openvpn-auth-ldap, easy-rsa și vim ca editor principal (va fi necesar repository EPEL).
$ sudo yum install epel-release
$ sudo yum install openvpn openvpn-auth-ldap easy-rsa vim
Pentru mașina virtuală, este util să instalăm agentul gazdă:
$ sudo yum install open-vm-toolspentru gazde VMware ESXi sau pentru oVirt
$ sudo yum install ovirt-guest-agent
Configurarea criptografiei
Trecem în directorul easy-rsa:
$ cd /usr/share/easy-rsa/3/Creăm fișierul de variabile:
$ sudo vim varsusers.module.ts
export KEY_COUNTRY="RO"
export KEY_PROVINCE="Regiunea Mea"
export KEY_CITY="Orașul Meu"
export KEY_ORG="ABC SRL"
export KEY_EMAIL="admin@abc.ro"
export KEY_CN="toțiUtilizatorii"
export KEY_OU="toțiUtilizatorii"
export KEY_NAME="gw.abc.ro"
export KEY_ALTNAMES="abc-openvpn-server"
export EASYRSA_CERT_EXPIRE=3652
Aici sunt descrise parametrii pentru organizația fictivă SRL „ABC”, îi puteți corecta cu datele reale sau le puteți lăsa din exemplu. Cel mai important în parametri este ultima linie, care determină durata de valabilitate a certificatului în zile. În exemplu este folosită valoarea de 10 ani (365*10+2 ani bisecți). Această valoare trebuie ajustată înainte de a emite certificatele pentru utilizatori.
Apoi configurăm centrul de certificare autonom.
Configurarea include exportul de variabile, inițializarea CA, emiterea cheilor și certificatului de rădăcină CA, cheia Diffie-Hellman, cheia TLS, precum și cheia și certificatul serverului. Cheia centrului de certificare trebuie protejată cu strictețe și păstrată în secret! Toți parametrii la cereri 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
La acest punct, partea principală a configurării mecanismului criptografic s-a încheiat.
Configurarea OpenVPN-ului
Trecem în directorul OpenVPN, creăm directoare de îngrijire și adăugăm 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/
Creăm fișierul principal de configurare OpenVPN:
$ sudo vim server.confcu 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 observații privind parametrii:
- dacă la emiterea certificatului a fost specificat un alt nume — indicați-l;
- piscina de adrese trebuie stabilită în funcție de necesitățile dumneavoastră*;
- rutele și serverele DNS pot fi una sau mai multe;
- 2 ultimele linii sunt necesare pentru implementarea autentificării în AD**.
*Intervalul de adrese selectat în exemplu permite conectarea simultană a până la 127 clienți, deoarece a fost ales rețeaua /23, iar OpenVPN creează pentru fiecare client o subrețea cu masca /30.
În caz de necesitate specială, portul și protocolul pot fi schimbate, însă trebuie să țineți cont că schimbarea numărului portului va impune configurarea SELinux, iar utilizarea protocolului tcp va crește costurile, deoarece controlul livrării pachetelor tcp este deja efectuat la nivelul pachetelor încapsulate în tunel.
**Dacă autentificarea în AD nu este necesară, comentați-le, săritți secțiunea următoare — și în șablon ștergeți linia auth-user-pass.
Autentificarea în AD
Pentru a susține al doilea factor, vom utiliza verificarea contului în AD.
Avem nevoie de un cont în domeniu cu drepturi de utilizator obișnuit și un grup, iar apartenența va determina capacitatea de conectare.
Creăm fișierul de configurare:
/etc/openvpn/ldap.confcu următorul conținut
URL "ldap://ldap.abc.ro"
BindDN "CN=bindUsr,CN=Users,DC=abc,DC=ro"
Password b1ndP@SS
Timeout 15
TLSEnable no
FollowReferrals yes
BaseDN "OU=allUsr,DC=abc,DC=ro"
SearchFilter "(sAMAccountName=%u)"
RequireGroup true
BaseDN "OU=myGrp,DC=abc,DC=ro"
SearchFilter "(cn=myVPNUsr)"
MemberAttribute "member"
Parametrii principali:
- URL „ldap://ldap.abc.ro” — adresa controlerului de domeniu;
- BindDN „CN=bindUsr,CN=Users,DC=abc,DC=ro” — numele canonic pentru conectarea la LDAP (UZ — bindUsr în containerul abc.ro/Users);
- Password b1ndP@SS — parola utilizatorului pentru conectare;
- BaseDN „OU=allUsr,DC=abc,DC=ro” — calea de la care se începe căutarea utilizatorului;
- BaseDN „OU=myGrp,DC=abc,DC=ro” — containerul grupului autorizat (grupul myVPNUsr în containerul abc.ro/myGrp);
- SearchFilter "(cn=myVPNUsr)" — numele grupului autorizat.
Pornirea și diagnosticarea
Acum putem încerca să activăm și să pornim serverul nostru:
$ sudo systemctl enable openvpn@server.service
$ sudo systemctl start openvpn@server.service
Verificarea pornirii:
systemctl status openvpn@server.service
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log
Emiterea și revocarea certificatului
deoarece pe lângă certificatele în sine sunt necesare cheile și celelalte setări, este foarte convenabil să învăluim toate acestea într-un singur fișier de profil. Acest fișier este apoi transmis utilizatorului, iar profilul este importat pe clientul OpenVPN. Pentru aceasta, vom crea un șablon de configurare și un script care formează profilul.
În profil trebuie adăugat conținutul fișierelor certificatul rădăcină (ca.crt) și cheia TLS (ta.key).
Înainte de a elibera certificatele utilizatorilor nu uitați să stabiliți termenul de valabilitate al certificatelor în fișierul de parametrii. Nu ar trebui să fie prea mare, recomand să 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.ovpnclient
dev tun
proto udp
remote gw.abc.ro 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-----
Observații:
- stringi PUT YOUR… schimbăm cu conținutul al dvs. certificatelor;
- în directiva remote, specificați numele/adresa gateway-ului dvs.;
- directiva auth-user-pass este utilizată pentru autentificarea externă suplimentară.
În directorul home (sau într-un loc convenabil), creează un script pentru cererea certificatului și crearea profilului:
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 ~
Facem fișierul executabil:
chmod a+x ~/make.profile.shȘi putem elibera primul nostru certificat.
~/make.profile.sh my-first-userRecenzie
În cazul compromiterii certificatului (pierderea, furtul), este necesar să revocați acest certificat:
cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl
Vizualizarea certificatelor eliberate și revocate
Pentru a vizualiza certificatele eliberate și revocate, este suficient să verifici fișierul index:
cd /usr/share/easy-rsa/3/
cat pki/index.txt
Explicații:
- prima linie conține certificatul serverului;
- primul caracter
- V (Valid) — valid;
- R (Revoked) — revocat.
Configurarea rețelei
Ultimii pași — configurarea rețelei de transmisie — rutare și firewall-uri.
Permisiunea conexiunilor în firewall-ul local:
$ sudo firewall-cmd --add-service=openvpn
$ sudo firewall-cmd --add-service=openvpn --permanent
Apoi, activăm rutarea traficului IP:
$ sudo sysctl net.ipv4.ip_forward=1
$ sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/50-sysctl.conf
În mediul corporativ există cu siguranță divizarea în subrețele și trebuie să informăm routerul(-ele) cum să trimită pachetele destinate clienților noștri VPN. În linia de comandă executăm comanda în stilul (depinde de echipamentul utilizat):
# ip route 172.16.20.0 255.255.254.0 172.16.19.123și salvăm configurația.
În plus, pe interfața routerului de frontieră, care gestionează adresa externă gw.abc.ro, trebuie să permiteți trecerea pachetelor udp/1194.
În cazul în care organizația are reguli stricte de securitate, este necesar să configurăm și un firewall pe serverul nostru VPN. Din punctul meu de vedere, cea mai mare flexibilitate o oferă configurarea lanțurilor iptables FORWARD, deși este mai puțin convenabil să le configurăm. Iată câteva informații despre configurarea lor. Cel mai ușor este să folosești „reguli directe” - direct rules, stocate într-un fișier. /etc/firewalld/direct.xml. Configurația actuală a regulilor poate fi verificată astfel:
$ sudo firewall-cmd --direct --get-all-ruleÎnainte de a modifica fișierul, fă o copie de rezervă:
cp /etc/firewalld/direct.xml /etc/firewalld/direct.xml.`date +%F.%T`.bakConținutul aproximativ al fișierului este următorul:
-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 '
Explicații
Practic, acestea sunt reguli obișnuite iptables, doar ambalate după apariția firewalld.
Interfața de destinație în setările implicite este tun0, iar cea externă pentru tunel poate fi diferită, de exemplu, ens192, în funcție de platforma utilizată.
Ultima linie este destinată înregistrării pachetelor respinse. Pentru ca înregistrarea să funcționeze, la configurația firewalld trebuie să modifici nivelul de depanare:
vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2
Aplicarea setărilor - comanda obișnuită firewalld pentru a reîncărca setările:
$ sudo firewall-cmd --reloadPachetele respinse pot fi vizualizate astfel:
grep forward_fw /var/log/messages
Ce urmează
Aceasta este finalizarea configurării!
Rămâne să instalăm software-ul client pe partea clientului, să importăm profilul și să ne conectăm. Pentru sistemele de operare de tip Windows, distribuția este disponibilă pe .
În final, conectăm noul nostru server la sistemele de monitorizare și arhivare, și nu uităm să instalăm actualizări regulat.
Connect stabil!
Sursa: habr.com
