A "Linux a gyakorlatban" könyv

A "Linux a gyakorlatban" könyv Helló, Habr-lakók! David Clinton könyvében 12 valós projektet mutat be, többek között a mentési és visszaállítási rendszerek automatizálását, a Dropbox-stílusú személyes fájltárhely beállítását és a saját MediaWiki szerver létrehozását. Érdekes példákon keresztül megismerheted a virtualizációt, a vészhelyzeti helyreállítást, a biztonsági intézkedéseket, a mentéseket, a DevOps bevezetését és a rendszerhibák elhárítását. Minden fejezet gyakorlati ajánlásokkal, új kifejezések szótárával és feladatokkal zárul.

Részlet: „10.1. OpenVPN alagút létrehozása”

Ebben a könyvben már sokat beszéltem a titkosításról. Az SSH és SCP védhetik az adatokat, amelyek távoli kapcsolatokon keresztül kerülnek továbbításra (3. fejezet), a fájlok titkosítása lehetővé teszi az adatok védelmét a szerveren történő tároláskor (8. fejezet), míg a TLS/SSL tanúsítványok megvédhetik az adatokat az oldalak és az ügyféllapok közötti továbbítás során (9. fejezet). De néha az adataidnak szélesebb spektrumú védelmire van szükségük. Például lehet, hogy a csapatod egyes tagjainak az úton kell dolgozniuk, Wi-Fi-n keresztül csatlakozva a nyilvános hotspotokhoz. Határozottan nem szabad feltételezni, hogy minden ilyen hotspot biztonságos, de az embereidnek valóban szüksége van egy módra a vállalati erőforrásokhoz való hozzáférésre — ebben segít a VPN.

Egy jól megtervezett VPN-alagút közvetlen kapcsolatot biztosít a távoli kliensek és a szerver között úgy, hogy az adatok továbbítása a nem biztonságos hálózaton rejtve marad. Nos, és mi van? Már sok olyan eszközt láttál, amelyek ezt titkosítással el tudják érni. A VPN valódi értéke abban rejlik, hogy az alagút megnyitásával távoli hálózatokat csatlakoztathatsz, mintha azok mind helyben lennének. Bizonyos értelemben a kerülő úton használod őket.

Egy ilyen kiterjesztett hálózat használatával az adminisztrátorok bárhonnan végezhetik munkájukat a saját szervereiken. De ami még fontosabb, egy olyan vállalat, amelynek erőforrásai több fiók között oszlanak meg, láthatóvá és elérhetővé teheti azokat mindazok számára, akiknek szükségük van rájuk, bárhol is legyenek (10.1. ábra).

A tunneling solution by itself does not guarantee security. However, one of the encryption standards can be integrated into the network structure, significantly enhancing the security level. Tunnels created using the OpenVPN open-source package utilize the same TLS/SSL encryption you have already read about. While OpenVPN is not the only option available for tunneling, it is one of the most recognized. It is believed to be slightly faster and more secure than the alternative Layer 2 tunneling protocol that uses IPsec encryption.

Do you want everyone in your team to communicate securely with each other while on the go or working in different buildings? To achieve this, you need to set up an OpenVPN server to allow for application sharing and access to the server's local network environment. To make this work, it's sufficient to run two virtual machines or two containers: one for the server/host role and the other for the client. Creating a VPN is not a straightforward process, so it's likely worth spending a few minutes getting an overview of the big picture.

A "Linux a gyakorlatban" könyv

10.1.1. Configuring the OpenVPN Server

Before you begin, let me give you a helpful tip. If you plan to do everything yourself (and I highly recommend that you do), you will likely find yourself working with several terminal windows open on your Desktop, each connected to its own machine. There is a risk that at some point you might enter a command in the wrong window. To avoid this, you can use the hostname command to change the machine's name displayed in the command line to something that clearly indicates where you are. Once you do that, you will need to log out of the server and log back in for the new settings to take effect. Here’s what it looks like:

A "Linux a gyakorlatban" könyv
By sticking to this approach and assigning appropriate names to each of the machines you are working with, you will be able to easily track where you are.

After using the hostname, you may encounter the annoying messages Unable to Resolve Host OpenVPN-Server when executing subsequent commands. Updating the /etc/hosts file with the corresponding new hostname should resolve the issue.

Preparing your server for OpenVPN

Az OpenVPN telepítéséhez a szerveren két csomagra van szükség: openvpn és easy-rsa (a titkosító kulcs generálásának kezelésére). A CentOS felhasználóknak szükség esetén először telepíteniük kell az epel-release tárolót, ahogy ezt a 2. fejezetben is tették. A szerveralkalmazás elérhetőségének ellenőrzéséhez telepíthetik az Apache webszervert is (apache2 Ubuntu alatt és httpd CentOS alatt).

Míg beállítja a szervert, javaslom, hogy aktiválja a tűzfalat, amely blokkolja az összes portot, kivéve a 22-t (SSH) és a 1194-et (alapértelmezett OpenVPN port). Ez a példa bemutatja, hogyan fog működni az ufw Ubuntu alatt, de biztos vagyok benne, hogy még emlékszik a firewalld CentOS-ról a 9. fejezetből:

# ufw enable
# ufw allow 22
# ufw allow 1194

A szerver hálózati interfészei közötti belső forgalom engedélyezéséhez egy sort (net.ipv4.ip_forward = 1) ki kell kommentelnie a /etc/sysctl.conf fájlban. Ez lehetővé teszi a távoli kliensek irányítását a csatlakozásuk után. A változtatás életbe léptetéséhez futtassa a sysctl -p parancsot:

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

Most a szerver környezete teljesen be van állítva, de még van pár dolog, amit el kell végezni, mielőtt készen állna: a következő lépéseket kell végrehajtania (ezeket részletesen is megvizsgáljuk később).

  1. Hozzon létre egy kulcskészletet a nyílt kulcsú infrastruktúra (PKI) titkosításához a easy-rsa csomaggal szállított szkriptek segítségével. Gyakorlatilag az OpenVPN szerver saját tanúsítványkezelő központként (CA) is működik.
  2. Készítse el az ügyfélhez szükséges kulcsokat
  3. Konfigurálja a server.conf fájlt a szerverhez
  4. Állítsa be az OpenVPN ügyfelét
  5. Ellenőrizze a VPN-jét

Titkosító kulcsok generálása

A bonyodalmak elkerülése érdekében a kulcsinfrastruktúrát ugyanazon a gépen is beállíthatja, ahol az OpenVPN szerver fut. A biztonsági ajánlások azonban általában külön CA szerver használatát javasolják a termelési környezetekben. A titkosító kulcs generálásának és elosztásának folyamata az OpenVPN használatára az 10.2. ábrán látható.

A "Linux a gyakorlatban" könyv
Amikor az OpenVPN-t telepítette, az /etc/openvpn/ mappa automatikusan létrejött, de egyelőre üres. Az openvpn és easy-rsa csomagok sablonfájl példákat tartalmaznak, amelyeket alapként használhat a konfigurációjához. A tanúsítványozási folyamat elindításához másolja az easy-rsa sablonkönyvtárat a /usr/share/ könyvtárból az /etc/openvpn mappába, majd lépjen be az easy-rsa/ könyvtárba:

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

Az easy-rsa könyvtár mostantól számos szkriptet fog tartalmazni. A 10.1. táblázat sorolja fel azokat az eszközöket, amelyeket a kulcsok létrehozásához használni fog.

A "Linux a gyakorlatban" könyv

A felsorolt műveletek root jogosultságokat igényelnek, ezért a sudo su parancs segítségével root jogokra van szüksége.

Az első fájl, amellyel dolgozni fog, a vars nevű fájl, amely azokat a környezeti változókat tartalmazza, amelyeket az easy-rsa kulcsgeneráláshoz használ. Szerkesztenie kell a fájlt, hogy a saját értékeit alkalmazza az alapértelmezett értékek helyett. Így néz ki az én fájlom (10.1-es listázás).

10.1. listázás. A /etc/openvpn/easy-rsa/vars fájl főbb részei

export KEY_COUNTRY="HU"
export KEY_PROVINCE="BU"
export KEY_CITY="Budapest"
export KEY_ORG="Bootstrap IT"
export KEY_EMAIL="info@bootstrap-it.com"
export KEY_OU="IT"

A vars fájl futtatása lehetővé teszi, hogy az értékeit átadja a shell környezetnek, ahonnan azok be lesznek vonva az új kulcsai tartalmába. Miért nem működik önmagában a sudo parancs? Mert az első lépésben a vars nevű szkriptet szerkesztjük, majd alkalmazzuk. Az alkalmazás azt jelenti, hogy a vars fájl átadja az értékeit a shell környezetnek, ahonnan azok be lesznek vonva az új kulcsai tartalmába.

Győződjön meg róla, hogy újra futtatja a fájlt egy új shell használatával, hogy befejezze a félbehagyott folyamatot. Amikor ez megtörténik, a szkript felajánlja, hogy futtassa a clean-all nevű másik szkriptet, hogy törölje a /etc/openvpn/easy-rsa/keys/ könyvtárban található tartalmakat:

A "Linux a gyakorlatban" könyv
Természetesen a következő lépés a clean-all szkript futtatása, ezt követi a build-ca, ami a pkitool szkriptet használja a gyökér tanúsítvány létrehozásához. Megkérdezik, hogy megerősíti-e a vars által megadott azonosítási beállításokat:

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

Ezután a build-key-server szkript következik. Mivel ugyanezt a pkitool szkriptet használja az új gyökér tanúsítvánnyal együtt, ugyanazokat a kérdéseket fogja látni a kulcspár létrehozásának megerősítéséhez. A kulcsok neveket kapnak az Ön által átadott argumentumok alapján, amelyek, hacsak nem futtat több VPN-t ezen a gépen, általában server lesz, ahogy az a példában is látható:

# ./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

Az OpenVPN a Diffie–Hellman algoritmus segítségével generált paramétereket használ az új kapcsolatok hitelesítésének egyeztetésére (a build-dh alkalmazásával). Az itt létrehozott fájl nem titkos, de a jelenleg aktív RSA kulcsok generálásához a build-dh szkriptet kell használnia. Ha a jövőben új RSA kulcsokat hoz létre, frissítenie kell a Diffie–Hellman algoritmusra alapozott fájlt is:

# ./build-dh

A szerveroldali kulcsai most a következő könyvtárba kerülnek: /etc/openvpn/easy-rsa/keys/, de az OpenVPN ezt nem tudja. Alapértelmezés szerint az OpenVPN a kulcsokat az /etc/openvpn/ könyvtárban keresi, ezért másolja át őket:

# 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

A kliens titkosítási kulcsainak előkészítése

Ahogy már látta, a TLS-titkosítás párba állított kulcsokat használ: az egyik a szerveren, a másik pedig a távoli kliensnél. Ez azt jelenti, hogy szüksége lesz a kliens kulcsaira. Régi barátunk, a pkitool éppen erre való. Ebben a példában, a /etc/openvpn/easy-rsa/ könyvtárban futtatva a programot, a client argumentumot adva generáljuk a client.crt és client.key nevű fájlokat:

# ./pkitool client

A két kliens fájl együtt az eredeti ca.crt fájllal, amely még mindig a keys/ könyvtárban található, biztonságosan át kell adni a kliensének. Tulajdonjoguk és hozzáférési jogok miatt ez nem feltétlenül lesz könnyű feladat. A legegyszerűbb megközelítés, ha a forrásfájl tartalmát (és semmi mást) manuálisan átmásolja a PC-je asztalán futó terminálba (válassza ki a szöveget, kattintson rá a jobb gombbal, és válassza a Copy (Másolás) menüpontot). Ezután illessze be ezt egy új fájlba, ugyanolyan névvel, mint amit a második terminálban hoz létre, amely csatlakozik a klienséhez.

De bárki kivághatja és beillesztheti. Inkább úgy gondolkodjon, mint egy adminisztrátor, mert nem mindig lesz hozzáférése a GUI-hoz, ahol a vágás/beillesztés művelete lehetséges. Másolja a fájlokat a felhasználója otthoni könyvtárába (hogy a távoli scp művelet hozzáférhessen), majd a chown segítségével változtassa meg a fájlok tulajdonosát root-ról egy szokványos felhasználóra, akinek nincs root jogosultsága, hogy végrehajthasson egy távoli scp műveletet. Győződjön meg arról, hogy minden fájlja jelenleg be van állítva és elérhető. Ezután kicsit később áthelyezi őket a kliensre:

# 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

A teljes titkosító kulcsszettel, készen a működéshez, meg kell mondja a szervernek, hogyan szeretné létrehozni a VPN-t. Ezt a server.conf fájl használatával lehet megtenni.

Csökkentjük a billentyűleütések számát

Túl sokat kell gépelnie? A zárójelek kiterjesztése segít ezeket a hat parancsot kettőre csökkenteni. Biztos vagyok benne, hogy képes lesz megtanulni ezt a két példát, és megérteni, hogy mi történik. Ami még fontosabb, meg fogja érteni, hogyan alkalmazza ezeket az elveket olyan műveletekre, amelyek tucatnyi vagy akár száz elemet is tartalmaznak:

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

A server.conf fájl beállítása

Honnan tudhatja, hogyan kell kinéznie a server.conf fájlnak? Ne feledje az easy-rsa könyvtár sablonját, amelyet átmásolt a /usr/share/ mappából? Az OpenVPN telepítésekor megmaradt egy tömörített konfigurációs sablon fájl, amelyet átmásolhat a /etc/openvpn/ könyvtárba. Azokra a helyzetekre építek, amikor a sablon tömörítve van, és szeretném bemutatni Önnek egy hasznos eszközt: zcat.

Már tudja, hogyan lehet fájl szöveges tartalmát megjeleníteni a cat parancs segítségével, de mi van akkor, ha a fájl gzip formátumban van tömörítve? Mindig ki tudja csomagolni a fájlt, és akkor a cat örömmel megjeleníti, de ez egy vagy két lépéssel több, mint amennyire szükség lenne. Ehelyett, ahogy valószínűleg már kitalálta, beírhatja a zcat parancsot az egy lépésben történő kicsomagolt szöveg memóriába betöltéséhez. A következő példában ahelyett, hogy a szöveget a képernyőre nyomtatná, átirányítja egy új fájlba, amelynek neve server.conf:

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

Hagyjuk figyelmen kívül a fájlhoz mellékelt kiterjedt és hasznos dokumentációt, és nézzük meg, hogyan nézhet ki, amikor befejezi a szerkesztést. Vegye figyelembe, hogy a pontosvessző (;) azt jelzi az OpenVPN-nek, hogy ne olvassa el és ne hajtsa végre a következő sort (10.2-es listázás).

A "Linux a gyakorlatban" könyv
Nézzük át ezeket a beállításokat.

  • Alapértelmezés szerint az OpenVPN a 1194-es porton működik. Ezt megváltoztathatja, hogy még inkább eltitkolja a tevékenységeit, vagy elkerülje a konfliktusokat más aktív alagutakkal. Mivel a 1194 minimális koordinációt igényel az ügyfelekkel, legjobb ezt megtenni.
  • Az OpenVPN vagy a Transmission Control Protocol (TCP), vagy a User Datagram Protocol (UDP) használatával végzi az adatátvitelt. A TCP egy kicsit lassabb lehet, de megbízhatóbb, és nagyobb valószínűséggel érthető a tunnelen mindkét végén futó alkalmazások számára.
  • A dev tun megadása lehetővé teszi, hogy egy egyszerűbb és hatékonyabb IP-alagutat hozzon létre, amely csak az adatokat továbbítja. Ezzel szemben, ha több hálózati interfészt (és az általuk képviselt hálózatokat) szeretne csatlakoztatni Ethernet-híd létrehozásával, akkor a dev tap opciót kell választania. Ha nem érti, mit jelentenek ezek, használja a tun argumentumot.
  • A következő négy sor az OpenVPN-nek átadja a szerveren három hitelesítési fájl nevét, valamint a korábban létrehozott dh2048 paraméterek fájlt.
  • A server sor beállítja az IP-címek kiosztásához használt tartományt és alhálózati maszkot a bejelentkezéskor.
  • A push opcionális paraméter 'route 10.0.3.0 255.255.255.0' lehetővé teszi, hogy a távoli felhasználók hozzáférjenek a szerver mögötti privát alhálózatokhoz. Ennek végrehajtásához a szerveren belüli hálózatbeállítások is szükségesek, hogy a privát alhálózat tudjon az OpenVPN alhálózatról (10.8.0.0).
  • A port-share localhost 80 sor lehetővé teszi, hogy a 1194-es porton érkező kliensforgalmat a 80-as porton hallgató helyi webkiszolgálóra irányítsa. (Hasznos lehet, ha webkiszolgálót kíván használni a VPN teszteléséhez.) Ez csak a tcp protokoll kiválasztásakor működik.
  • A user nobody és group nogroup sorokat aktívvá kell tenni - ehhez eltávolítani a pontosvesszőt (;). A távoli felhasználók nobody és nogroup alatt történő futtatása garantálja, hogy a szerveren lévő munkamenetek nem lesznek privilegizáltak.
  • A log megadja, hogy a jelenlegi naplóbejegyzések felülírják a régi bejegyzéseket minden OpenVPN indításkor, míg a log-append új bejegyzéseket ad a létező naplófájlhoz. Az openvpn.log fájl a /etc/openvpn/ könyvtárba íródik.

Ezenkívül a konfigurációs fájlhoz gyakran hozzáadják a client-to-client értéket is, hogy több kliens láthassa egymást az OpenVPN szerver mellett. Ha elégedett a konfigurációval, indíthatja az OpenVPN szervert:

# systemctl start openvpn

Az OpenVPN és a systemd közötti kapcsolatok változatos jellege miatt a szolgáltatás indításához néha ilyen szintaxisra lehet szükség: systemctl start openvpn@server.

Az ip addr indítása a szerverén lévő hálózati interfészek listájának megjelenítésére most már ki kell adnia egy új interfész hivatkozását, amelynek neve tun0. Az OpenVPN létrehozza ezt a bejövő kliensek kiszolgálására:

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

Előfordulhat, hogy újra kell indítania a szervert, mielőtt minden teljesen működni kezd. A következő megálló — a kliens számítógép.

10.1.2. Az OpenVPN kliens konfigurálása

Hagyományosan a alagutakat legalább két kijárattal építik meg (különben barlangoknak hívnánk őket). A jól konfigurált OpenVPN a szerveren a forgalmat az alagútba irányítja, majd onnan ki. De szüksége lesz egy szoftverre is, amely a kliens oldalán, az alagút másik végén működik.

Ebben a részben a Linux alapú számítógép manuális beállítására fogok összpontosítani, hogy OpenVPN kliensként működjön. De nem ez az egyetlen módja annak, hogy ez a lehetőség elérhető legyen. Az OpenVPN kliensalkalmazásokat támogat, amelyeket telepíthet és használhat Windows vagy macOS asztali számítógépeken, valamint Android és iOS alapú okostelefonokon és táblagépeken. Részletek az openvpn.net weboldalon találhatók.

Az OpenVPN csomagot telepítenie kell a kliens számítógépére, ahogyan az a szerveren is megtörtént, bár itt nem szükséges easy-rsa, mivel a használt kulcsok már léteznek. A client.conf sablonfájlt a /etc/openvpn/ könyvtárba kell másolnia, amelyet most hoztak létre. Ezúttal a fájl nem lesz tömörítve, így a szokásos cp parancs jól elvégzi ezt a feladatot:

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

A client.conf fájlban található legtöbb beállítás viszonylag érthető lesz: azoknak a szerver értékeivel kell összhangban lenniük. Az alábbi fájl példa alapján a egyedüli paraméter a remote 192.168.1.23 1194, amely a kliensnek a szerver IP-címét adja meg. Ismét győződjön meg róla, hogy ez az Ön szerverének címe. A kliens számítógépét is meg kell győznie a szerver tanúsítványának hitelesítéséről, hogy elkerülje a „középen lévő ember” támadást. Az egyik módja ennek a remote-cert-tls server sor hozzáadása (10.3. listázás).

A "Linux a gyakorlatban" könyv
Most átmehet a /etc/openvpn/ könyvtárba, és kinyerheti a tanúsítvány kulcsokat a szerverről. Cserélje ki a példa IP-címét vagy domain nevét a saját értékeire:

A "Linux a gyakorlatban" könyv
Valószínűleg semmi izgalmas nem fog történni, amíg el nem indítja az OpenVPN-t az ügyfélen. Mivel át kell adnia néhány argumentumot, ezt a parancssorból fogja megtenni. Az —tls-client argumentum azt jelzi az OpenVPN-nek, hogy ügyfélként fog működni, és TLS titkosításon keresztül fog csatlakozni, míg az —config a konfigurációs fájlra mutat:

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

Figyelmesen olvassa el a parancs kimenetét, hogy megbizonyosodjon arról, hogy helyesen csatlakozott. Ha első alkalommal valami rosszul alakul, az lehet a szerver és az ügyfél konfigurációs fájljai közötti beállítások összeférhetetlensége, vagy egy hálózati kapcsolat/firewall probléma. Íme néhány hibaelhárítási tipp.

  • Figyelmesen olvassa el az OpenVPN művelet kimenetét az ügyfélen. Gyakran tartalmaz értékes tanácsokat arról, hogy miért nem teljesülhetett a művelet.
  • Ellenőrizze az openvpn.log és openvpn-status.log hibajelentéseit a /etc/openvpn/ könyvtárban a szerveren.
  • Ellenőrizze az OpenVPN-hez kapcsolódó és időben releváns bejegyzéseket a rendszernaplókban a szerveren és az ügyfélen. (A journalctl -ce a legfrissebb bejegyzéseket jeleníti meg.)
  • Győződjön meg arról, hogy aktív hálózati kapcsolat áll fenn a szerver és az ügyfél között (további információ a 14. fejezetben).

A szerzőről

David Clinton — rendszeradminisztrátor, oktató és író. Számos fontos technikai szakterületről adminisztrált, írt és készített tananyagokat, beleértve a Linux rendszerek, felhőalapú számítástechnika (különösen az AWS) és a konténer technológiák, mint a Docker. Ő írta a Learn Amazon Web Services in a Month of Lunches (Manning, 2017) című könyvet. Sok tanulmányi videókurzusát megtalálhatja a Pluralsight.com oldalon, és más könyveinek (Linux adminisztráció és szervervirtualizáció) hivatkozásai elérhetők a bootstrap-it.com.

» Részletesebben a könyvről a kiadó weboldalán olvasható
» Tartalomjegyzék
» Részlet

A Habr lakói számára 25% kedvezmény a kuponnal — Linux
A papíralapú könyv kifizetése után elektronikus könyv kerül kiküldésre e-mailben.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster