Cartea „Linux în acțiune”

Cartea „Linux în acțiune” Bună, locuitorii Khabro! În carte, David Clinton descrie 12 proiecte din viața reală, inclusiv automatizarea sistemului de backup și recuperare, configurarea unui nor de fișiere personal în stil Dropbox și crearea propriului server MediaWiki. Veți explora virtualizarea, recuperarea în caz de dezastru, securitatea, backupul, DevOps și depanarea sistemului prin studii de caz interesante. Fiecare capitol se încheie cu o trecere în revistă a celor mai bune practici, un glosar de termeni noi și exerciții.

Extras „10.1. Crearea unui tunel OpenVPN"

Am vorbit deja mult despre criptare în această carte. SSH și SCP pot proteja datele transferate prin conexiuni la distanță (Capitolul 3), criptarea fișierelor poate proteja datele în timp ce acestea sunt stocate pe server (Capitolul 8), iar certificatele TLS/SSL pot proteja datele transferate între site-uri și browserele client (Capitolul 9) . Dar uneori datele dvs. trebuie protejate printr-o gamă mai largă de conexiuni. De exemplu, poate unii dintre membrii echipei tale lucrează pe drum în timp ce se conectează la Wi-Fi prin hotspot-uri publice. Cu siguranță nu ar trebui să presupuneți că toate astfel de puncte de acces sunt sigure, dar oamenii dvs. au nevoie de o modalitate de a se conecta la resursele companiei - și aici poate ajuta un VPN.

Un tunel VPN proiectat corespunzător oferă o conexiune directă între clienții la distanță și server într-un mod care ascunde datele pe măsură ce călătoresc printr-o rețea nesigură. Şi ce dacă? Ați văzut deja multe instrumente care pot face acest lucru prin criptare. Valoarea reală a unui VPN este că, prin deschiderea unui tunel, puteți conecta rețele de la distanță ca și cum ar fi toate locale. Într-un fel, utilizați un bypass.

Folosind această rețea extinsă, administratorii își pot efectua munca pe serverele lor de oriunde. Dar, mai important, o companie cu resurse răspândite în mai multe locații le poate face pe toate vizibile și accesibile tuturor grupurilor care au nevoie de ele, oriunde s-ar afla (Figura 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. Tunelurile create folosind pachetul OpenVPN open source folosesc aceeași criptare TLS/SSL despre care ați citit deja. OpenVPN nu este singura opțiune de tunel disponibilă, dar este una dintre cele mai cunoscute. Este considerat a fi puțin mai rapid și mai sigur decât protocolul alternativ de tunel Layer 2 care utilizează criptarea IPsec.

Vrei ca toți cei din echipa ta să comunice în siguranță între ei în timp ce sunteți pe drum sau lucrează în clădiri diferite? Pentru a face acest lucru, 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, tot ce trebuie să faceți este să rulați două mașini virtuale sau două containere: unul să acționeze ca server/gazdă și unul să acționeze ca client. Construirea unui VPN nu este un proces simplu, așa că, probabil, merită să vă luați câteva minute pentru a obține imaginea de ansamblu.

Cartea „Linux în acțiune”

10.1.1. Configurarea serverului OpenVPN

Înainte de a începe, îți voi da câteva sfaturi utile. Dacă o veți face singur (și vă recomand cu căldură să o faceți), probabil vă veți găsi lucrând cu mai multe ferestre de terminal deschise pe desktop, fiecare conectată la o altă mașină. Există riscul ca la un moment dat să introduceți o comandă greșită în fereastră. Pentru a evita acest lucru, puteți utiliza comanda hostname pentru a schimba numele mașinii afișat pe linia de comandă cu ceva care vă spune clar unde vă aflați. Odată ce faceți acest lucru, va trebui să vă deconectați de la server și să vă conectați din nou pentru ca noile setări să intre în vigoare. Cam asa arata:

Cartea „Linux în acțiune”
Urmând această abordare și dând nume adecvate fiecărei mașini cu care lucrați, puteți urmări cu ușurință unde vă aflați.

După ce ați folosit numele de gazdă, este posibil să întâlniți mesaje enervante Unable to Resolve Host OpenVPN-Server atunci când executați comenzile ulterioare. Actualizarea fișierului /etc/hosts cu noul nume de gazdă adecvat ar trebui să rezolve problema.

Pregătirea serverului pentru OpenVPN

Pentru a instala OpenVPN pe serverul dvs., aveți nevoie de două pachete: openvpn și easy-rsa (pentru a gestiona procesul de generare a cheii de criptare). Utilizatorii CentOS ar trebui să instaleze mai întâi depozitul epel-release dacă este necesar, așa cum ați făcut în Capitolul 2. Pentru a putea testa accesul la aplicația server, puteți instala și serverul web Apache (apache2 pe Ubuntu și httpd pe CentOS).

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

# ufw enable
# ufw allow 22
# ufw allow 1194

Pentru a activa rutarea internă între interfețele de rețea de pe server, trebuie să decomentați o linie (net.ipv4.ip_forward = 1) din fișierul /etc/sysctl.conf. Acest lucru va permite clienților la distanță să fie redirecționați după cum este necesar odată ce sunt conectați. Pentru ca noua opțiune să funcționeze, rulați sysctl -p:

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

Mediul dvs. de server este acum complet configurat, dar mai este încă un lucru de făcut înainte de a fi gata: va trebui să parcurgeți următorii pași (le vom trata în detaliu în continuare).

  1. Creați un set de chei de criptare a infrastructurii cu chei publice (PKI) pe server folosind scripturile furnizate cu pachetul easy-rsa. În esență, serverul OpenVPN acționează și ca propria sa autoritate de certificare (CA).
  2. Pregătiți cheile adecvate pentru client
  3. Configurați fișierul server.conf pentru server
  4. Configurați-vă clientul OpenVPN
  5. Verificați VPN-ul

Generarea cheilor de criptare

Pentru a simplifica lucrurile, vă puteți configura infrastructura cheie pe aceeași mașină pe care rulează serverul OpenVPN. Cu toate acestea, cele mai bune practici de securitate sugerează de obicei utilizarea unui server CA separat pentru implementările de producție. Procesul de generare și distribuire a resurselor cheie de criptare pentru utilizare în OpenVPN este ilustrat în Fig. 10.2.

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

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

Directorul easy-rsa va conține acum destul de multe scripturi. În tabel 10.1 listează instrumentele pe care le veți folosi pentru a crea chei.

Cartea „Linux în acțiune”

Operațiunile de mai sus necesită privilegii de 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 atunci când generează chei. Trebuie să editați fișierul pentru a vă folosi propriile valori în loc de valorile implicite care sunt deja acolo. Așa va arăta fișierul meu (Listarea 10.1).

Lista 10.1. Fragmente principale 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="[email protected]"
export KEY_OU="IT"

Rularea fișierului vars va trece valorile acestuia în mediul shell, unde vor fi incluse în conținutul noilor tale chei. De ce nu funcționează comanda sudo de la sine? Pentru că în primul pas edităm scriptul numit vars și apoi îl aplicăm. Aplicarea și înseamnă că fișierul vars își transmite valorile mediului shell, unde acestea vor fi incluse în conținutul noilor tale chei.

Asigurați-vă că executați din nou fișierul folosind un nou shell pentru a finaliza procesul neterminat. Când se face acest lucru, scriptul vă va solicita să rulați un alt script, clean-all, pentru a elimina orice conținut din directorul /etc/openvpn/easy-rsa/keys/:

Cartea „Linux în acțiune”
Desigur, următorul pas este 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 identitate furnizate de vars:

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

Urmează scriptul build-key-server. Deoarece folosește același script pkitool împreună cu un nou certificat rădăcină, veți vedea aceleași întrebări pentru a confirma crearea perechii de chei. Cheile vor fi denumite pe baza argumentelor pe care le transmiteți, care, cu excepția cazului în care rulați mai multe VPN-uri pe această mașină, vor fi de obicei server, ca în exemplu:

# ./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 de algoritmul Diffie-Hellman (folosind build-dh) pentru a negocia autentificarea pentru noile conexiuni. Fișierul creat aici nu trebuie să fie secret, dar trebuie generat folosind scriptul build-dh pentru cheile RSA care sunt active în prezent. Dacă creați noi chei RSA în viitor, va trebui să actualizați și fișierul Diffie-Hellman:

# ./build-dh

Cheile din partea serverului vor ajunge acum în directorul /etc/openvpn/easy-rsa/keys/, dar OpenVPN nu știe acest lucru. În mod 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 client

După cum ați văzut deja, criptarea TLS utilizează perechi de chei potrivite: una instalată pe server și una instalată pe clientul de la distanță. Aceasta înseamnă că veți avea nevoie de cheile client. Vechiul nostru prieten pkitool este exact ceea ce aveți nevoie pentru asta. În acest exemplu, când rulăm programul în directorul /etc/openvpn/easy-rsa/, îi trecem argumentul client pentru a genera fișiere numite client.crt și client.key:

# ./pkitool client

Cele două fișiere client, împreună cu fișierul original ca.crt care se află încă în directorul chei/, ar trebui acum să fie transferate în siguranță către clientul dumneavoastră. Din cauza dreptului de proprietate și a drepturilor lor de acces, acest lucru poate să nu fie atât de ușor. Cea mai simplă abordare este să copiați manual conținutul fișierului sursă (și nimic altceva decât acel conținut) într-un terminal care rulează pe desktop-ul computerului dvs. (selectați textul, faceți clic dreapta pe el și selectați Copiere din meniu). Apoi lipiți-l într-un fișier nou cu același nume pe care îl creați într-un al doilea terminal conectat la clientul dvs.

Dar oricine poate tăia și lipi. În schimb, gândiți-vă ca un administrator, deoarece nu veți avea întotdeauna acces la interfața grafică unde sunt posibile operațiunile de tăiere/lipire. Copiați fișierele în directorul principal al utilizatorului (astfel încât operația scp de la distanță să le poată accesa), apoi utilizați chown pentru a schimba dreptul de proprietate asupra fișierelor de la root la un utilizator obișnuit non-root, astfel încât acțiunea scp la distanță să poată fi efectuată. Asigurați-vă că toate fișierele dvs. sunt instalate și accesibile în prezent. Le vei muta la 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 funcționare, trebuie să spuneți serverului cum doriți să creați VPN-ul. Acest lucru se face folosind fișierul server.conf.

Reducerea numărului de apăsări de taste

Există prea multă tastare? Extinderea cu paranteze va ajuta la reducerea acestor șase comenzi la două. Sunt sigur că puteți studia aceste două exemple și puteți înțelege ce se întâmplă. Mai important, veți putea înțelege cum să aplicați aceste 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

Cum poți ști cum ar trebui să arate fișierul server.conf? Amintiți-vă șablonul de director easy-rsa pe care l-ați copiat din /usr/share/? Când ați instalat OpenVPN, ați rămas cu un fișier șablon de configurare comprimat pe care îl puteți copia în /etc/openvpn/. Mă voi baza pe faptul că șablonul este arhivat și vă voi prezenta un instrument util: zcat.

Știți deja despre tipărirea conținutului text al unui fișier pe ecran folosind comanda cat, dar ce se întâmplă dacă fișierul este comprimat folosind gzip? Puteți oricând să dezarhivați fișierul și apoi cat îl va scoate cu plăcere, dar este unul sau doi pași mai mult decât este necesar. În schimb, după cum probabil ați ghicit, puteți lansa comanda zcat pentru a încărca textul despachetat în memorie într-un singur pas. În exemplul următor, în loc să imprimați text pe ecran, îl veți redirecționa către un fișier nou 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 extinsă și utilă care vine cu fișierul și să vedem cum ar putea arăta când ați terminat editarea. Rețineți că punctul și virgulă (;) îi spune OpenVPN să nu citească sau să execute următoarea linie (Listarea 10.2).

Cartea „Linux în acțiune”
Să trecem prin câteva dintre aceste setări.

  • În mod implicit, OpenVPN rulează pe portul 1194. Puteți modifica acest lucru, de exemplu, pentru a vă ascunde și mai mult activitățile sau pentru a evita conflictele cu alte tuneluri active. Deoarece 1194 necesită o coordonare minimă cu clienții, cel mai bine este să o faceți în acest fel.
  • OpenVPN folosește 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 mai probabil să fie înțeles de aplicațiile care rulează 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 transportă conținut de date și nimic altceva. Dacă, pe de altă parte, trebuie să conectați mai multe interfețe de rețea (și rețelele pe care le reprezintă), creând o punte Ethernet, va trebui să alegeți dev tap. Dacă nu înțelegeți ce înseamnă toate acestea, folosiți argumentul tun.
  • Următoarele patru rânduri oferă OpenVPN numele celor trei fișiere de autentificare de pe server și fișierul de opțiuni dh2048 pe care l-ați creat mai devreme.
  • Linia de server stabilește intervalul și masca de subrețea care vor fi utilizate pentru a atribui adrese IP clienților la conectare.
  • Parametrul opțional push „route 10.0.3.0 255.255.255.0” permite clienților la distanță să acceseze subrețele private din spatele serverului. Pentru ca aceasta să funcționeze, este necesară și configurarea rețelei pe serverul însuși, astfel încât subrețeaua privată să știe despre subrețeaua OpenVPN (10.8.0.0).
  • Linia port-share localhost 80 vă permite să redirecționați traficul clientului care vine pe portul 1194 către un server web local care ascultă pe portul 80. (Acest lucru va fi util dacă veți folosi serverul web pentru a vă testa VPN-ul.) Acest lucru funcționează numai. apoi când se selectează protocolul tcp.
  • Liniile utilizatorului nobody și group nogroup trebuie să fie activate prin eliminarea punctului și virgulă (;). Forțarea clienților la distanță să ruleze ca nimeni și fără grup asigură că sesiunile de pe server nu sunt privilegiate.
  • log specifică faptul că intrările de jurnal curente vor suprascrie intrările vechi de fiecare dată când OpenVPN este pornit, în timp ce log-append adaugă intrări noi la fișierul jurnal existent. Fișierul openvpn.log în sine este scris în directorul /etc/openvpn/.

În plus, o valoare de la client la client este adesea adăugată la fișierul de configurare, astfel încât mai mulți clienți să se poată vedea pe lângă serverul OpenVPN. Dacă sunteți mulțumit de configurația dvs., puteți porni serverul OpenVPN:

# systemctl start openvpn

Datorită naturii în schimbare a relației dintre OpenVPN și systemd, uneori poate fi necesară următoarea sintaxă pentru a porni un serviciu: systemctl start openvpn@server.

Rularea ip addr pentru a lista interfețele de rețea ale serverului dvs. ar trebui să scoată acum un link către o nouă interfață numită tun0. OpenVPN îl va crea pentru a servi clienții care sosesc:

$ 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

Poate fi 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 configurat corespunzător pe server direcționează traficul în și în afara tunelului pe o parte. Dar veți avea nevoie și de niște software care rulează pe partea clientului, adică la celălalt capăt al tunelului.

În această secțiune, mă voi concentra pe configurarea manuală a unui tip de computer Linux pentru a acționa ca client OpenVPN. Dar acesta nu este singurul mod în care această oportunitate este disponibilă. OpenVPN acceptă aplicații client care pot fi instalate și utilizate pe desktop-uri și laptopuri care rulează Windows sau macOS, precum și pe smartphone-uri și tablete Android și iOS. Consultați openvpn.net pentru detalii.

Pachetul OpenVPN va trebui să fie instalat pe computerul client așa cum a fost instalat pe server, deși nu este nevoie de easy-rsa aici, deoarece cheile pe care le utilizați există deja. Trebuie să copiați fișierul șablon client.conf în directorul /etc/openvpn/ pe care tocmai l-ați creat. De data aceasta, fișierul nu va fi arhivat, așa că comanda obișnuită cp va face treaba bine:

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

Majoritatea setărilor din fișierul client.conf vor fi destul de explicite: ar trebui să se potrivească cu valorile de pe server. După cum puteți vedea din următorul fișier exemplu, parametrul unic este remote 192.168.1.23 1194, care spune clientului adresa IP a serverului. Din nou, asigurați-vă că aceasta este adresa serverului dvs. De asemenea, ar trebui să forțați computerul client să verifice autenticitatea certificatului de server pentru a preveni un posibil atac de tip man-in-the-middle. O modalitate de a face acest lucru este să adăugați serverul de linie remote-cert-tls (Listing 10.3).

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

Cartea „Linux în acțiune”
Nu se va întâmpla nimic interesant până când nu rulați OpenVPN pe client. Deoarece trebuie să transmiteți câteva argumente, o veți face din linia de comandă. Argumentul --tls-client spune OpenVPN că vă veți acționa ca client și vă veți conecta prin criptare TLS, iar --config indică fișierul dvs. de configurare:

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

Citiți cu atenție rezultatul comenzii pentru a vă asigura că sunteți conectat corect. Dacă ceva nu merge bine prima dată, poate fi din cauza unei nepotriviri a setărilor dintre fișierele de configurare a serverului și a clientului sau a unei probleme de conexiune la rețea/firewall. Iată câteva sfaturi de depanare.

  • Citiți cu atenție rezultatul operațiunii OpenVPN pe client. Conține adesea sfaturi valoroase despre ce anume nu se poate face și de ce.
  • Verificați mesajele de eroare din fișierele openvpn.log și openvpn-status.log din directorul /etc/openvpn/ de pe server.
  • Verificați jurnalele de sistem de pe server și client pentru mesaje legate de OpenVPN și sincronizate. (journalctl -ce va afișa cele mai recente intrări.)
  • Asigurați-vă că aveți o conexiune de rețea activă între server și client (mai multe despre asta în Capitolul 14).

Despre autor

David Clinton - administrator de sistem, profesor și scriitor. El a administrat, scris despre și creat materiale educaționale pentru multe discipline tehnice importante, inclusiv sisteme Linux, cloud computing (în special AWS) și tehnologii container, cum ar fi Docker. A scris cartea Learn Amazon Web Services in a Month of Lunches (Manning, 2017). Multe dintre cursurile sale de instruire video pot fi găsite la Pluralsight.com, iar link-uri către celelalte cărți ale sale (despre administrarea Linux și virtualizarea serverelor) sunt disponibile la bootstrap-it.com.

» Mai multe detalii despre carte gasiti la site-ul editorului
» Cuprins
» Extras

Pentru Khabrozhiteley 25% reducere folosind cupon - Linux
La plata versiunii pe hârtie a cărții, o carte electronică va fi trimisă prin e-mail.

Sursa: www.habr.com

Adauga un comentariu