Carte „Linux în acțiune”

Carte „Linux în acțiune” Bună, comunitatea Habr! În carte, David Clinton descrie 12 proiecte reale, inclusiv automatizarea sistemului de backup și recuperare, configurarea unui sistem de fișiere personal în stil Dropbox și crearea propriului server MediaWiki. Prin exemple interesante, veți învăța despre virtualizare, recuperare în caz de dezastru, asigurarea securității, backup, implementarea DevOps și depanarea sistemului. Fiecare capitol se încheie cu un rezumat de recomandări practice, un glosar de termeni noi și exerciții.

Fragmentul „10.1. Crearea unui tunel OpenVPN”

În această carte, am vorbit deja destul despre criptare. SSH și SCP pot proteja datele transmise prin conexiuni la distanță (capitolul 3), criptarea fișierelor permite protejarea datelor stocate pe server (capitolul 8), iar certificatele TLS/SSL pot proteja datele în timpul transferului între site-uri și browserele clienților (capitolul 9). Dar uneori, datele dvs. necesită protecție într-un spectru mai larg de conexiuni. De exemplu, poate că unii membri ai echipei trebuie să lucreze în deplasare, conectându-se la rețea prin Wi-Fi la puncte de acces publice. Cu siguranță nu ar trebui să presupuneți că toate aceste puncte de acces sunt sigure, dar oamenii dumneavoastră au cu adevărat nevoie de o modalitate de a se conecta la resursele companiei - și în acest caz, un VPN vă va ajuta.

Un tunel VPN bine proiectat asigură o conexiune directă între clienți la distanță și server, astfel încât să ascundă datele în timpul transferului printr-o rețea nesigură. Și ce dacă? Ați văzut deja multe unelte care pot face acest lucru prin criptare. Valoarea reală a VPN-ului constă în faptul că, odată ce ați deschis tunelul, puteți conecta rețele îndepărtate, ca și cum ar fi toate locale. Într-un oarecare sens, folosiți un ocol.

Folosind o astfel de rețea extinsă, administratorii își pot desfășura activitatea pe serverele lor din orice loc. Dar, ceea ce este mai important, o companie cu resurse distribuite în mai multe filiale poate face ca acestea să fie toate vizibile și accesibile pentru toate grupurile care au nevoie de ele, indiferent de locul în care se află (fig. 10.1).

Tunelul în sine nu garantează securitatea. Dar unul dintre standardele de criptare poate fi inclus în structura rețelei, ceea ce crește semnificativ nivelul de securitate. Tunelele create cu ajutorul pachetului OpenVPN cu sursă deschisă folosesc aceeași criptare TLS/SSL despre care ați citit deja. OpenVPN nu este singura opțiune disponibilă pentru tunelare, dar este una dintre cele mai cunoscute. Se consideră că este puțin mai rapid și mai sigur decât protocolul alternativ de tunelare de nivel 2, care utilizează criptarea IPsec.

Doriți ca toți din echipa dvs. să comunice în siguranță între ei, fie că sunt pe drum, fie că lucrează în clădiri diferite? Pentru aceasta, trebuie să creați un server OpenVPN pentru a permite partajarea aplicațiilor și accesul la mediul de rețea local al serverului. Pentru ca acest lucru să funcționeze, este suficient să rulați două mașini virtuale sau două containere: unul pentru a îndeplini rolul de server/gazdă și celălalt pentru client. Crearea unei VPN nu este un proces simplu, așa că merită probabil să vă luați câteva minute pentru a vizualiza imaginea de ansamblu.

Carte „Linux în acțiune”

10.1.1. Configurarea serverului OpenVPN

Înainte de a începe, vă voi da un sfat util. Dacă intenționați să faceți totul singur (iar eu vă recomand cu insistență să faceți asta), probabil că veți descoperi că lucrați cu mai multe feronerie de terminal deschise pe Desktop, fiecare conectată la propria mașină. Există riscul ca, la un moment dat, să introduceți o comandă greșită într-o fereastră. Pentru a evita acest lucru, puteți folosi comanda hostname pentru a schimba numele mașinii afișat în linia de comandă cu ceva care să vă spună clar unde vă aflați. Odată ce ați făcut asta, va trebui să ieșiți de pe server și să vă conectați din nou pentru ca noile setări să intre în vigoare. Iată cum arată:

Carte „Linux în acțiune”
Urmând această abordare și atribuindu-vă nume corespunzătoare fiecărei mașini cu care lucrați, veți putea urmări cu ușurință unde vă aflați.

După ce ați folosit hostname, este posibil să vă confruntați cu mesaje enervante Unable to Resolve Host OpenVPN-Server atunci când executați comenzi ulterioare. Actualizarea fișierului /etc/hosts cu noul nume de host ar trebui să rezolve problema.

Pregătirea serverului dvs. pentru OpenVPN

Pentru a instala OpenVPN pe serverul dumneavoastră, sunt necesare două pachete: openvpn și easy-rsa (pentru a gestiona procesul de generare a cheii de criptare). Utilizatorii CentOS trebuie să instaleze mai întâi repository-ul epel-release, dacă este necesar, așa cum ați făcut în capitolul 2. De asemenea, pentru a verifica accesul la aplicația server, puteți instala serverul web Apache (apache2 pentru Ubuntu și httpd pe CentOS).

În timp ce configurați serverul, vă recomand să activați un firewall care blochează toate porturile, cu excepția celor 22 (SSH) și 1194 (portul OpenVPN implicit). Acest exemplu ilustrează cum va funcționa ufw pe Ubuntu, dar sunt sigur că vă aduceți aminte și de programul firewalld de pe CentOS din capitolul 9:

# ufw enable
# ufw allow 22
# ufw allow 1194

Pentru a permite rutarea internă între interfețele de rețea de pe server, trebuie să decommentați o linie (net.ipv4.ip_forward = 1) în fișierul /etc/sysctl.conf. Aceasta va permite redirectarea clienților remote după conectare. Pentru ca noul parametru să devină activ, rulați sysctl -p:

# nano /etc/sysctl.conf
# sysctl -p

Acum, mediul serverului este complet configurat, dar trebuie să mai faceți ceva înainte de a fi gata: va trebui să urmați următorii pași (pe care îi vom discuta detaliat mai departe).

  1. Creați pe server un set de chei pentru infrastructura de chei publice (PKI) folosind scripturile furnizate cu pachetul easy-rsa. Practic, serverul OpenVPN acționează și ca un certificat de autoritate (CA) propriu.
  2. Pregătiți cheile corespunzătoare pentru client
  3. Configurați fișierul server.conf pentru server
  4. Configurați clientul dumneavoastră OpenVPN
  5. Verificați VPN-ul dumneavoastră

Generarea cheilor de criptare

Pentru a nu complica lucrurile, puteți configura infrastructura dumneavoastră de chei pe aceeași mașină pe care rulează serverul OpenVPN. Cu toate acestea, în recomandările de securitate, se sugerează adesea utilizarea unui server CA separat pentru implementările în medii de producție. Procesul de generare și distribuire a resurselor cheii de criptare pentru utilizare în OpenVPN este ilustrat în figura 10.2.

Carte „Linux în acțiune”
Când ați instalat OpenVPN, a fost creat automat directorul /etc/openvpn/, dar momentan nu conține nimic. Pachetele openvpn și easy-rsa vin cu exemple de fișiere șablon pe care le puteți folosi ca bază pentru configurația dumneavoastră. Pentru a începe procesul de certificare, copiați directorul de șablon easy-rsa din /usr/share/ în /etc/openvpn și mergeți în directorul easy-rsa/:

# cp -r /usr/share/easy-rsa/ /etc/openvpn
$ cd /etc/openvpn/easy-rsa

Catalogul easy-rsa va conține acum o mulțime de scripturi. În tabelul 10.1 sunt enumerate instrumentele pe care le veți folosi pentru a crea chei.

Carte „Linux în acțiune”

Operațiile enumerate necesită privilegii root, așa că trebuie să deveniți root prin sudo su.

Primul fișier cu care veți lucra se numește vars și conține variabilele de mediu pe care easy-rsa le folosește la generarea cheilor. Trebuie să editați fișierul pentru a utiliza propriile valori în locul valorilor implicite existente. Iată cum va arăta fișierul meu (lista 10.1).

Lista 10.1. Fragmentele de bază ale fișierului /etc/openvpn/easy-rsa/vars

export KEY_COUNTRY="CA"
export KEY_PROVINCE="ON"
export KEY_CITY="Toronto"
export KEY_ORG="Bootstrap IT"
export KEY_EMAIL="info@bootstrap-it.com"
export KEY_OU="IT"

Rularea fișierului vars va permite transmiterea valorilor sale în mediu shell, de unde vor fi incluse în conținutul noilor dumneavoastră chei. De ce comanda sudo nu funcționează singură? Pentru că la prima etapă edităm scriptul numit vars, iar apoi îl aplicăm. Aplicarea presupune că fișierul vars transmite valorile sale în mediu shell, de unde vor fi incluse în conținutul noilor dumneavoastră chei.

Asigurați-vă că rulați fișierul din nou, folosind un nou shell, pentru a termina procesul incomplet. Odată ce acest lucru este făcut, scriptul vă va sugera să rulați un alt script, clean-all, pentru a șterge orice conținut din directorul /etc/openvpn/easy-rsa/keys/:

Carte „Linux în acțiune”
Desigur, următorul pas va fi să rulați scriptul clean-all, urmat de build-ca, care folosește scriptul pkitool pentru a crea certificatul rădăcină. Vi se va cere să confirmați setările de identificare furnizate în vars:

# ./clean-all
# ./build-ca
Generating a 2048 bit RSA private key

Următorul script este build-key-server. Deoarece folosește același script pkitool împreună cu noul certificat rădăcină, veți vedea aceleași întrebări pentru confirmarea creării unei perechi de chei. Cheilor le vor fi atribuite nume bazate pe argumentele pe care le transmiteți, care, cu excepția cazului în care rulați mai multe VPN-uri pe acest computer, vor fi de obicei server, ca în exemplul:

# ./build-key-server server
[...]
Certificate is to be certified until Aug 15 23:52:34 2027 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

OpenVPN folosește parametri generați cu ajutorul algoritmului Diffie-Hellman (prin utilizarea build-dh) pentru a stabili autentificarea pentru noi conexiuni. Fișierul creat aici nu trebuie să fie secret, dar trebuie să fie generat folosind scriptul build-dh pentru cheile RSA care sunt active în acest moment. Dacă veți genera noi chei RSA în viitor, va trebui, de asemenea, să actualizați fișierul bazat pe algoritmul Diffie-Hellman:

# ./build-dh

Cheile dumneavoastră de pe server vor ajunge acum în directorul /etc/openvpn/easy-rsa/keys/, dar OpenVPN nu știe acest lucru. Implicit, OpenVPN va căuta cheile în /etc/openvpn/, așa că copiați-le:

# cp /etc/openvpn/easy-rsa/keys/server* /etc/openvpn
# cp /etc/openvpn/easy-rsa/keys/dh2048.pem /etc/openvpn
# cp /etc/openvpn/easy-rsa/keys/ca.crt /etc/openvpn

Pregătirea cheilor de criptare pentru client

După cum ați văzut, în criptarea TLS se folosesc perechi de chei corespunzătoare: una este setată pe server, iar cealaltă pe clientul remote. Asta înseamnă că veți avea nevoie de cheile clientului. Vechea noastră cunoștință pkitool este exact ceea ce trebuie pentru asta. În acest exemplu, rulând programul în directorul /etc/openvpn/easy-rsa/, îi transmitem argumentul client pentru a genera fișierele numite client.crt și client.key:

# ./pkitool client

Cele două fișiere pentru client, împreună cu fișierul sursă ca.crt, care se află încă în directorul keys/, trebuie acum să fie transmise în siguranță clientului dumneavoastră. Datorită apartenenței și permisiunilor de acces, aceasta poate să nu fie o treabă atât de simplă. Cea mai simplă abordare este să copiați manual conținutul fișierului sursă (și nimic altceva decât acest conținut) în terminalul care rulează pe desktopul PC-ului dumneavoastră (selectați textul, faceți clic dreapta pe acesta și alegeți opțiunea Copy (Copiați) din meniu). Apoi lipiți-l într-un nou fișier cu același nume pe care îl creați în al doilea terminal conectat la clientul dumneavoastră.

Dar oricine poate tăia și lipi. Gândiți-vă ca un administrator, deoarece nu veți avea întotdeauna acces la GUI, unde este posibilă operația de tăiere/lipire. Copiați fișierele în directorul home al utilizatorului dumneavoastră (astfel încât operația remote scp să poată accesa aceste fișiere) și apoi, folosind chown, schimbați proprietarul fișierelor de la root la utilizatorul obișnuit fără privilegii root, pentru a putea executa acțiunea remote scp. Asigurați-vă că toate fișierele dumneavoastră sunt la acest moment setate și disponibile. Veți muta aceste fișiere pe client puțin mai târziu:

# cp /etc/openvpn/easy-rsa/keys/client.key /home/ubuntu/
# cp /etc/openvpn/easy-rsa/keys/ca.crt /home/ubuntu/
# cp /etc/openvpn/easy-rsa/keys/client.crt /home/ubuntu/
# chown ubuntu:ubuntu /home/ubuntu/client.key
# chown ubuntu:ubuntu /home/ubuntu/client.crt
# chown ubuntu:ubuntu /home/ubuntu/ca.crt

Cu un set complet de chei de criptare, gata de utilizare, trebuie să informați serverul cum doriți să creați un VPN. Acest lucru se face cu ajutorul fișierului server.conf.

Reducem numărul de apăsări de taste

Trebuie să tastați prea mult? Extensia cu paranteze poate reduce aceste șase comenzi la două. Sunt sigur că veți putea învăța aceste două exemple și înțelege ce se întâmplă. Mai important, veți putea aplica acești principii la operațiuni care implică zeci sau chiar sute de elemente:

# cp /etc/openvpn/easy-rsa/keys/{ca.crt,client.{key,crt}} /home/ubuntu/
# chown ubuntu:ubuntu /home/ubuntu/{ca.crt,client.{key,crt}}

Configurarea fișierului server.conf

De unde știți cum ar trebui să arate fișierul server.conf? Amintiți-vă de șablonul din directorul easy-rsa pe care l-ați copiat din /usr/share/? La instalarea OpenVPN a rămas un fișier comprimat de șablon de configurație pe care îl puteți copia în /etc/openvpn/. Voi presupune că șablonul este arhivat și vă voi prezenta un instrument util: zcat.

Deja știți cum să afișați conținutul textului fișierului pe ecran folosind comanda cat, dar ce se întâmplă dacă fișierul este comprimat cu gzip? Puteți oricând să despachetați fișierul, iar cat îl va afișa cu plăcere, dar aceasta implică cu unul sau două pași în plus. În schimb, așa cum ați ghicit probabil, puteți introduce comanda zcat pentru a încărca textul despachetat în memorie dintr-o singură mișcare. În exemplul următor, în loc să imprimați textul pe ecran, îl veți redirecționa într-un nou fișier numit server.conf:

# zcat 
  /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz 
  > /etc/openvpn/server.conf
$ cd /etc/openvpn

Să lăsăm deoparte documentația extensivă și utilă însoțitoare fișierului și să vedem cum ar putea arăta atunci când ați terminat editarea. Observați că punctul și virgula (;) indică OpenVPN să nu citească și să nu execute următoarea linie (listarea 10.2).

Carte „Linux în acțiune”
Să discutăm despre unele dintre aceste setări.

  • În mod implicit, OpenVPN funcționează pe portul 1194. Puteți schimba acest lucru, de exemplu, pentru a vă ascunde și mai mult acțiunile sau pentru a evita conflictele cu alte tuneluri active. Având în vedere că 1194 necesită o coordonare minimă cu clienții, cel mai bine este să procedați astfel.
  • OpenVPN utilizează fie protocolul de control al transmisiei (TCP), fie protocolul de datagramă utilizator (UDP) pentru a transmite date. TCP poate fi puțin mai lent, dar este mai fiabil și are o șansă mai mare de a fi înțeles de aplicațiile care funcționează la ambele capete ale tunelului.
  • Puteți specifica dev tun atunci când doriți să creați un tunel IP mai simplu și mai eficient, care transmite doar conținut de date și nimic mai mult. Dacă, pe de altă parte, va trebui să conectați mai multe interfețe de rețea (și rețelele reprezentate de acestea), va trebui să alegeți dev tap. Dacă nu înțelegeți ce înseamnă toate acestea, utilizați argumentul tun.
  • Următoarele patru rânduri îi transmit lui OpenVPN numele a trei fișiere de autentificare pe server și fișierul de parametrii dh2048 pe care l-ați creat anterior.
  • Rândul server stabilește intervalul și masca subrețelei care vor fi utilizate pentru atribuirea adreselor IP clienților la conectare.
  • Parametrul opțional push «route 10.0.3.0 255.255.255.0» permite clienților de la distanță să acceseze subrețelele private din spatele serverului. Pentru a realiza acest lucru, este necesară și configurarea rețelei pe server, astfel încât subrețeaua privată să fie conștientă de subrețeaua OpenVPN (10.8.0.0).
  • Rândul port-share localhost 80 permite redirecționarea traficului clientului care intră prin portul 1194 către serverul web local care ascultă pe portul 80. (Va fi util în cazul în care intenționați să utilizați un server web pentru a testa VPN-ul dvs.) Aceasta funcționează doar atunci când este selectat protocolul tcp.
  • Rândurile user nobody și group nogroup trebuie să fie active — pentru aceasta trebuie eliminate punctele și virgula (;). Forțarea clienților de la distanță să funcționeze sub nobody și nogroup garantează că sesiunile pe server vor fi fără privilegii.
  • log indică că înregistrările curente în jurnal vor suprascrie înregistrările vechi la fiecare lansare OpenVPN, în timp ce log-append adaugă noi înregistrări la fișierul de jurnal existent. Fișierul openvpn.log este scris în directorul /etc/openvpn/.

În plus, în fișierul de configurare se adaugă adesea și valoarea client-to-client, pentru ca mai mulți clienți să se poată vedea reciproc, pe lângă serverul OpenVPN. Dacă sunteți mulțumit de configurația dvs., atunci puteți porni serverul OpenVPN:

# systemctl start openvpn

Din cauza naturii în schimbare a relațiilor între OpenVPN și systemd, uneori poate fi necesar un astfel de sintax pentru a porni serviciul: systemctl start openvpn@server.

Rularea comenzii ip addr pentru a afisa lista interfețelor de rețea ale serverului dvs. ar trebui acum să afișeze o referință la noua interfață numită tun0. OpenVPN o va crea pentru a gestiona clienții înregistrați:

$ ip addr
[...]
4: tun0: mtu 1500 qdisc [...]
      link/none
      inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
          valid_lft forever preferred_lft forever

Este posibil să fie necesar să reporniți serverul înainte ca totul să înceapă să funcționeze complet. Următoarea oprire este computerul client.

10.1.2. Configurarea clientului OpenVPN

În mod tradițional, tunelurile sunt construite cu cel puțin două ieșiri (altfel le-am numi peșteri). Un OpenVPN bine configurat pe server direcționează traficul în tunel și din tunel pe o parte. Dar veți avea nevoie și de un software care să funcționeze pe partea clientului, adică la cealaltă capăt a tunelului.

În această secțiune, am de gând să mă concentrez pe configurarea manuală a unui computer cu Linux de orice tip pentru a funcționa ca un client OpenVPN. Dar aceasta nu este singura modalitate prin care această capacitate este disponibilă. OpenVPN suportă aplicații client care pot fi instalate și utilizate pe computere desktop și laptopuri cu Windows sau macOS, precum și pe smartphone-uri și tablete cu Android și iOS. Detalii pot fi găsite pe openvpn.net.

Pachetul OpenVPN va trebui să fie instalat pe computerul client, asemenea modului în care a fost instalat pe server, cu toate că nu este necesară easy-rsa, deoarece cheile utilizate deja există. Trebuie să copiați fișierul șablon client.conf în directorul /etc/openvpn/, care tocmai a fost creat. De data aceasta, fișierul nu va fi arhivat, deci comanda obișnuită cp se va descurca excelent cu această sarcină:

# apt install openvpn
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf 
  /etc/openvpn/

Majoritatea setărilor din fișierul dvs. client.conf vor fi destul de explicite: acestea trebuie să corespundă valorilor de pe server. Așa cum se poate observa din următorul exemplu de fișier, un parametru unic este remote 192.168.1.23 1194, care indică clientului adresa IP a serverului. Asigurați-vă că aceasta este adresa serverului dvs. De asemenea, trebuie să faceți ca computerul client să verifice autentificarea certificatului serverului pentru a preveni o posibilă atac „man-in-the-middle”. Un mod de a face acest lucru este adăugarea liniei remote-cert-tls server (listarea 10.3).

Carte „Linux în acțiune”
Acum puteți naviga în directorul /etc/openvpn/ și extrage cheile de certificare de pe server. Înlocuiți adresa IP a serverului sau numele de domeniu din exemplu cu valorile dvs.:

Carte „Linux în acțiune”
Nimic captivant nu se va întâmpla, cel mai probabil, până nu rulați OpenVPN pe client. Deoarece trebuie să transmiteți câteva argumente, veți face acest lucru din linia de comandă. Argumentul —tls-client îi spune lui OpenVPN că veți acționa ca un client și vă veți conecta prin criptare TLS, iar —config indică fișierul dumneavoastră de configurare:

# openvpn --tls-client --config /etc/openvpn/client.conf

Citiți cu atenție rezultatul comenzii pentru a vă asigura că sunteți corect conectat. Dacă faceți ceva greșit pentru prima dată, ar putea fi din cauza unei neconcordanțe a setărilor între fișierele de configurare ale serverului și clientului sau din cauza unei probleme de conectivitate a rețelei/firewall. Iată câteva sugestii pentru depanare.

  • Citiți cu atenție rezultatul operațiunii OpenVPN pe client. Acesta conține adesea sfaturi valoroase despre ceea ce nu poate fi realizat și de ce.
  • Verificați mesajele de eroare din fișierele openvpn.log și openvpn-status.log din directorul /etc/openvpn/ pe server.
  • Verificați mesajele legate de OpenVPN și relevant temporar în jurnalele de sistem de pe server și client. (journalctl -ce va afișa cele mai recente înregistrări.)
  • Asigurați-vă că aveți o conexiune de rețea activă între server și client (mai multe informații — în capitolul 14).

Despre autor

David Clinton — administrator de sistem, profesor și scriitor. A administrat, a scris despre aceasta și a creat materiale didactice pentru multe discipline tehnice importante, inclusiv sisteme Linux, cloud computing (în special AWS) și tehnologii de containere precum Docker. A scris cartea Learn Amazon Web Services in a Month of Lunches (Manning, 2017). Multe dintre cursurile sale video pot fi găsite pe site-ul Pluralsight.com, iar linkurile către alte cărți ale sale (despre administrarea Linux și virtualizarea serverelor) sunt disponibile la bootstrap-it.com.

» Puteți găsi mai multe detalii despre carte pe site-ul editurii
» Cuprins
» Fragment

Pentru utilizatorii Habr, discount de 25% cu codul — Linux
După plata versiunii tipărite a cărții, se va trimite o carte electronică pe e-mail.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster