Kniha „Linux v akci“

Kniha „Linux v akci“ Ahoj, Habráci! V knize David Clinton popisuje 12 skutečných projektů, včetně automatizace systému zálohování a obnovy, nastavení osobního souborového cloudu ve stylu Dropbox a vytvoření vlastního serveru MediaWiki. Na zajímavých příkladech se naučíte virtualizaci, havarijní obnovu, zabezpečení, zálohování, implementaci DevOps a řešení problémů se systémem. Každá kapitola končí přehledem praktických doporučení, glosářem nových termínů a cvičeními.

Úryvek „10.1. Vytvoření tunelu OpenVPN“

V této knize jsem již mnoho řekl o šifrování. SSH a SCP mohou chránit data přenášená přes vzdálená spojení (kapitola 3), šifrování souborů umožňuje chránit data při ukládání na serveru (kapitola 8) a certifikáty TLS/SSL mohou chránit data při přenosu mezi weby a uživatelskými prohlížeči (kapitola 9). Ale někdy vyžadují vaše data ochranu v širším spektru spojení. Například někteří členové vašeho týmu možná musí pracovat na cestách a připojovat se k síti přes Wi-Fi prostřednictvím veřejných hotspotů. Určitě byste se neměli spoléhat na to, že všechny takové hotspoty jsou bezpečné, ale vašim lidem opravdu potřebují způsob, jak se připojit k firemním zdrojům — a v tomto případě může pomoci VPN.

Správně navržený VPN tunel zajišťuje přímé spojení mezi vzdálenými klienty a serverem tak, aby skrýval data při jejich přenosu po nezabezpečené síti. A co na tom? Už jste viděli spoustu nástrojů, které to mohou udělat pomocí šifrování. Skutečná hodnota VPN spočívá v tom, že otevřením tunelu můžete připojit vzdálené sítě, jako by byly všechny společně lokální. V jistém smyslu používáte obchvat.

Používáním takové rozšířené sítě mohou administrátoři vykonávat svou práci na svých serverech odkudkoli. Ale co je důležitější, firma s prostředky rozloženými na několika pobočkách může učinit tyto prostředky viditelnými a přístupnými všem týmům, které je potřebují, ať už jsou kdekoli (obr. 10.1).

Tunel sám o sobě nezaručuje bezpečnost. Ale jeden ze standardů šifrování může být začleněn do struktury sítě, což zásadně zvyšuje úroveň bezpečnosti. Tunely vytvořené pomocí balíčku OpenVPN s otevřeným zdrojovým kódem používají stejné šifrování TLS/SSL, o kterém jste se už dozvěděli. OpenVPN není jedinou dostupnou volbou pro tunelování, ale je jednou z nejznámějších. Předpokládá se, že je o něco rychlejší a bezpečnější než alternativní tunelový protokol úrovně 2, který používá šifrování IPsec.

Chcete, aby ve vašem týmu všichni bezpečně komunikovali mezi sebou, zatímco jsou na cestách nebo pracují v různých budovách? K tomu je potřeba vytvořit server OpenVPN, aby se umožnilo sdílení aplikací a přístup k lokálnímu síťovému prostředí serveru. Aby to fungovalo, stačí spustit dva virtuální stroje nebo dva kontejnery: jeden pro roli serveru/hostitele a druhý pro klienta. Vytvoření VPN není jednoduchý proces, a proto má smysl věnovat několik minut tomu, abyste si představili celkový obraz.

Kniha „Linux v akci“

10.1.1. Konfigurace serveru OpenVPN

Než začnete, dám vám užitečný tip. Pokud se chystáte udělat to všechno sami (a já vás důrazně doporučuji), pravděpodobně zjistíte, že pracujete s několika terminálovými okny otevřenými na pracovní ploše, přičemž každé z nich je připojeno k vlastnímu stroji. Existuje riziko, že v nějakém okamžiku zadáte příkaz do nesprávného okna. Aby se tomu předešlo, můžete použít příkaz hostname k změně názvu stroje, který se zobrazuje v příkazovém řádku, na něco, co vám jasně řekne, kde se nacházíte. Jakmile to uděláte, budete se muset od serveru odhlásit a přihlásit se znovu, aby se nové nastavení projevilo. Takto to vypadá:

Kniha „Linux v akci“
Dodržováním tohoto přístupu a přiřazováním příslušných názvů každému ze strojů, se kterými pracujete, budete schopni snadno sledovat, kde se nacházíte.

Po použití hostname se můžete setkat s nepříjemnými zprávami Unable to Resolve Host OpenVPN-Server při provádění následných příkazů. Aktualizace souboru /etc/hosts s odpovídajícím novým názvem hostitele by měla tento problém vyřešit.

Příprava vašeho serveru pro OpenVPN

K pro instalaci OpenVPN na vašem serveru jsou potřeba dva balíčky: openvpn a easy-rsa (pro správu procesu generování klíče šifrování). Uživatelé CentOS by měli nejprve nainstalovat repozitář epel-release, pokud je to nutné, jak jste to dělali v kapitole 2. Aby bylo možné ověřit přístup k serverové aplikaci, můžete také nainstalovat webový server Apache (apache2 pro Ubuntu a httpd na CentOS).

Zatímco nastavujete server, doporučuji aktivovat firewall, který blokuje všechny porty kromě 22 (SSH) a 1194 (výchozí port OpenVPN). Tento příklad ukazuje, jak bude fungovat ufw v Ubuntu, ale jsem si jistý, že si stále pamatujete program firewalld CentOS z kapitoly 9:

# ufw enable
# ufw allow 22
# ufw allow 1194

Aby byla povolena vnitřní routování mezi síťovými rozhraními na serveru, musíte odkomentovat jeden řádek (net.ipv4.ip_forward = 1) v souboru /etc/sysctl.conf. To umožní přesměrování vzdálených klientů podle potřeby po jejich připojení. Aby nový parametr začal fungovat, spusťte sysctl -p:

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

Nyní je serverové prostředí plně nastaveno, ale před tím, než budete připraveni, je třeba udělat ještě pár věcí: budete muset provést následující kroky (podrobněji je probereme později).

  1. Vytvořte na serveru sadu klíčů pro šifrovací infrastrukturu otevřených klíčů (PKI) pomocí skriptů dodávaných s balíčkem easy-rsa. V podstatě server OpenVPN také funguje jako vlastní certifikační autorita (CA).
  2. Připravte odpovídající klíče pro klienta
  3. Zkonfigurujte soubor server.conf pro server
  4. Nastavte svého klienta OpenVPN
  5. Otestujte svou VPN

Generování šifrovacích klíčů

Abychom si to zjednodušili, můžeme nastavit svoji klíčovou infrastrukturu na stejném stroji, na kterém běží server OpenVPN. Však se ve zprávách o zabezpečení obvykle doporučuje používat samostatný server CA pro nasazení v produkčním prostředí. Proces generování a distribuce zdrojů šifrovacího klíče pro použití v OpenVPN je vyobrazen na obr. 10.2.

Kniha „Linux v akci“
Když jste instalovali OpenVPN, automaticky byla vytvořena složka /etc/openvpn/, ale zatím v ní není nic. Balíčky openvpn a easy-rsa dodávají příklady šablonových souborů, které můžete použít jako základ pro svou konfiguraci. Abychom spustili certifikační proces, zkopírujte šablonový adresář easy-rsa z /usr/share/ do /etc/openvpn a přejděte do adresáře easy-rsa/:

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

Katalog easy-rsa nyní bude obsahovat poměrně hodně skriptů. V tabulce 10.1 jsou vyjmenovány nástroje, které budete potřebovat k vytváření klíčů.

Kniha „Linux v akci“

Uvedené operace vyžadují oprávnění root, proto se musíte stát rootem pomocí sudo su.

První soubor, se kterým budete pracovat, se nazývá vars a obsahuje proměnné prostředí, které easy-rsa používá při generování klíčů. Musíte upravit soubor, abyste používali vlastní hodnoty místo výchozích hodnot, které již existují. Takto vypadá můj soubor (výpis 10.1).

Výpis 10.1. Hlavní úryvky souboru /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"

Spuštění souboru vars umožní předat jeho hodnoty do prostředí shellu, odkud budou zahrnuty do obsahu vašich nových klíčů. Proč příkaz sudo sám o sobě nefunguje? Protože v prvním kroku upravujeme skript s názvem vars a poté ho aplikujeme. Aplikace znamená, že soubor vars předává své hodnoty do prostředí shellu, odkud budou zahrnuty do obsahu vašich nových klíčů.

Určitě znovu spusťte soubor pomocí nového shellu, aby se dokončil nedokončený proces. Jakmile to bude hotové, skript vám navrhne spustit další skript clean-all pro odstranění veškerého obsahu v adresáři /etc/openvpn/easy-rsa/keys/:

Kniha „Linux v akci“
Přirozeně dalším krokem bude spuštění skriptu clean-all, za kterým následuje build-ca, který používá skript pkitool k vytvoření kořenového certifikátu. Budete požádáni o potvrzení identifikačních nastavení poskytnutých souborem vars:

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

Dalším skriptem je build-key-server. Protože využívá stejný skript pkitool spolu s novým kořenovým certifikátem, uvidíte stejné otázky pro potvrzení vytvoření páru klíčů. Klíčům budou přidělena jména na základě argumentů, které předáte, což, pokud na tomto počítači nespouštíte několik VPN, obvykle bude server, jako v příkladu:

# ./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 používá parametry generované algoritmem Diffie-Hellman (s použitím build-dh) k dohodě o autentizaci pro nová spojení. Soubor vytvořený zde by neměl být tajný, ale měl by být vygenerován pomocí skriptu build-dh pro aktivní RSA klíče. Pokud v budoucnu vytvoříte nové RSA klíče, budete také potřebovat aktualizovat soubor na základě algoritmu Diffie-Hellman:

# ./build-dh

Vaše klíče na straně serveru nyní skončí v adresáři /etc/openvpn/easy-rsa/keys/, ale OpenVPN o tom neví. Ve výchozím nastavení OpenVPN hledá klíče v /etc/openvpn/, takže je zkopírujte:

# 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

Příprava šifrovacích klíčů klienta

Jak jste již viděli, v šifrování TLS se používají páry odpovídajících klíčů: jeden je nastaven na serveru, druhý na vzdáleném klientovi. To znamená, že budete potřebovat klíče klienta. Náš starý přítel pkitool je právě to, co potřebujete. V tomto příkladu, spuštěním programu v adresáři /etc/openvpn/easy-rsa/ předáváme mu argument client pro generaci souborů s názvy client.crt a client.key:

# ./pkitool client

Dva klientské soubory spolu se zdrojovým souborem ca.crt, který se stále nachází v adresáři keys/, by nyní měly být bezpečně předány vašemu klientovi. Vzhledem k jejich vlastnictví a oprávněním to nemusí být tak jednoduché. Nejjednodušší přístup je ručně zkopírovat obsah zdrojového souboru (a nic jiného než tento obsah) do terminálu běžícího na ploše vašeho PC (vyberte text, klikněte na něj pravým tlačítkem myši a vyberte v nabídce možnost Kopírovat). Pak to vložte do nového souboru se stejným názvem, který vytváříte ve druhém terminálu připojeném k vašemu klientovi.

Ale každý může vyříznout a vložit. Myslete na to jako na administrátor, protože ne vždy budete mít přístup k GUI, kde je možné provést operaci vyříznutí/vložení. Zkopírujte soubory do domovského adresáře vašeho uživatele (aby na ně vzdálená operace scp měla přístup) a pak pomocí chown změňte vlastníka souborů z root na běžného uživatele bez oprávnění root, aby bylo možné provést vzdálenou akci scp. Ujistěte se, že všechny vaše soubory jsou nyní nainstalovány a dostupné. Na klienta je přemístíte o něco později:

# 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

S kompletním souborem šifrovacích klíčů připravených k použití musíte serveru sdělit, jak chcete vytvořit VPN. To se provádí pomocí souboru server.conf.

Snižujeme počet stisknutí kláves

Musíte příliš mnoho psát? Rozšíření se závorkami pomůže zredukovat těchto šest příkazů na dva. Jsem si jistý, že se můžete naučit tyto dva příklady a pochopit, co se děje. Co je ještě důležitější, budete schopni pochopit, jak použít tyto principy na operace zahrnující desítky nebo dokonce stovky prvků:

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

Nastavení souboru server.conf

Odkud víte, jak by měl soubor server.conf vypadat? Pamatujte na šablonu adresáře easy-rsa, kterou jste zkopírovali z /usr/share/? Při instalaci OpenVPN zůstal zkomprimovaný šablonový konfigurační soubor, který můžete zkopírovat do /etc/openvpn/. Budu vycházet z toho, že šablona je archivována, a seznámím vás s užitečným nástrojem: zcat.

Již víte o výstupu textového obsahu souboru na obrazovku pomocí příkazu cat, ale co když je soubor zkomprimován pomocí gzip? Vždy můžete soubor rozbalit, a pak cat rád vyprodukuje výstup, ale to je o krok nebo dva víc, než je potřeba. Místo toho, jak jste si asi domysleli, můžete zadat příkaz zcat pro načtení rozbaleného textu do paměti v jednom kroku. V následujícím příkladu místo toho, abyste tiskli text na obrazovku, přesměrujete ho do nového souboru s názvem server.conf:

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

Ponechme stranou rozsáhlou a užitečnou dokumentaci přiloženou k souboru a podívejme se, jak by mohl vypadat, když dokončíte úpravy. Všimněte si, že středník (;) říká OpenVPN, aby další řádek nečetl a nevykonával (výpis 10.2).

Kniha „Linux v akci“
Podívejme se na některá z těchto nastavení.

  • Výchozí port pro OpenVPN je 1194. Můžete to změnit, například abyste ještě více skryli své aktivity nebo se vyhnuli konfliktům s jinými aktivními tunely. Jelikož 1194 vyžaduje minimální koordinaci se zákazníky, je nejlepší to udělat tímto způsobem.
  • OpenVPN používá k přenosu dat buď protokol řízení přenosu (TCP), nebo protokol pro uživatelské datagramy (UDP). TCP může být o něco pomalejší, ale je spolehlivější a s větší pravděpodobností je srozumitelný aplikacím, které běží na obou koncích tunelu.
  • Můžete uvést dev tun, když chcete vytvořit jednodušší a efektivnější IP tunel, který přenáší pouze data a nic víc. Na druhou stranu, pokud potřebujete připojit více síťových rozhraní (a sítí, které zastupují), budete muset zvolit dev tap. Pokud tomu všemu nerozumíte, použijte argument tun.
  • Následující čtyři řádky předávají OpenVPN názvy tří autentizačních souborů na serveru a soubor parametrů dh2048, který jste vytvořili dříve.
  • Řádek server určuje rozsah a masku podsítě, které budou použity při přidělování IP adres klientům při přihlášení.
  • Volitelný parametr push „route 10.0.3.0 255.255.255.0“ umožňuje vzdáleným klientům přístup k privátním podsítím za serverem. K tomu je také nutná konfigurace sítě na samotném serveru, aby privátní podsíť věděla o podsíti OpenVPN (10.8.0.0).
  • Řádek port-share localhost 80 umožňuje přesměrování klientského provozu přicházejícího na portu 1194 na místní webový server, který naslouchá na portu 80. (Bude užitečné, pokud se chystáte použít webový server k testování vaší VPN.) To funguje pouze v případě, že je vybrán protokol tcp.
  • Řádky user nobody a group nogroup by měly být aktivovány — k tomu je třeba odstranit středník (;). Donucování vzdálených klientů, aby běželi pod nobody a nogroup, zajišťuje, že relace na serveru budou nepř privilege.
  • log uvádí, že aktuální záznamy v deníku budou přepisovat staré záznamy při každém spuštění OpenVPN, zatímco log-append přidává nové záznamy do existujícího souboru deníku. Samotný soubor openvpn.log je zapisován do adresáře /etc/openvpn/.

Kromě toho se do konfiguračního souboru často přidává hodnota client-to-client, aby se několik klientů mohlo vidět navzájem kromě serveru OpenVPN. Pokud jste spokojeni se svou konfigurací, můžete spustit server OpenVPN:

# systemctl start openvpn

Vzhledem k měnící se povaze vztahů mezi OpenVPN a systemd může k spuštění služby někdy vyžadovat tento syntax: systemctl start openvpn@server.

Spuštění ip addr k zobrazení seznamu síťových rozhraní vašeho serveru nyní by mělo vypsat odkaz na nové rozhraní s názvem tun0. OpenVPN jej vytvoří pro obsluhu příchozích klientů:

$ 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

Možná budete muset restartovat server, než všechno začne fungovat naplno. Další zastávkou je klientský počítač.

10.1.2. Konfigurace klienta OpenVPN

Tradicionalně jsou tunely budovány alespoň se dvěma výstupy (jinak bychom je nazývali jeskyněmi). Správně nakonfigurovaný OpenVPN na serveru směruje provoz do tunelu a z něj na jedné straně. Ale budete také potřebovat nějaký software, který běží na straně klienta, tedy na druhém konci tunelu.

V této části se zaměřím na ruční nastavení počítače s Linuxem jakéhokoli typu, aby fungoval jako klient OpenVPN. Ale to není jediný způsob, jak je tato funkce k dispozici. OpenVPN podporuje klientské aplikace, které lze nainstalovat a používat na stolních počítačích a laptopech s Windows nebo macOS, stejně jako na smartphonech a tabletech s Androidem a iOS. Podrobnosti najdete na openvpn.net.

Balíček OpenVPN bude třeba nainstalovat na klientský počítač, jako byl nainstalován na serveru, i když zde není nutná easy-rsa, protože vámi použití klíče již existují. Musíte zkopírovat soubor šablony client.conf do adresáře /etc/openvpn/, který byl právě vytvořen. Tentokrát soubor nebude zarchivován, takže běžný příkaz cp skvěle splní tento úkol:

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

Většina nastavení ve vašem souboru client.conf bude docela srozumitelná: měla by odpovídat hodnotám na serveru. Jak je vidět z následujícího příkladu souboru, unikátním parametrem je remote 192.168.1.23 1194, který uvádí klientovi IP adresu serveru. Opět se ujistěte, že je to adresa vašeho serveru. Také musíte přimět klientský počítač ověřovat certifikát serveru, abyste předešli potenciálním útokům „člověk uprostřed“. Jedním ze způsobů, jak to udělat, je přidat řádek remote-cert-tls server (výpis 10.3).

Kniha „Linux v akci“
Nyní můžete přejít do adresáře /etc/openvpn/ a vytáhnout certifikační klíče ze serveru. Nahraďte IP adresu serveru nebo název domény ve vzoru svými hodnotami:

Kniha „Linux v akci“
Něco vzrušujícího se pravděpodobně nestane, dokud nespustíte OpenVPN na klientovi. Protože potřebujete předat pár argumentů, provedete to z příkazového řádku. Argument —tls-client říká OpenVPN, že budete jednat jako klient a připojíte se přes šifrování TLS, a —config odkazuje na váš konfigurační soubor:

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

Pečlivě si přečtěte výstup příkazu, abyste se ujistili, že jste řádně připojeni. Pokud něco nepůjde dobře poprvé, může to být kvůli nesouladu mezi konfiguracemi serveru a klienta nebo problémům se síťovým připojením/firewallem. Zde je několik tipů pro řešení problémů.

  • Pečlivě si přečtěte výstup operace OpenVPN na klientovi. Často obsahuje cenné rady o tom, co přesně nemůže být provedeno a proč.
  • Zkontrolujte chybové zprávy v souborech openvpn.log a openvpn-status.log v adresáři /etc/openvpn/ na serveru.
  • Podívejte se na zprávy související s OpenVPN a časově relevantní v systémových protokolech na serveru a klientovi. (journalctl -ce zobrazí nejnovější záznamy.)
  • Ujistěte se, že máte aktivní síťové připojení mezi serverem a klientem (více podrobností v kapitole 14).

O autorovi

David Clinton — systémový administrátor, učitel a spisovatel. Administrativně se věnoval, psal o tom a vytvářel vzdělávací materiály pro mnohé důležité technické disciplíny, včetně systémů Linux, cloudového výpočetnictví (zejména AWS) a kontejnerových technologií jako Docker. Napsal knihu Learn Amazon Web Services in a Month of Lunches (Manning, 2017). Mnoho jeho vzdělávacích videokurzů lze najít na Pluralsight.com a odkazy na jiné jeho knihy (o administraci Linuxu a virtualizaci serverů) jsou k dispozici na bootstrap-it.com.

» Podrobnosti o knize naleznete na webových stránkách vydavatelství
» Obsah
» Úryvek

Pro uživatele Habr sleva 25 % s kupónem — Linux
Po uhrazení tištěné verze knihy bude elektronická kniha zaslána na e-mail.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster