Tere, Habr kogukond! David Clinton raamatus kirjeldab 12 tegelikku projekti, sealhulgas varundamise ja taastamise süsteemi automatiseerimine, isikliku Dropboxi stiilis failide pilve seadistamine ja oma MediaWiki serveri loomine. Huvi pakkuvate näidete kaudu õpite virtualiseerimist, hädaolukordade taastamist, turvalisust, varundamist, DevOps'i rakendamist ja süsteemivigu lahendamist. Iga peatükk lõppeb praktiliste soovituste ülevaate, uute terminite sõnastiku ja harjutustega.
Lõik "10.1. OpenVPN tunnelite loomine"
Sellest raamatust olen ma juba palju rääkinud krüpteerimisest. SSH ja SCP saavad kaitsta andmeid, mis edastatakse kaugühenduste kaudu (peatükk 3), failide krüpteerimine kaitseb andmeid serveris salvestamise ajal (peatükk 8), ning TLS/SSL sertifikaadid suudavad kaitsta andmeid edastamisel veebisaitide ja kliendi brauserite vahel (peatükk 9). Kuid mõnikord vajavad teie andmed kaitset ulatuslikumates ühendustes. Näiteks võib juhtuda, et mõned teie meeskonnaliikmed peavad liikuma ning ühenduma Wi-Fi-ga avalikes Interneti-juurdepääsudes. Kindlasti ei peaks arvama, et kõik sellised juurdepääsud on turvalised, kuid teie töötajad vajavad tõesti viisi, kuidas ühenduda ettevõtte ressurssidega — ja siin tuleb appi VPN.
Hästi kavandatud VPN tunnel pakub otsest ühendust kaugklientide ja serveri vahel viisil, mis varjab andmeid nende edastamisel turvamata võrgus. Ja mis siis? Olete juba näinud palju tööriistu, mis saavad seda teha krüpteerimise abil. VPN'i tõeline väärtus seisneb selles, et avanedes tunneliga, saate ühendada kaugvõrgud, nagu oleksid need kõik kohalikud. Mõnes mõttes kasutate te iseseisvust.
Kasutades sellist ulatuslikku võrku, saavad administraatorid oma serverites oma tööd igas kohas teha. Kuid veelgi olulisem on see, et ettevõte, mille ressursid on jaotatud mitme filiaali vahel, võib muuta need kõik nähtavaks ja kergesti ligipääsetavaks kõigile rühmadesse, kes neist sõltuvad, olenemata nende asukohast (joonis 10.1).
Tunneli iseenesest ei garanteeri turvalisust. Kuid üks krüptimise standarditest võib olla ühendatud võrgu struktuuri, mis oluliselt suurendab turvalisuse taset. OpenVPN avatud lähtekoodiga paketi abil loodud tunnelid kasutavad sama TLS/SSL krüptimist, millest olete juba kuulnud. OpenVPN ei ole ainus tunneldamise võimalus, kuid see on üks tuntumaid. Arvatakse, et see on veidi kiirem ja turvalisem kui alternatiivne 2. taseme tunneliprotokoll, mis kasutab IPsec krüptimist.
Kas soovite, et teie meeskond suhtleks ohutult omavahel, olles teel või töötades erinevates hoonetes? Selle saavutamiseks peate looma OpenVPN serveri, et võimaldada rakenduste jagamist ja juurdepääsu serveri kohaliku võrgu keskkonnale. Selle toimimiseks on piisav käivitada kaks virtuaalmasinat või kahte konteinerit: üks serveri/hosti rolli täitmiseks ja teine klientide jaoks. VPNi loomine pole lihtne protsess, seega tasub tõenäoliselt kulutada mõned minutid, et kujundada endale ülevaade.

10.1.1. OpenVPN serveri konfigureerimine
Enne alustamist andke teile kasulik nõuanne. Kui plaanite kõik ise teha (ja ma soovitan seda tungivalt), siis avastate tõenäoliselt, et töötate mitme terminaliakniga, mis on avatud teie töölaual, millest igaüks on ühendatud oma masinaga. On oht, et teatud hetkel sisestate käsu vale akna jaoks. Selle vältimiseks saate kasutada käsku hostname, et muuta terminalis kuvatavat masinanime millekski, mis ühemõtteliselt ütleb teile, kus te asute. Kui olete selle teinud, peate serverist välja logima ja uuesti sisse logima, et uued seaded jõustuksid. Nii see välja näeb:

Järgides seda lähenemist ja andes igale masinale, millega töötate, vastava nime, saate hõlpsasti jälgida, kus te asute.
Pärast hostname'i kasutamist võite sattuda tüütu sõnumi Unable to Resolve Host OpenVPN-Server alla, kui täidate järgmisi käske. Faili /etc/hosts vastava uue hostinimega värskendamine peaks probleemi lahendama.
Valmistage oma server OpenVPN-iks ette
OpenVPN'i installimiseks teie serverisse on vajalikud kaks paketti: openvpn ja easy-rsa (krüpteerimisvõtme genereerimise protsessi haldamiseks). CentOS'i kasutajad peavad vajadusel esmalt installima epel-release'i hoidla, nagu te tegite peatükis 2. Serverirakenduse juurdepääsu kontrollimiseks saate samuti installida veebiserveri Apache (apache2 Ubuntu jaoks ja httpd CentOS'i jaoks).
Samas kui te serverit seadistate, soovitan aktiveerida tulemüüri, mis blokeerib kõik pordid, välja arvatud 22 (SSH) ja 1194 (OpenVPN vaikimisi ports). See näide illustreerib, kuidas ufw Ubuntu's töötab, aga ma olen kindel, et mäletate CentOS'i firewalld programmi peatükist 9:
# ufw enable
# ufw allow 22
# ufw allow 1194Interneti liideste vahelise suunamise lubamiseks serveris tuleb kommenteerida üks rida välja (net.ipv4.ip_forward = 1) failis /etc/sysctl.conf. See võimaldab suunata kauge kliente vajadusel pärast nende ühendamist. Uue seadistuse kehtimiseks käivitage sysctl -p:
# nano /etc/sysctl.conf
# sysctl -pNüüd on serverikeskkond täielikult seadistatud, kuid enne valmisolekut tuleb teha veel mõned sammud (me käsitleme neid üksikasjalikult hiljem).
- Looge serveris avaliku võtme infrastruktuuri (PKI) krüptovõtmete komplekt, kasutades easy-rsa pakiga kaasasolevaid skripte. Sisuliselt toimib OpenVPN server ka teie enda sertifitseerimiskeskusena (CA).
- Valmistage ette vastavad võtmed kliendi jaoks
- Konfigureerige serveri server.conf fail
- Seadistage oma OpenVPN klient
- Kontrollige oma VPN-i
Krüptovõtmete genereerimine
Elu keerulisemaks muutmata saate seadistada oma võtme infrastruktuuri samal masinal, kus töötab OpenVPN server. Siiski soovitatakse turvaneid võtme-CAd eraldi serveris tootmiskeskkondade jaoks. Krüpteerimisvõtmete genereerimise ja levitamise protsess OpenVPN'is on illustreeritud joonisel 10.2.

OpenVPN'i installimisel loodi automaatselt kataloog /etc/openvpn/, kuid seal pole veel midagi. Paketid openvpn ja easy-rsa kaasnevad mallifailide näidistega, mida saate kasutada oma konfiguratsiooni põhjana. Sertifitseerimisprotsessi käivitamiseks kopeerige easy-rsa mallide kataloog /usr/share/ katalooge /etc/openvpn ja minge kataloogi easy-rsa/:
# cp -r /usr/share/easy-rsa/ /etc/openvpn
$ cd /etc/openvpn/easy-rsaeasy-rsa kataloog sisaldab nüüd üsna palju skripte. Tabelis 10.1 on loetletud tööriistad, mida te kasutate võtmete loomiseks.

Loetletud toimingud nõuavad root-õigusi, seetõttu peate sudo su kaudu root-ks saama.
Esimene fail, millega te töötate, nimetatakse vars ja see sisaldab keskkonna muutujaid, mida easy-rsa kasutab võtmete genereerimisel. Te peate faili redigeerima, et kasutada oma väärtusi, mitte vaikimisi väärtusi, mis seal juba on. Nii näeb välja minu fail (loetelu 10.1).
Loetelu 10.1. Peamised fraktsioonid failist /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"Faili vars käivitamine võimaldab selle väärtused keskkonda edastada, kust need lisatakse teie uute võtmete sisusse. Miks käsk sudo iseenesest ei tööta? Sest esimesel sammul redigeerime skripti nimega vars ja seejärel rakendame selle. Rakendamine tähendab, et fail vars edastab oma väärtused keskkonda, kust need lisatakse teie uute võtmete sisusse.
Käivitage fail kindlasti uuesti, kasutades uut shelli, et lõpetada lõpetamata protsess. Kui see on tehtud, palub skript teil käivitada teine skript, clean-all, et eemaldada kõik sisu kataloogist /etc/openvpn/easy-rsa/keys/:

loomulikult on järgmine samm skripti clean-all käivitamine, millele järgneb build-ca, mis kasutab skripti pkitool, et luua juurkinnitus. Teilt palutakse kinnitada identifitseerimise seadeid, mille vars on edastanud:
# ./clean-all
# ./build-ca
Generating a 2048 bit RSA private keyJärgmiseks on skript build-key-server. Kuna see kasutab sama skripti pkitool koos uue juurkinnitusega, näete samu küsimusi võtmepaari loomise kinnitamiseks. Võtmete nimed määratakse teie edastatud argumentide põhjal, mis, kui te ei käivita mitut VPN-i sellel arvutil, on tavaliselt server, nagu näites:
# ./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 UpdatedOpenVPN kasutab parametreid, mis on genereeritud Diffie-Hellmani algoritmi abil (kasutades build-dh), et kokku leppida autentimine uute ühenduste jaoks. Siin loodud fail ei peaks olema salajane, kuid see peaks olema genereeritud build-dh skripti abil RSA võtmete jaoks, mis on praegu aktiivsed. Kui loote tulevikus uusi RSA võtmeid, peate ka selle faili värskendama Diffie-Hellmani algoritmi põhjal:
# ./build-dhTeie võtmed serveri küljel jõuavad nüüd katalooge /etc/openvpn/easy-rsa/keys/, kuid OpenVPN ei tea sellest. Vaikeväärtusena otsib OpenVPN võtmeid kataloogist /etc/openvpn/, seega kopeerige need:
# 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/openvpnKliendi krüpteerimisvõtmete ettevalmistamine
Nagu te juba nägite, kasutab TLS-krüptimine vastavaid võtme paare: üks on serveris ja teine on eemaloleval kliendil. See tähendab, et vajate kliendi võtmeid. Meie vana sõber pkitool on just see, mis teile selleks vajalik. Sel näitel, käivitades programmi kataloogis /etc/openvpn/easy-rsa/, edastame sellele argumendi client, et genereerida failid nimega client.crt ja client.key:
# ./pkitool clientKaks kliendifaili koos algse failiga ca.crt, mis on endiselt kataloogis keys/, tuleb nüüd turvaliselt edastada teie kliendile. Nende kuuluvuse ja õiguste tõttu võib see osutuda mitte nii lihtsaks. Lihtsaim lähenemine on käsitsi kopeerida algse faili sisu (ja mitte midagi muud kui see sisu) terminali, mis töötab teie PC töölaual (valige tekst, paremklõpsake ja valige menüüst Koorida). Seejärel kleepige see uude faili sama nimega, mille loote teises terminalis, mis on ühendatud teie kliendiga.
Aga igaüks saab ju kopeerida ja kleepida. Mõelge selle asemel nagu administraator, sest teil ei pruugi alati olla juurdepääsu GUI-le, kus lõikamine/kleepimine on võimalik. Kopsige failid oma kasutaja kodukatalooge (kuna kaugoperatsioon scp peab neile juurde pääsema), seejärel kasutage chown, et muuta failide omanikku rootilt tavalisele kasutajale ilma root õigusteta, et saaksite kaugtoimingut scp teostada. Veenduge, et kõik teie failid on praeguseks seatud ja saadaval. Kliendile viite need natuke hiljem:
# 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.crtKogu šifreerimise võtmete komplekti olemasolul tuleb serverile teatada, kuidas soovite VPN-i luua. Seda tehakse server.conf faili abil.
Vähendame klahvivajutuste arvu
Kas pead liiga palju kirjutama? Klambrite laiendus aitab vähendada neid kuut käsku kahele. Olen kindel, et vous saate õppida neid kaht näidet ja mõista, mis toimub. Mis veelgi olulisem, te saate aru, kuidas neid põhimõtteid rakendada toimingutes, mis hõlmavad kümneid või isegi sadu elemente:
# cp /etc/openvpn/easy-rsa/keys/{ca.crt,client.{key,crt}} /home/ubuntu/ # chown ubuntu:ubuntu /home/ubuntu/{ca.crt,client.{key,crt}}
Server.conf faili seadistamine
Kust te teate, millisena server.conf fail välja nägema peaks? Pidage meeles easy-rsa kaustamalli, mille kopeerisite /usr/share/? OpenVPN-i installimisel jääb kompressitud konfigureerimise mallifail, mille saate kopeerida /etc/openvpn/. Toetan seda, et mall on arhiveeritud, ja tutvustan teile kasulikku tööriista: zcat.
Te juba teate, kuidas faili tekstisisu ekraanile väljastada cat käsuga, aga mis siis, kui fail on gzipiga kompressitud? Saate faili alati lahti pakkida, ja siis cat rõõmuga selle välja väljastab, kuid see on üks või kaks sammu rohkem, kui vaja. Selle asemel, nagu te juba tõenäoliselt arvasite, saate sisestada zcat käsu, et laadida lahtipakitud tekst mälu ühekordselt. Järgmises näites, selle asemel, et teksti ekraanile printida, suunate selle uude faili nimega server.conf:
# zcat
/usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz
> /etc/openvpn/server.conf
$ cd /etc/openvpnJätame kõrvale ulatusliku ja kasuliku dokumentatsiooni, mis on lisatud failile, ja vaatame, milline see võib välja näha, kui olete redigeerimise lõpetanud. Pange tähele, et semikoolon (;) ütleb OpenVPN-ile, et ta ei loe ja ei täida järgmist rida (loend 10.2).

Läheme läbi mõned neist seadistustest.
- Vaikimisi töötab OpenVPN läbi pordi 1194. Saate seda muuta, näiteks oma tegevuse veelgi varjamiseks või konfliktide vältimiseks teiste aktiivsete tunnelitega. Kuna 1194 nõuab minimaalselt koordineerimist klientidega, on parim just nii teha.
- OpenVPN kasutab andmete edastamiseks kas edastuse juhtimisprotokolli (TCP) või kasutajagrammide protokolli (UDP). TCP võib olla natuke aeglasem, kuid on usaldusväärsem ja tõenäolisem, et seda mõistetakse tunnelis mõlemal pool töötavate rakenduste poolt.
- Saate määrata dev tun, kui soovite luua lihtsama ja tõhusama IP-tunneli, mis edastab andmesisu ja mitte midagi muud. Kui seevastu peate ühendama mitu võrguliidest (ja võrke, mida need esindavad), luues Ethernet'i silda, peate valima dev tap. Kui te ei saa aru, mida kõik see tähendab, kasutage argumenti tun.
- Järgmised neli rida edastavad OpenVPN-ile kolme autentimist faili nimesid serveris ja dh2048 parameetrifaili, mille olete varem loonud.
- Rida server määrab vahemiku ja alamvõrgu maski, mida kasutatakse IP-aadresside määramiseks klientidele sisenemisel.
- Valikuline parameeter push „route 10.0.3.0 255.255.255.0” võimaldab kauklientidel pääseda ligi serveri taga olevatele privaatsetele alamvõrkudele. Selleks on vajalik ka võrgu seadistamine serveris, et privaatne alamvõrk tunneks OpenVPN alamvõrku (10.8.0.0).
- Rida port-share localhost 80 võimaldab suunata kliendiliiklust, mis tuleb kaudu pordi 1194, kohaliku veebiserveri suunas, mis kuulab pordi 80. (See on kasulik, kui kavatsete kasutada veebiserverit oma VPN-i testimiseks.) See töötab ainult siis, kui on valitud TCP protokoll.
- Ridadel user nobody ja group nogroup peavad olema kehtivad - selleks peab semikoolonid (; ) eemaldama. Kauklientide sundimine töötama nobody ja nogroup all tagab, et serveri sessioonid on ebateeninduslikud.
- log näitab, et praegused logikirjed kirjutatakse vanad logikirjed üle iga kord, kui OpenVPN käivitatakse, samas kui log-append lisab uusi kirjeid olemasolevasse logifaili. Logifail openvpn.log salvestatakse katalooge /etc/openvpn/.
Lisaks lisatakse konfigurationifaili sageli väärtus client-to-client, et mitmed kliendid saaksid Omavahel näha üksteist OpenVPN serveriga koos. Kui olete oma konfiguratsiooniga rahul, saate käivitada OpenVPN serveri:
# systemctl start openvpnKuna OpenVPN ja systemd vahelised suhted muutuvad, võib teenuse käivitamiseks vahel vajada järgmist süntaksit: systemctl start openvpn@server.
Käivitamine ip addr, et kuvada oma serveri võrguliideste nimekiri, peaks nüüd esitama viite uuele liidesele nimega tun0. OpenVPN loob selle sissetulevate klientide teenindamiseks:
$ 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 foreverVõimalik, et peate serveri taaskäivitama, enne kui kõik hakkab täielikult toimima. Järgmine peatus on kliendi arvuti.
10.1.2. OpenVPN kliendi konfigureerimine
Traditsiooniliselt ehitatakse tunnelid vähemalt kahe väljundiga (vastasel juhul kutsuksime neid koopaks). Korrektselt seadistatud OpenVPN server suunab liikluse tunnelisse ja sealt välja ühest küljest. Kuid vajate ka mingit tarkvara, mis töötab kliendi poolel, st tunnelist teisel pool.
Selles osas keskendun Linuxi arvuti käsitsi seadistamisele OpenVPN kliendina. Kuid see ei ole ainus viis, kuidas see on võimalik. OpenVPN toetab kliendirakendusi, mida saab installida ja kasutada Windowsi või macOS-i lauaarvutites ja sülearvutites, samuti Androidi ja iOS-i nutitelefonides ja tahvelarvutites. Üksikasjade jaoks vaadake openvpn.net-i.
OpenVPN pakett tuleb installida kliendi arvutisse, nagu see oli serveris, kuigi easy-rsa pole vajalik, kuna teie kasutatavad võtmed on juba olemas. Peate kopeerima faili mall client.conf katalooge /etc/openvpn/, mis just loodi. Seekord ei ole fail arhiivitud, seega tavakäsk cp sobib selle ülesande täitmiseks suurepäraselt:
# apt install openvpn
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf
/etc/openvpn/Enamik seadeid teie failis client.conf on üsna arusaadavad: need peavad vastama serveri väärtustele. Nagu järgmises näites näha, on ainulaadne parameeter remote 192.168.1.23 1194, mis näitab kliendile serveri IP-aadressi. Veenduge, et see on teie serveri aadress. Samuti peaksite tagama, et kliendi arvuti kontrollib serveri sertifikaadi ehtsust, et vältida võimalikku «mees keskel» rünnakut. Üks viis seda teha on lisada rida remote-cert-tls server (loetelu 10.3).

Nüüd võite minna katalooge /etc/openvpn/ ja tuua välja sertifitseerimise võtmed serverilt. Asendage serveri IP-aadress või domeeninimi näites oma väärtustega:

Midagi erakordset tõenäoliselt ei juhtu, kuni te ei käivita OpenVPN kliendil. Kuna peate edastama paar argumento, teete seda käsurealt. Argument —tls-client ütleb OpenVPN-le, et te tegutsete kliendina ja ühendute TLS-i krüpteerimise kaudu, ning —config osutab teie конфигурации файлов:
# openvpn --tls-client --config /etc/openvpn/client.confLugege hoolikalt käsu väljundit, et veenduda, et olete õigesti ühendatud. Kui midagi läheb esmakordselt valesti, võib probleem olla serveri ja kliendi конфигурации файлов vahelises kokkusobimatuses või võrguühenduse/põhjaseina probleemis. Siin on mõned näpunäited, kuidas tõrkeid kõrvaldada.
- Lugege hoolikalt OpenVPN tegevuse väljundit kliendil. See sisaldab sageli väärtuslikke nõuandeid selle kohta, mis ei õnnestu ja miks.
- Kontrollige vigu openvpn.log ja openvpn-status.log failides kataloogis /etc/openvpn/ serveris.
- Kontrollige OpenVPN-i ja asjakohaseid süsteemilogide sõnumeid serveris ja kliendil (journalctl -ce kuvab kõige viimased kirjed).
- Veenduge, et teil on aktiivne võrguühendus serveri ja kliendi vahel (lisaks vaadake peatükki 14).
Autori kohta
David Clinton — süsteemiadministraator, õpetaja ja kirjanik. Ta on haldanud, kirjutanud selle kohta ja loonud õppematerjale paljude oluliste tehniliste teaduste jaoks, sealhulgas Linuxi süsteemide, pilvearvutuse (eriti AWS) ja konteineritehnoloogiate, nagu Docker. Ta on kirjutanud raamatu "Learn Amazon Web Services in a Month of Lunches" (Manning, 2017). Paljusid tema õppematerjale leiab Pluralsight.com lehelt, samuti on lingid teistele tema raamatutele (Linuxi haldamise ja serverite virtualiseerimise kohta) saadaval aadressil .
» Raamatuga saab lähemalt tutvuda
»
»
Habr kasutajatele on 25% allahindlus kupongi abil — Linux
Paberkoopia eest maksmise korral saadetakse elektrooniline raamat e-posti teel.
Allikas: habr.com
