
Problematica
Cu câteva luni în urmă, mulți nu știau ce înseamnă să lucrezi de acasă. Pandemia a schimbat brusc situația din lume, toți au început să se adapteze la circumstanțele create, și anume faptul că ieșirea din casă a devenit pur și simplu nesigură. Și mulți au fost nevoiți să organizeze rapid munca de acasă pentru angajații lor.
Cu toate acestea, lipsa unei abordări competente în alegerea soluțiilor pentru munca la distanță poate duce la pierderi grave. Parolele utilizatorilor pot fi furate, oferind astfel atacatorilor posibilitatea de a se conecta nestăvilit la rețea și la resursele IT ale întreprinderii.
De aceea, acum a crescut nevoia de a crea rețele corporative VPN fiabile. Voi vorbi despre fiabilă, sigur și simplă VPN de utilizare.
Aceasta funcționează pe baza schemei IPsec/L2TP, utilizând pentru autentificare chei și certificate neretractabile, stocate pe tokenuri, și transmit datele prin rețea într-o formă criptată.
Ca standuri demonstrative pentru configurare, au fost folosite un server cu CentOS 7 (adresă: centos.vpn.server.ad) și un client cu Ubuntu 20.04, precum și un client cu Windows 10.
Descrierea sistemului
VPN-ul va funcționa pe schema IPSec + L2TP + PPP. Protocolul Point-to-Point Protocol (PPP) funcționează la nivelul canalului modelului OSI și asigură autentificarea utilizatorilor și criptarea datelor transmise. Datele sale sunt encapsulate în datele protocolului L2TP, care, în esență, asigură crearea unei conexiuni în rețeaua VPN, dar nu asigură autentificarea și criptarea.
Datele L2TP sunt encapsulate în protocolul IPSec, care, de asemenea, asigură autentificarea și criptarea, dar, spre deosebire de protocolul PPP, autentificarea și criptarea se realizează la nivelul dispozitivelor, nu la nivelul utilizatorilor.
Această caracteristică permite autentificarea utilizatorilor doar de pe anumite dispozitive. Noi vom folosi protocolul IPSec ca atare și vom permite autentificarea utilizatorilor de pe orice dispozitiv.

