Správa linuxového serveru: OpenVPN server (pokračování)
Minulý díl se zabýval základy OpenVPN a velmi jednoduchou konfigurací propojení dvou počítačů. Tento díl osvětlí komplexnější řešení pro OpenVPN server s více klienty a možnost směrování veškeré komunikace přes VPN.
Komplexní řešení pro více klientů
Vytvoření tunelu mezi dvěma počítači je jistě užitečné, ale co když se chcete připojovat na VPN server z více počítačů, nebo dokonce nabídnout klientům možnost směrovat veškerou svou komunikaci přes VPN? I to samozřejmě OpenVPN umí. Pro snadnou správu přístupu mnoha klientů k VPN serveru využívá OpenVPN PKI. Je tedy třeba začít vytvořením certifikační autority, dále certifikátu serveru a certifikátu klientů.
Vytvoření certifikační autority
Prvním krokem je vytvoření vlastní certifikační autority. Můžete tak učinit buď ručně pomocí nástroje openssl, nebo si značně usnadnit práci pomocí pomocných skriptů. V Debianu naleznete příslušné skripty v adresáři /usr/share/doc/openvpn/examples/easy-rsa, takže si je odtud zkopírujte někam jinam, třeba do /etc/openvpn, takto:
cd /etc/openvpn
cp -r /usr/share/doc/openvpn/examples/easy-rsa .
cd easy-rsa/2.0
Postup pro vytvoření certifikační autority je následující. Upozorňuji, že tento postup (přesněji druhý příkaz) smaže všechny klíče, které jste dosud vytvořili (pokud toto provádíte poprvé, není se samozřejmě čeho obávat).
. ./vars
./clean-all
./build-ca
Po dokončení této procedury byste měli nalézt příslušné výstupy, tzn. zejména soubor ca.crt s kořenovým certifikátem certifikační autority a soubor ca.key se soukromým klíčem certifikační autority (tím se pak podepisují jednotlivé dílčí certifikáty).
Vytvoření serverového klíče
Máte-li vygenerovanou certifikační autoritu, můžete si nechat vygenerovat serverový certifikát. To provedete ve stejném adresáři následujícím příkazem:
./build-key-server server
Za slovo server si dosaďte libovolné jméno. Zde budete opět vyzváni k zadání řady informací. Ujistěte se, že na konci odpovíte na dotaz "y", tedy opravdu podepsat daný certifikát.
Vygenerování certifikátů a klíčů pro uživatele
Pro každého uživatele vygenerujte jeho vlastní certifikát spolu s klíčem, pomocí kterých se bude připojovat k serveru. K tomu vám poslouží následující příkaz:
./build-key jmeno_klienta
Vygenerování Diffie Hellman parametrů
Posledním krokem je vygenerování parametrů pro Diffie Hellman protokol. To provedete příkazem:
./build-dh
Umístění jednotlivých souborů
Až budete mít vygenerované všechny soubory, bude potřeba je vhodně rozmístit. Obecně, soubory s příponami .key obsahují privátní klíče a měly by být pečlivě střeženy (doporučuji jim nastavit práva 400), ostatní být střeženy nemusí. Přípona .crt označuje jednotlivé certifikáty - certifikát certifikační autority, certifikát serveru a certifikáty klientů. Diffie Hellman parametry se pak nacházejí v souboru dh*.pem, kde hvězdička bude odpovídat velikosti klíče - výchozí hodnota je 1024, ale je samozřejmě možné vygenerovat větší.
Soubory pro klienta
Klienti by měli mít k dispozici následující soubory:
ca.crt - kořenový certifikát certifikační autority
klient1.crt - odpovídající certifikát klienta
klient1.key - odpovídající privátní klíč klienta
Soubory pro server
Server musí mít k dispozici následující soubory:
ca.crt - viz výše
server.crt - serverový certifikát
server.key - soukromý klíč k serverovému certifikátu
dh*.pem - Diffie Hellman parametry
Ostatní soubory
Jediným souborem, který jste vygenerovali a nebyl popsán výše, je soubor ca.key s klíčem pro kořenový certifikát certifikační autority. Ten není nutné mít přímo na serveru - je totiž nutný pouze k podepisování certifikátů. Z bezpečnostních důvodů je dokonce vhodné, aby byl někde v bezpečí mimo server.
Konfigurace OpenVPN serveru
Příklad konfigurace serveru může vypadat následovně. Konfiguraci si přizpůsobte svým potřebám:
local 1.2.3.4
dev tap
mode server
ifconfig 10.45.42.1 255.255.255.0
ifconfig-pool 10.45.42.2 10.45.42.102 255.255.255.0
tls-server
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh1024.pem
user nobody
group nogroup
comp-lzo
keepalive 10 20
ping-timer-rem
persist-tun
persist-key
verb 3
duplicate-cn
client-to-client
max-clients 100
U všech cest k souborům se ujistěte, že ukazují správně. Parametr local označuje IP adresu serveru, kde bude k dispozici OpenVPN server. Parametr ifconfig označuje IP adresu serveru v rámci VPN tunelu. Klientům budou přiřazovány IP adresy z rozsahu, který je specifikován parametrem ifconfig-pool. Mezi další důležité parametry patří:
tls-server - zapíná TLS v režimu serveru
duplicate-cn - umožní, aby se připojilo více klientů se stejným certifikátem
client-to-client - umožní klientům, aby na sebe "viděli" a mohli spolu komunikovat
max-clients 100 - limit počtu současně připojených klientů
Konfigurace klienta
Pro klienty použijte následující vzor konfiguračního souboru:
remote 1.2.3.4
client
dev tap
tls-client
ns-cert-type server
ca /etc/openvpn/ca.crt
cert /etc/openvpn/klient1.crt
key /etc/openvpn/klient1.key
nobind
comp-lzo
keepalive 10 20
ping-timer-rem
persist-tun
persist-key
verb 3
Řadu parametrů zde již jistě znáte, pro jistotu ještě zopakuji upozornění, abyste si přizpůsobili veřejnou IP adresu serveru (parametr remote) a cesty k jednotlivým souborům. Mezi důležité volby patří:
tls-client - zapíná TLS v režimu klienta
ns-cert-type server - ověřuje serverový certifikát (pomáhá zabránit man-in-the-middle útokům, kdy by se útočník vydával za server)
Extra zabezpečení pomocí sdíleného klíče
Ačkoliv infrastruktura založená na certifikátech nevyžaduje použití sdílených klíčů (což je ostatně jejím účelem), můžete pro zvýšení bezpečnosti sdílený klíč přeci jen vytvořit a používat jako bezpečnostní vrstvu navíc - server pak bude kontrolovat HMAC podpisy paketů a bude ignorovat pakety, které nebudou mít správný podpis. Klíč vytvoříte následujícím příkazem:
openvpn --genkey --secret klic
Následně je třeba dopravit klíč všem klientům a upravit konfiguraci serveru přidáním následující řádky do konfiguračního souboru:
tls-auth soubor_s_klicem 0
Nezapomeňte doplnit cestu k souboru s klíčem. Do konfiguračních souborů klientů je třeba doplnit podobnou řádku, ale s číslem 1 místo nuly:
tls-auth soubor_s_klicem 1
Směrování komunikace přes VPN
OpenVPN umožňuje, aby klienti směrovali veškerou svou komunikaci přes VPN tunel, což umožňuje vytvářet různé "anonymizační" služby založené na této technologii. Tato vlastnost se hodí mj. i k tomu, abyste zabezpečili svou komunikaci, pokud se třeba připojujete přes nešifrovanou wifi, kde vás může kdokoliv ve vaší blízkosti šmírovat (alespoň vaši nezabezpečenou komunikaci).
Směrování paketů
Abyste zajistili směrování komunikace v rámci OpenVPN serveru, musíte nejprve povolit směrování paketů. To můžete provést buď s dobou trvání do příštího restartu, nebo permanentně. Dočasné nastavení provedete příkazem:
sysctl -w net.ipv4.ip_forward=1
Permanentní nastavení provedete zapsáním níže uvedené řádky do souboru /etc/sysctl.conf:
net.ipv4.ip_forward=1
Podívejte se na nastavení firewallu (iptables -L -n -v), zejména pak na řetěz FORWARD, který musí povolovat průchozí pakety z virtuálního rozhraní VPNky směrem na vnější síťové rozhraní.
NAT / maškaráda
Jelikož VPN síť využívá adresy z privátního rozsahu, je nutné vytvořit maškarádu, tedy vhodnou formu NATu (překladu adres), která zajistí, aby si pakety zvenčí našly cestu k příslušnému klientovi, který si je vyžádal. To zajistíte následujícím příkazem:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Toto nastavení bude fungovat pouze do příštího restartu serveru. Permanentní nastavení je v Debianu možné zařídit pomocí balíčku iptables-persistent a nástroje iptables-save:
iptables-save > /etc/iptables/rules
Tento příkaz uloží aktuální konfiguraci pravidel Netfiltru a při příštím spuštění systému bude zajištěno jejich opětovné načtení.
Úprava konfigurace OpenVPN serveru
Následně upravte konfigurační soubor OpenVPN serveru a přidejte do něj následující řádky:
push "route-gateway 10.45.42.1"
push "redirect-gateway def1"
push "dhcp-option DNS 10.45.42.1"
Jako parametr pro volbu route-gateway zadejte IP adresu serveru v rámci VPN, tedy IP adresu, kterou jste zadali jako parametr volby ifconfig. První řádka zajistí, že se klientovi pošle specifikovaná IP adresa brány. Druhá volba zajistí, že se klientovi nařídí, aby přesměroval veškerou svou komunikaci přes VPN. Parametr def1 zajistí, aby se neodstranila původní brána z konfigurace sítě klienta.
Parametr dhcp-option DNS zajišťuje zaslání informace o DNS serverech klientovi. Tento parametr samozřejmě předpokládá dostupný funkční resolvující DNS server. Pokud se vám nechce nastavovat vlastní DNS server na serveru s OpenVPN, můžete použít buď OpenDNS, nebo Google DNS. Stavba vlastního DNS serveru je mimo zaměření tohoto článku, ale mohu vám v této souvislosti pro tuto konkrétní potřebu doporučit balíček dnsmasq.
Úprava konfigurace OpenVPN klientů
U linuxových OpenVPN klientů se ovšem nastavení DNS pomocí dhcp-option neprojeví - je nutné jej odchytit z proměnných prostředí a zpracovat skriptem. Tento skript si naštěstí nemusíte psát sami - měl by být součástí OpenVPN balíku a měl by sídlit v /etc/openvpn/update-resolv-conf. Ke své činnosti vyžaduje balík resolvconf, takže se raději ujistěte, že jej máte nainstalovaný. Pak už jen postačí upravit konfiguraci klienta přidáním následujících řádků do konfiguračního souboru OpenVPN:
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
script-security 2
Neposlušný klient aneb Jak si nenechat mluvit do směrování
Pokud máte takto nastavený server a jste v pozici klienta, který nechce, aby se mu veškerá komunikace směrovala přes VPN, ale vytvořit VPN tunel chcete, můžete do svého konfiguračního souboru přidat parametr route-nopull. Tento parametr způsobí, že OpenVPN nebude ze serveru přebírat informace pro směrování.