Jak na OpenVPN - minimanuál
Cílem tohoto článku je popsat a na příkladech ukázat nejběžnější využití služby VPN. Jako VPN systém bude použit OpenVPN v aktuální verzi 2. Výběr padl na tento software proto, že je open source, a existuje pro všechny významné platformy (Linux, BSD i Windows). Jako východisko pro příklady je brán (asi nejčastější) případ, kdy server běží na Linuxu a klienti jsou PC s Windows. Nicméně změny platformy jsou v tomto případě téměř irelevantní.
1. Nejdříve (opět) trocha teorie
VPN je zkratka pro pojem Virtual Private Network, tj. Virtuální soukromá síť. Používá se převážně ve dvou případech: první případ lze popsat situací, kdy tzv. cestující uživatel potřebuje přistupovat k prostředkům své domácí lokální sítě, přičemž tyto prostředky nelze z nějakých důvodů (bezpečnostní, rychlostní, apod.) publikovat na internetu. Je třeba hned na úvod poznamenat, že VPN nezrychluje přístup k domovské síti (je to spíše naopak), ale může vám zpřístupnit např. terminálserver ukrytý až za demilitarizovanou zónou. Druhý případ častého použití VPN je propojení dvou a více LAN sítí a vytvoření virtuální WAN (Wide Area Network) přes internet v případech, kdy je nemožné, nebo finančně příliš nákladné, zakoupit fyzickou point-to-point linku nebo alespoň telekomunikační virtuální okruh. Tolik k nejběžnějšímu užití (nicméně není problém "vymyslet" např. užití VPN pro virtuální herní síť.)
1.1 Jak funguje provoz a zabezpečení
Zabezpečení celé komunikace probíhá pomocí šifrování na úrovni virtuálního adaptéru (jak u serveru, tak klienta), jehož podoba může mít dvě varianty:
TUN – Virtuální Point to Point síťové rozhraní (pracuje s IP rámci)
TAP – Virtuální Ethernet síťové rozhraní (pracuje s Ethernet rámci)
Šifrování pak zajišťuje balík OpenSSL, základní (není cílem článku popisovat kompletní funkcionalitu OpenSSL) konfigurace certifikátů a vysvětlení bude následovat záhy.
Pro ukázku jsem zvolil rozhraní typu TAP z toho důvodu, že běží na nižší úrovni ISO/OSI, a proto dovoluje při použití daleko větší volnost (např. použít i jiné protokoly, než z rodiny TCP/IP) navzdory faktu, že má větší režii, a dále proto, že umožní vytvořit nejen množinu point-to-point spojení, ale kompletní virtuální LAN.
1.2 Důležité informace než začnete
Pro bezproblémovou konfiguraci je vhodné připomenout, že budeme vytvářet virtuální síť propojující LAN s PC mimo ni, případně dvě LAN mezi sebou, a proto je vhodné věnovat velkou pozornost plánování směrování (routingu), a obzvláště pak správnému výběru síťových adres, a to ve všech sítích, které se budou této taškařice účastnit. Pokud vás dostihne nemilá skutečnost, že v některé propojované síti je použit stejný rozsah adres (typicky se to stává u obligátního rozsahu 192.168.1.0/24, nověji u LAN sítí za DSL routery, které hodně často používají sítě 10.0.0.0/24), budete muset použít netriviální „doplněk“ ve formě NATu na rozhraních TAP/TUN, případně v některé síti změnit rozsah adres. Proto zmiňuji tento „gotcha“ hned na úvod, abych vám ulehčil debugování a hledání důvodu „proč ten krám pitomej nefunguje.“
Pro jednoduchost nebudeme uvažovat implementaci bridgingu mezi LAN rozhraním a VPN rozhraním. Pokud máte zájem o takové nastavení, odkážu vás na web OpenVPN, kde je tato problematika popsána a rozebrána.
2. Konfigurace serveru
V této kapitole budou rozebrány kroky potřebné pro plnou funkčnost serveru.
2.1 Instalace softwaru
Rád bych ještě nejprve upozornil méně zkušené uživatele na vhodnost použití nativního balíčkovacího/portage systému, který nabízí většina linuxových i BSD distribucí. Pomocí něj by neměl být problém nainstalovat veškeré zde zmíněné softwary. Pokud mohu doporučit, obecně je vhodné instalovat balíčky jednotlivě a nespoléhat se na závislosti. Postup instalace je následovný:
- nainstalujte OpenSSL
- nainstalujte OpenVPN
Ve Windows bych doporučil stažení OpenVPN s GUI, viz http://openvpn.se/ . Jeho nastavení pro použití pod neprivilegovaným účtem se pak budu věnovat ve speciální kapitole.
2.2 Generujeme certifikáty serveru (a klienta)
OpenVPN má celkem jednoduchý systém vytváření certifikátů a klíčů. Nachází se (většinou) v adresáři etc/openvpn/easy-rsa (ale viděl jsem jej i v /usr/share/ - nezbývá než hledat). Zde jsou nachystány skripty, které vám ušetří seznámení s OpenSSL. Předkládám postup výroby kořenových certifikátů jako self-signed.
Nejprve editujte soubor vars, který definuje dobu platnosti certifikátů, defaultní hodnoty polí klíčů (tyto MUSÍ být vyplněny) atp. Následně proveďte tyto příkazy (v jejich rámci se systém bude dotazovat):
./vars
./clean-all
./build-ca
Tímto jsme vyčistili cílový adresář a vygenerovali novou certifikační autoritu. Pokračujeme vygenerováním certifikátu a klíčů serveru a prvního klienta:
./build-key-server mujserver
./build-key FrantaVoprsalek
Je třeba poznamenat, že před každým novým generováním certifikátů/klíčů v nové session shellu musí být zavedeny parametry ze souboru vars. To lze provést buď jeho spuštěním, nebo, používáte-li např. Midnight Commander (který pro jednotlivé příkazy vytvoří vždy nové prostředí shellu), uvedením následujícího:
source ./vars ./build-key FrantaVoprsalek
Poslední „standardní“ komponentou je Diffie-Hellman parameters file, ten vygenerujete pomocí
./build-dh
Pro zajištění vyšší bezpečnosti komunikace (služba VPN by z meritu věci měla být dosažitelná odkudkoli, ale pak hrozí nebezpečí přinejmenším DoS útoku) je vhodné zajistit „předověření“ spojujícího se klienta, protože během negociace VPN připojení je v komunikačním kanále sděleno velmi mnoho relativně citlivých informací, které může potenciální útočník zneužít. Navíc negociace spojení a ověření klíčů je pro server relativně náročná úloha. Proto OpenVPN obsahuje nástroj TLS-Auth, kterým je (relativně nenákladně z pohledu výkonu serveru) na základě statického klíče ověřeno, zda je navazované spojení legitimní.
Klíč se vygeneruje pomocí příkazu
openvpn --genkey --secret ta.key
Uložte jej k ostatním klíčům, pokud jste změnili adresář jinam než ke klíčům.
2.3 Konfigurační soubor serveru
Konfigurace serveru je většinou uložena v adresáři /etc/openvpn, neměl by tam chybět předpřipravený „slepý“ konfigurační soubor openvpn.conf. Zde je komentovaný výpis našeho konfiguračního souboru:
#definujeme rezim cinnosti
mode server
tls-server
#definujeme typ rozhrani
dev tap
#definice IP konfigurace serveru. Server, pokud neni vyslovne
#uvedeno v kofiguraci jinak, si vezme prvni IP adresu z rozsahu
#tyto adresy budou pouzity ve virtualni LAN VPN
server 10.123.1.0 255.255.255.0
#definujeme “pamatovaka” – server si bude pamatovat klienty
#a pridelovat jim stale stejne IP adresy
ifconfig-pool-persist ip_pool.txt
#Klice systemu
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/mujserver.crt
key /etc/openvpn/easy-rsa/keys/mujserver.key
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
#TLS autentikace pred samotnym spojenim pro osetreni DoS utoku
tls-auth ta.key 0
#umisteni a zpusob logovani
log-append /var/log/openvpn
status /var/run/openvpn/vpn.status 10
#Posilame klientovi DHCP udaje. Predpoklad: DNS a NTP server bezi na VPN
#serveru. Pokud to neni pravda, je treba zadat funkcni DNS server
push "redirect-gateway"
push "dhcp-option DNS 10.123.1.1"
push "dhcp-option DOMAIN mojedomena.cz"
push "dhcp-option NTP 10.123.1.1"
#Snizeni privilegii
user nobody
group nobody
#Nastaveni komprese toku dat, miry “ukecanosti” logu a IP parametru spojeni
comp-lzo
verb 3
keepalive 10 120
Nyní nezbývá, než server spustit. Měl by mít automaticky vytvořen spouštěcí skript někde v init.d adresáři v /etc – toto je odlišné u každé distribuce a předpokládám základní znalosti vlastního systému.
2.4 Poslední úkony na serveru
Jakmile je server nastartován, nezapomeňte přidat odpovídající záznam do tabulky směrování! OpenVPN obsahuje podporu skriptů, které lze spouštět při definovaných akcích (např. spuštění služby), a tedy lze dodefinovat přidání cesty zde.
3. Konfigurace klienta
Konfigurace klienta je vzásadě jednoduchý proces. Stačí nainstalovat OpenVPN (postup je stejný jako v případě serveru). V případě, že klient je systém Windows, silně doporučuji použít OpenVPN GUI (viz. http://openvpn.se/), který má vlastní instalátor. Nezapomeňte vypnout/upravit integrovaný firewall Windows pro toto spojení.
Pak už jen stačí do adresáře config nakopírovat tls-auth token, certifikáty (ca + uživatel), klíč (uživatele) a vytvořit konfigurační soubor (např. server.ovpn) do nějž promítneme veškeré ceritifkáty, klíče a nastavení:
# rezim client
client
# definujeme rozhrani TAP (stejne jako na serveru)
dev tap
# definujeme protokol
proto udp
# Zde zadejte adresu svého serveru
remote server.nekde.neco.tld 1194
# Pokud mate Dial-up, tohle je velmi dobry parametr :-)
resolv-retry infinite
# definujeme, ze není třeba navazat se k specifickemu lokalnimu portu
nobind
# Pro ne-Windows klienty muzete snizit po pripojeni privilegia
;user nobody
;group nobody
# Try to preserve some state across restarts.
persist-key
persist-tun
# If you are connecting through an
# HTTP proxy to reach the actual OpenVPN
# server, put the proxy server/IP and
# port number here. See the man page
# if your proxy server requires
# authentication.
;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]
# bezdratove site velmi často opakuji nektere pakety. Workaround.
mute-replay-warnings
# SSL/TLS nastaveni. certifikat serveru/autority a certifikat a klic klienta
ca ca.crt
cert FrantaVoprsalek.crt
key FrantaVoprsalek.key
# Verify server certificate by checking
# that the certicate has the nsCertType
# field set to "server". This is an
# important precaution to protect against
# a potential attack discussed here:
# http://openvpn.net/howto.html#mitm
#
# To use this feature, you will need to generate
# your server certificates with the nsCertType
# field set to "server". The build-key-server
# script in the easy-rsa folder will do this.
ns-cert-type server
# TLS autentikace na strane klienta
tls-auth ta.key 1
# Komprese datoveho toku
comp-lzo
# Mira ukecanosti logu
verb 3
4. Nastavení OpenVPN GUI klienta ve Windows pro neprivilegovaného uživatele
Jakožto zastánce práce se systémy Windows výlučně pod neprivilegovanými účty jsem byl konfrontován s faktem, že OpenVPN GUI pod neprivilegovaným účtem neběží. Bylo proto nutné najít řešení, jak tento problém eliminovat. Jediná možnost, jak povolit neadministrátorům aktivovat nové síťové rozhraní je nainstalovat OpenVPN GUI jako službu. Základní kámen úrazu tkví v tom, že její start je výlučně v moci správců lokálního PC. Proto je třeba nastavit privilegia pro spouštění této služby. Toho lze dosáhnout např. pomocí nástroje subinacl (ten lze stáhnout ze stránek Microsoftu, je součástí NT resource kitu.
Příkaz pro změnu oprávnění spouštění služby je následující:
subinacl /SERVICE "OpenVPNService" /GRANT=users=TO
dále je pak nutno nastavit OpenVPN do režimu služby (pozor v případě, že jste instalovali klienta jinam, než do defaultní cesty):
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\OpenVPN-GUI]
@="C:\\Program Files\\OpenVPN"
"config_dir"="C:\\Program Files\\OpenVPN\\config"
"config_ext"="ovpn"
"exe_path"="C:\\Program Files\\OpenVPN\\bin\\openvpn.exe"
"log_dir"="C:\\Program Files\\OpenVPN\\log"
"priority"="NORMAL_PRIORITY_CLASS"
"log_append"="0"
"allow_edit"="1"
"allow_service"="1"
"allow_proxy"="1"
"allow_password"="1"
"service_only"="1"
"log_viewer"="C:\\WINDOWS\\notepad.exe"
"passphrase_attempts"="3"
"editor"="C:\\WINDOWS\\notepad.exe"
"connectscript_timeout"="15"
"disconnectscript_timeout"="10"
"preconnectscript_timeout "="10"
"silent_connection"="0"
"show_balloon"="1"
"show_script_window"="1"
"disconnect_on_suspend"="1"
Kompletní soubor BAT a registry, které zajistí potřebné nastavení, můžete stáhnout zde: Open VPN as service
Spuštění vlastní VPN pak už proběhne jednoduchým kliknutím na ikonku v trayi a volbou „connect“ v daném menu spojení.
5. Závěr
Služba OpenVPN je vynikající nástroj, jehož použití je téměř univerzální. Díky standardnímu přístupu k síťovým rozhraním umožňuje správci filtrovat komunikaci z VPN pomocí firewallových pravidel (typicky se používá netfilter/iptables, případně ipfw), takže lze významným způsobem eliminovat případná bezpečnostní rizika. Pro kompletní popis konfiguračních parametrů doporučuji navštívit web autorů.
Pro masivnější nasazení certifikátů doporučuji windowsovský GUI program na generování požadavků na certifikaci, tento nástroj umožní lepší automatizaci ve větších firmách a přenos významné části procesu na uživatele. - viz. odkaz č. 3.
Odkazy na stažení a dokumentaci
(1) Domovská stránka OpenVPN – http://openvpn.net/
(2) OpenVPN pro Windows s GUI – http://openvpn.se/
(3) MyCertificate Wizard pro Windows – http://openvpn.se/mycert/
(4) Nástroj pro zprovoznění OpenVPN GUI pod neprivilegovaným uživatelem – Open VPN as service
(5) MSI installer pro SubinACL – http://www.microsoft.com/downloads/details.aspx?Fa m ilyID=e8ba3e56-d8fe-4a91-93cf-ed6985e3927b&display l ang=en