Autentificarea utilizatorului cu ajutorul cardurilor smart se va face la nivelul protocolului PPP utilizând protocolul EAP-TLS.
Informații mai detaliate despre funcționarea acestei scheme pot fi găsite în .
De ce această schemă îndeplinește toate cele trei cerințe ale unei rețele VPN bune
- Fiabilitatea acestei scheme a fost demonstrată de timp. Aceasta este folosită pentru implementarea rețelelor VPN din anul 2000.
- Protocul PPP asigură o autentificare sigură a utilizatorului. nu oferă un nivel suficient de securitate, deoarece pentru autentificare se utilizează, în cel mai bun caz, un sistem bazat pe utilizator și parolă. Toți știm că utilizatorul și parola pot fi zaruriți, ghiciți sau furate. Totuși, dezvoltatorul în a corectat această problemă și a adăugat posibilitatea de a utiliza protocoale bazate pe criptarea asimetrică pentru autentificare, cum ar fi EAP-TLS. În plus, a adăugat suport pentru cardurile inteligente în procesul de autentificare, ceea ce a făcut sistemul mai sigur.
În prezent, se poartă negocieri active pentru fuziunea acestor două proiecte și putem fi siguri că, mai devreme sau mai târziu, acest lucru se va întâmpla. De exemplu, în repozitoarele Fedora există de mult o versiune patch-uită a PPP care utilizează protocoale de autentificare sigure. - Încă relativ recent, această rețea putea fi utilizată doar de utilizatorii Windows, dar colegii noștri de la MGU, Vasiliy Șokov și Alexander Smirnov, au găsit și l-au actualizat. Prin eforturi comune, am corectat numeroase erori și neajunsuri în funcționarea clientului și am simplificat instalarea și configurarea sistemului, chiar și la compilarea din surse. Cele mai semnificative dintre ele sunt:
- Problemele de compatibilitate ale vechiului client cu interfața noilor versiuni de openssl și qt au fost corectate.
- Transmiterea PIN-ului pppd al tokenului printr-un fișier temporar a fost eliminată.
- Pornirea incorectă a programului de solicitare a parolei prin intermediul interfeței grafice a fost corectată. Acest lucru s-a realizat prin configurarea unui mediu adecvat pentru serviciul xl2tpd.
- Compilarea demonului L2tpIpsecVpn se face acum împreună cu compilarea clientului în sine, facilitând procesul de compilare și configurare.
- Pentru confortul dezvoltării, a fost conectat sistemul Azure Pipelines pentru a testa corectitudinea compilării.
- A fost adăugată posibilitatea de a reduce forțat în contextul openssl. Aceasta este utilă pentru suportul corect al noilor sisteme de operare, unde nivelul de securitate standard este setat la 2, atunci când se utilizează rețele VPN cu certificate care nu îndeplinesc cerințele de securitate pentru acest nivel. Această opțiune va fi utilă pentru lucrul cu rețele VPN vechi deja existente.
Versiunea corectată poate fi găsită în .
Acest client suportă utilizarea cardurilor inteligente pentru autentificare și ascunde toate dificultățile și neplăcerile configurării acestei scheme pe Linux, făcând configurarea clientului cât mai simplă și rapidă.
Desigur, pentru o conexiune convenabilă între PPP și GUI clientul, nu a fost evitată și ajustarea suplimentară a fiecărui proiect, dar cu toate acestea, acestea au fost minimizate:
- eroarea care provoca o întârziere semnificativă la deschiderea site-urilor în situația în care utilizarea WPAD și DoH era configurată simultan.
- eroarea care provoca o întârziere semnificativă la deschiderea site-urilor în situația în care utilizarea WPAD și DoH era configurată simultan. . Această eroare nu permitea încărcarea din fișierul local /etc/ppp/openssl.cnf a configurației nimic altceva decât informațiile despre motoarele openssl pentru lucrul cu cardurile inteligente, ceea ce reprezenta o serioasă neplăcere, dacă, de exemplu, în afară de informația despre motoare, doream să stabilim și altceva. De exemplu, să fixăm nivelul de securitate la stabilirea conexiunii.
Acum putem începe configurarea.
Configurarea serverului
Vom instala toate pachetele necesare.
Instalarea strongswan (IPsec)
În primul rând, vom configura firewall-ul pentru a funcționa cu ipsec
sudo firewall-cmd --permanent --add-port=1701/{tcp,udp}
sudo firewall-cmd --permanent --add-service=ipsec
sudo firewall-cmd --reloadApoi, vom continua cu instalarea
sudo yum install epel-release ipsec-tools dnf
sudo dnf install strongswanDupă instalare, este necesar să setăm configurația pentru strongswan (una dintre implementările IPSec). Pentru aceasta, vom edita fișierul /etc/strongswan/ipsec.conf :
config setup
nat_traversal=yes
virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
oe=off
protostack=netkey
conn L2TP-PSK-NAT
rightsubnet=vhost:%priv
also=L2TP-PSK-noNAT
conn L2TP-PSK-noNAT
authby=secret
pfs=no
auto=add
keyingtries=3
rekey=no
ikelifetime=8h
keylife=1h
type=transport
left=%any
leftprotoport=udp/1701
right=%any
rightprotoport=udp/%any
ike=aes128-sha1-modp1536,aes128-sha1-modp1024,aes128-md5-modp1536,aes128-md5-modp1024,3des-sha1-modp1536,3des-sha1-modp1024,3des-md5-modp1536,3des-md5-modp1024
esp=aes128-sha1-modp1536,aes128-sha1-modp1024,aes128-md5-modp1536,aes128-md5-modp1024,3des-sha1-modp1536,3des-sha1-modp1024,3des-md5-modp1536,3des-md5-modp1024De asemenea, vom stabili o parolă comună pentru autentificare. Parola comună trebuie să fie cunoscută de toți participanții la rețea pentru autentificare. Această metodă este, prin urmare, într-adevăr nesigură, deoarece parola poate fi ușor aflată de persoane căror nu dorim să le oferim acces la rețea.
Cu toate acestea, chiar și acest fapt nu va afecta securitatea organizației rețelei, deoarece criptarea principală a datelor și autentificarea utilizatorilor se efectuează prin protocolul PPP. Dar, ca o observație onestă, strongswan suportă tehnologii mai sigure pentru autentificare, de exemplu, prin folosirea cheilor private. De asemenea, în strongswan există posibilitatea asigurării autentificării prin carduri inteligente, dar deocamdată este suportat un număr limitat de dispozitive, astfel că autentificarea prin tokenuri și cardurile inteligente Rutoken este momentan dificilă. Să stabilim parola comună printr-un fișier. /etc/strongswan/ipsec.secrets:
# ipsec.secrets - strongSwan IPsec secrets file
%any %any : PSK "SECRET_PASSPHRASE"Să repornim strongswan:
sudo systemctl enable strongswan
sudo systemctl restart strongswanInstalarea xl2tp
sudo dnf install xl2tpdSă-l configurăm prin intermediul fișierului /etc/xl2tpd/xl2tpd.conf:
[global]
force userspace = yes
listen-addr = 0.0.0.0
ipsec saref = yes
[lns default]
exclusive = no
; definește adresa statică a serverului în rețeaua virtuală
local ip = 100.10.10.1
; stabilește intervalul de adrese virtuale
ip range = 100.10.10.1-100.10.10.254
assign ip = yes
refuse pap = yes
require authentication = yes
; această opțiune poate fi dezactivată după ce rețeaua a fost configurată cu succes
ppp debug = yes
length bit = yes
pppoptfile = /etc/ppp/options.xl2tpd
; indică adresa serverului în rețea
name = centos.vpn.server.adSă repornim serviciul:
sudo systemctl enable xl2tpd
sudo systemctl restart xl2tpdConfigurarea PPP
Este recomandat să instalăm cea mai recentă versiune de pppd. Pentru aceasta, să executăm următoarea secvență de comenzi:
sudo yum install git make gcc openssl-devel
git clone "https://github.com/jjkeijser/ppp"
cd ppp
./configure --prefix /usr
make -j4
sudo make installIntroduceți în fișier /etc/ppp/options.xl2tpd următoarele (dacă există deja unele valori, acestea pot fi șterse):
ipcp-accept-local
ipcp-accept-remote
ms-dns 8.8.8.8
ms-dns 1.1.1.1
noccp
auth
crtscts
idle 1800
mtu 1410
mru 1410
nodefaultroute
debug
lock
proxyarp
connect-delay 5000Emiterea certificatului rădăcină și a certificatului serverului:
#директория с сертификатами пользователей, УЦ и сервера
sudo mkdir /etc/ppp/certs
#директория с закрытыми ключами сервера и УЦ
sudo mkdir /etc/ppp/keys
#запрещаем любой доступ к этой дирректории кроме администатора
sudo chmod 0600 /etc/ppp/keys/
#генерируем ключ и выписываем сертификат УЦ
sudo openssl genrsa -out /etc/ppp/keys/ca.pem 2048
sudo openssl req -key /etc/ppp/keys/ca.pem -new -x509 -out /etc/ppp/certs/ca.pem -subj "/C=RU/CN=L2TP CA"
#генерируем ключ и выписываем сертификат сервера
sudo openssl genrsa -out /etc/ppp/keys/server.pem 2048
sudo openssl req -new -out server.req -key /etc/ppp/keys/server.pem -subj "/C=RU/CN=centos.vpn.server.ad"
sudo openssl x509 -req -in server.req -CAkey /etc/ppp/keys/ca.pem -CA /etc/ppp/certs/ca.pem -out /etc/ppp/certs/server.pem -CAcreateserialAstfel, am terminat cu configurarea de bază a serverului. Restul configurației serverului este legat de adăugarea de noi clienți.
Adăugarea unui nou client
Pentru a adăuga un nou client în rețea, este necesar să înregistrați certificatul său în lista celor de încredere pentru acel client.
Dacă utilizatorul dorește să devină membru al rețelei VPN, acesta creează o pereche de chei și o cerere de certificat pentru acest client. Dacă utilizatorul este de încredere, cererea poate fi semnată, iar certificatul obținut poate fi salvat în directorul certificatelor:
sudo openssl x509 -req -in client.req -CAkey /etc/ppp/keys/ca.pem -CA /etc/ppp/certs/ca.pem -out /etc/ppp/certs/client.pem -CAcreateserialSă adăugăm o linie în fișierul /etc/ppp/eaptls-server pentru a corela numele clientului cu certificatul său:
"client" * /etc/ppp/certs/client.pem /etc/ppp/certs/server.pem /etc/ppp/certs/ca.pem /etc/ppp/keys/server.pem *NOTĂ
Pentru a nu vă încurca, este mai bine ca: Common Name, numele fișierului certificatului și numele utilizatorului să fie unice.
De asemenea, este bine să verificați că în alte fișiere de autentificare nu figurează numele utilizatorului pe care îl adăugăm, altfel vor apărea probleme cu metoda de autentificare a utilizatorului.
Acest certificat trebuie trimis înapoi utilizatorului.
Generarea unei perechi de chei și a unui certificat
Pentru o autentificare de succes, clientul trebuie să:
- găsească o pereche de chei;
- să aibă certificat rădăcină de la CA;
- să aibă certificat pentru perechea sa de chei, semnat de CA-ul rădăcină.
pentru clienți pe Linux
Mai întâi, să generăm o pereche de chei pe token și să creăm o cerere de certificat:
#идентификатор ключа (параметр --id) можно заменить на любой другой.
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type rsa:2048 -l --id 45
openssl
OpenSSL> engine dynamic -pre SO_PATH:/usr/lib/x86_64-linux-gnu/engines-1.1/pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:librtpkcs11ecp.so
...
OpenSSL> req -engine pkcs11 -new -key 45 -keyform engine -out client.req -subj "/C=RU/CN=client"Trimiteți cererea apărută client.req la CA. După ce primiți certificat pentru perechea dvs. de chei, salvați-l pe token cu același id ca și cheia:
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l -y cert -w ./client.pem --id 45pentru clienți Windows și Linux (metodă mai universală)
Această metodă este mai universală, deoarece permite generarea unei chei și a unui certificat, care va fi recunoscut cu succes de utilizatorii Windows și Linux, dar necesită o mașină pe Windows pentru a desfășura procedura de generare a cheilor.
Înainte de generarea cererilor și importarea certificatelor, este necesar să adăugați certificatul rădăcină al rețelei VPN în lista certificatelor de încredere. Pentru aceasta, deschideți-l și în fereastra care apare, selectați opțiunea "Instalare certificat":

În fereastra care apare, alegeți instalarea certificatului pentru utilizatorul local:

Vom instala certificatul în magazinul de certificate rădăcină de încredere ale CA:

După toate aceste acțiuni, suntem de acord cu toate punctele ulterioare. Acum sistemul este configurat.
Să creăm un fișier cert.tmp cu următorul conținut:
[NewRequest]
Subject = "CN=client"
KeyLength = 2048
KeySpec = "AT_KEYEXCHANGE"
ProviderName = "Microsoft Base Smart Card Crypto Provider"
KeyUsage = "CERT_KEY_ENCIPHERMENT_KEY_USAGE"
KeyUsageProperty = "NCRYPT_ALLOW_DECRYPT_FLAG"
RequestType = PKCS10
SMIME = FALSEDupă aceasta, vom genera o pereche de chei și vom crea o cerere de certificat. Pentru aceasta, vom deschide PowerShell și vom introduce următoarea comandă:
certreq.exe -new -pin $PIN .cert.tmp .client.reqTrimiteți cererea creată client.req către CA-ul vostru și așteptați să primiți certificatul client.pem. Acesta poate fi scris pe token și adăugat în magazinul de certificate Windows folosind următoarea comandă:
certreq.exe -accept .client.pemMerită menționat că acțiuni similare pot fi efectuate prin intermediul interfeței grafice a programului mmc, dar această metodă este mai consumatoare de timp și mai puțin programabilă.
Configurarea clientului Ubuntu
NOTĂ
Configurarea clientului pe Linux este în prezent destul de consumatoare de timp, deoarece necesită construirea unor programe separate din sursă. Ne străduim să obținem cât mai curând ca toate modificările să fie incluse în repository-urile oficiale.
Pentru a asigura conectivitatea la server la nivel IPSec, se folosește pachetul strongswan și demonul xl2tp. Pentru a simplifica conectarea la rețea folosind smartcarduri, vom folosi pachetul l2tp-ipsec-vpn, care oferă o interfață grafică pentru facilitarea configurării conexiunii.
Să începem să asamblăm elementele pas cu pas, dar înainte de aceasta să instalăm toate pachetele necesare pentru funcționarea VPN-ului:
sudo apt-get install xl2tpd strongswan libp11-3Instalarea software-ului pentru lucrul cu tokenuri
Instalați cea mai recentă versiune a bibliotecii librtpkcs11ecp.so cu , de asemenea, bibliotecile pentru lucrul cu smartcarduri:
sudo apt-get install pcscd pcsc-tools opensc libengine-pkcs11-opensslConectați RutuToken și verificați că acesta este recunoscut de sistem:
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O -lInstalarea ppp-ului patch-uit
sudo apt-get -y install git make gcc libssl-dev
git clone "https://github.com/jjkeijser/ppp"
cd ppp
./configure --prefix /usr
make -j4
sudo make installInstalarea clientului L2tpIpsecVpn
În prezent, clientul trebuie, de asemenea, construit din surse. Acest lucru se face folosind următoarea secvență de comenzi:
sudo apt-get -y install git qt5-qmake qt5-default build-essential libctemplate-dev libltdl-dev
git clone "https://github.com/Sander80/l2tp-ipsec-vpn"
cd l2tp-ipsec-vpn
make -j4
sudo make installConfigurarea clientului L2tpIpsecVpn
Lansați clientul instalat:

După lansare, ar trebui să vi se deschidă appletul L2tpIpsecVPN. Faceți clic dreapta pe acesta și efectuați configurarea conexiunii:

Pentru a lucra cu tokenurile, mai întâi vom specifica calea către motorul opensc OpenSSL și biblioteca PKCS#11. Pentru aceasta, deschideți fila "Preferințe" pentru a seta parametrii openssl:
.
Vom închide fereastra de setări OpenSSL și vom trece la configurarea rețelei. Adăugați o rețea nouă apăsând butonul Add… în panoul de setări și introduceți numele rețelei:

După aceea, această rețea va deveni disponibilă în panoul de setări. Faceți dublu clic pe rețeaua nouă cu butonul din dreapta pentru a o configura. Pe prima filă, trebuie să configurăm IPsec. Vom defini adresa serverului și cheia comună:

După aceasta, trecem la fila de configurare PPP și vom specifica acolo numele de utilizator cu care dorim să ne conectăm la rețea:

După aceasta, vom deschide fila Properties și vom specifica calea către cheia, certificatul clientului și autoritatea de certificare:

Vom închide această filă și vom efectua configurarea finală, pentru aceasta, deschidem fila "Setările IP" și bifează opțiunea "Obțineți automat adresa serverului DNS":

Această opțiune va permite clientului să primi un IP personal de la server în rețea.
După toate setările, vom închide toate filele și vom reporni clientul:

Conectarea la rețea
După configurări, putem efectua conexiunea la rețea. Pentru aceasta, deschidem fila applet-ului și alegem rețeaua la care dorim să ne conectăm:

În timpul stabilirii conexiunii, clientul ne va cere să introducem PIN-ul RutuToken:

Dacă în bara de status apare o notificare că conexiunea a fost stabilită cu succes, înseamnă că setarea a fost realizată cu succes:

În caz contrar, ar trebui să investigăm motivul pentru care conexiunea nu a fost stabilită. Pentru aceasta, merită să verificăm logul programului, alegând în applet comanda "Informații despre conexiune":

Configurarea clientului Windows
Configurarea clientului în Windows este mult mai simplă decât în Linux, deoarece tot software-ul necesar este deja integrat în sistem.
Configurarea sistemului
Vom instala toate driverele necesare pentru a lucra cu RutuTokenurile descărcându-le de pe .
Importul certificatului rădăcină pentru autentificare
Vom descărca certificatul rădăcină al serverului și îl vom instala în sistem. Pentru aceasta, îl vom deschide și în fereastra care apare vom selecta opțiunea "Instalați certificatul":

În fereastra deschisă, vom alege instalarea certificatului pentru utilizatorul local. Dacă dorim ca certificatul să fie accesibil tuturor utilizatorilor de pe computer, ar trebui să alegem instalarea certificatului pe computerul local:

Vom instala certificatul în magazinul de certificate rădăcină de încredere ale CA:

După toate aceste acțiuni, suntem de acord cu toate punctele ulterioare. Acum sistemul este configurat.
Configurarea conexiunii VPN
Pentru a configura o conexiune VPN, accesați panoul de control și alegeți opțiunea pentru a crea o nouă conexiune.

În fereastra pop-up, selectați opțiunea de a crea o conexiune pentru a vă conecta la locul de muncă:

În fereastra următoare, alegeți conexiunea prin VPN:

și introduceți datele conexiunii VPN, precum și specificați opțiunea de a utiliza un card inteligent:

Aceasta nu pune capăt configurației. Rămâne să specificați cheia comună pentru protocolul IPsec, pentru aceasta trecem la tab-ul „Setări rețele” și apoi mergem la tab-ul „Proprietăți pentru această conexiune”:

În fereastra deschisă, accesați tab-ul "Securitate", specificați ca tip de rețea "Rețea L2TP/IPsec" și alegeți "Opțiuni avansate":

În fereastra deschisă, introduceți cheia comună IPsec:

Conectare
După finalizarea configurației, puteți încerca să vă conectați la rețea:

În timpul conectării, ni se va solicita să introducem PIN-ul tokenului:

Am configurat o rețea VPN securizată și am constatat că nu este greu.
Mulțumiri
Aș dori să le mulțumesc din nou colegilor noștri Vasiliy Shokov și Alexandr Smirnov pentru munca depusă împreună în simplificarea procesului de creare a conexiunilor VPN pentru clienții Linux.
Sursa: habr.com
