česky | english
Jak vytvořit tunel openVPN pomocí certifikátů CAcert
POZOR: Tohle skoro jistě nechcete dělat!
Čtěte tuto poznámku z OpenVPN 1.0 HOWTO (zřejmě platí i pro OpenVPN 2.0):
Důležitá poznámka k používání komerčních certifikačních úřadů (CA) s OpenVPN Je třeba poznamenat, že bezpečnostní model OpenVPN v režimu SSL/TLS je orientovaný na uživatele, kteří vytvoří svůj vlastní kořenový certifikát a mají tedy vlastní CA. V režimu SSL/TLS OpenVPN ověřuje své vrstevníky (peers) zkontrolováním, že certifikát dodaný vrstevníkem byl podepsán certifikátem CA uvedeným ve volbě --ca. Jako u zabezpečení webu založeném na SSL spočívá zabezpečení režimu SSL/TLS OpenVPN na víře v nemožnost padělání podpisu kořenového certifikátu. Tento postup ověřování funguje perfektně dobře, pokud jste vytvořili svůj vlastní kořenový certifikát, ale představuje problém, pokud chcete použít kořenový certifikát komerční CA, jako je Thawte. Pokud jste například v možnosti --ca zadali kořenový certifikát Thawte, pak jakýkoli certifikát podepsaný Thawte by nyní mohl ověřit s vaším "vrstevníkem" (peerem) OpenVPN - a to byste rozhodně nechtěli. Naštěstí existuje řešení tohoto problému ve volbě --tls-verify. Tato možnost vám umožní provést příkaz ke kontrole obsahu certifikátu, vybrat, který certifikát je povolen a který není. Příklad, jak to provést, viz skript verify-cn v podadresáři sample-scripts a stránku Man pro volbu --tls-verify.
Předpoklady
váš OpenVPN tunel již funguje se sdíleným utajeným kódovým slovem nebo certifikátem podepsaným sám sebou (selfsigned)
- základní konfigurace openvpn je v linuxu v /etc/openvpn
- přídavná konfigurace CAcert bude v /etc/openvpn/cacert
- privátní klíč je dostupný jen superuživateli root
náš server je v doméně např. mylinuxbox.dyndns.org (CN názvu certifikátu) a máme přístup k e-mailovému účtu openvpnuser@mylinuxbox.dyndns.org (klientský certifikát)
- server má IPv4 adresu 192.168.1.1
- VPN je na 10.1.1.0 (server na 10.1.1.1)
- klienti dostávají jiné místní adresy IP (např. od DHCP), VPN-ip a trasy (routes) dodá klientu openvpn
je vytvořen Diffie_Hellman_Key
- nepoužíváme zde kompresi LZO
- nainstalovali jste openvpn na Win-Box (2k nebo XP). 'openssl' by mělo být dostupné i zde na příkazovém řádku.
- máme samostatný směrovač (zde na adrese 192.168.1.11), který se používá jako DNS, takže to posíláme jako DNS.
<-- Trasa 10.1.1.0 <-- Port 1194 <--- Server OpenVPN <--------> Směrovač <-----> VELKÁ ZLÁ SÍŤ ----- (Směrovač) ---- Klient OpenVPN 192.168.1.1 mylinuxbox@dyndns.org jiná IP ^ 192.168.1.11 ^ | | 10.1.1.1 ----------------------------------- (TUNEL) -------------------------- 10.1.1.6 (cíl)
Začneme u serveru openvpn (stroj s Linuxem)
- vytvořme strukturu adresářů
cd /etc/openvpn mkdir cacert cd cacert mkdir certs private chmod 0700 private
- získáme kořenový certifikát (root_X0F.crt) z webu CAcertu a uložíme do /ect/openvpn/cacert/certs
- vytvoříme žádost o certifikát serveru (CSR) a privátní klíč server.key (chraňte!) pro náš server openvpn
openssl req -new -newkey rsa:1024 -out certs/servercsr.pem -nodes -keyout private/serverkey.pem
CN 'common name' musí být mylinuxbox.dyndns.org, pole 'challenge password' /volací heslo) a 'optional company name' (volitelný název společnosti) necháme prázdná
- zobrazíme si servercsr.pem a obsah zkopírujeme Ctrl-A do schránky. Řádky Begin/End nesmějí chybět!!!
- přihlaste se k svému účtu CAcert a jděte na 'certifikáty serveru', pak 'nový', vložte CSR ze schránky (Ctrl-V), popř. doplňte komentář a odešlete. Ukáže se Vaše CN, pokračujte...
- až se objeví odpověď serveru (Váš certifikát ve tvaru PEM - Base64), kopírujte ji do schránky
- vytvořte soubor /etc/openvpn/cacert/servercert.pem, jehož obsah zkopírujete ze schránky
- odstraňte servercsr.pem (soubor žádosti CSR - už není potřebný)
- zde je konfigurační soubor openvpn 'server-cacert.conf'
################################################# # Příklad konfiguračního souboru pro OpenVPN 2.0# # pro víceklientový server. # # # # Soubor konfigurace pro serverovou stranu # # více klientů <-> jeden server OpenVPN. # # # # OpenVPN též podporuje konfigurace typu # # jeden stroj <-> jeden stroj # # Viz stranu Examples (příklady) na webu. # # # # Tato konfigurace by měla fungovat na Windows # # nebo Linux/BSD. Na Windows dejte # # cesty do úvozovek a použijte dvojitá # # zpětná lomítka, například: # # "C:\\Program Files\\OpenVPN\\config\\foo.key" # # # # Poznámky začínají '#' nebo ';' # ################################################# # Na které místní IP adrese má OpenVPN naslouchat? # (volitelné) ;local a.b.c.d # Na kterém portu TCP/UDP má OpenVPN naslouchat? # Chcete-li spustit více instancí OpenVPN na # tomtéž stroji, použijte pro každou jiný port. # Bude třeba otevřít tyto porty na Vašem firewallu. port 1194 # TCP nebo UDP server? (proto = protokol) ;proto tcp proto udp # "dev tun" vtvoří směrovaný tunel IP, # "dev tap" vytvoří ethernetový tunel. # Použijte "dev tap", tvoříte-li ethernetové přemostění. # Chcete-li řídit práva přístupu přes VPN, # musíte vytvořit firewallová pravidla # pro rozhraní TUN/TAP. # Na jiných systémech než Windows můžete zadat # explicitní číslo jednotky, například tun0. # Na Windows k tomu použijte "dev-node". # Na většině systémů nebude VPN fungovat, # dokud částečně nebo úplně nevyřadíte # firewall pro rozhraní TUN/TAP. ;dev tap dev tun # Windows potřebuje adaptér s názvem TAP-Win32 # z panelu Network Connections, máte-li více než jeden. # Na XP SP2 nebo vyšší verzi asi bude třeba selektivně # vyřadit Windows firewall pro adaptér TAP. # Jiné systémy než Windows to obvykle nepotřebují. ;dev-node MyTap # Kořenový certifikát SSL/TLS (ca), certifikát # (cert) a privátní klíč (key). Každý klient # a server musí mít svůj vlastní soubor certifikátu # a klíče. Server a všechny klienty použijí stejný # soubor ca. # # V adresáři "easy-rsa" najdete řadu skriptů # pro generování RSA certifikátů # a privátních klíčů. Nezapomeňte použít # jedinečné "Common Name" pro server # a každý klientský certifikát. # # Lze použít jakýkoli systém správy klíčů X509. # OpenVPN může použít i formátovaný soubor PKCS #12 # (viz direktiva "pkcs12" v popisu "man"). ca /etc/openvpn/cacert/certs/root_X0F.crt cert /etc/openvpn/cacert/certs/servercert.pem key /etc/openvpn/cacert/private/serverkey.pem # Teto soubor udržujte v tajnosti! # Parametry dffie hellman. # Generujte si své vlastní: # openssl dhparam -out dh1024.pem 1024 # Nahraďte 1024 číslem 2048, používáte-li klíče # o délce 2048 bitů: # openssl dhparam -out dh2048.pem 2048 dh /etc/openvpn/dh1024.pem # resp. dh /etc/openvpn/dh2048.pem # Konfigurujte režim serveru a vytvořte síť VPN # pro OpenVPN s rozsahem klientských adres. # Server sám zabere IP adresu 10.8.0.1 a zbytek # bude dostupný pro klienty. # Každý klient bude schopen kontaktovat server # na adrese 10.8.0.1. Zapoznámkujte tento řádek, když # přemosťujete ethernet. Více viz stránky "man". server 10.1.1.0 255.255.255.0 # V tomto souboru udržujte záznamy klient <-> virtuální IP adresa. # Když OpenVPN havaruje nebo restartuje, dostanou klienty z rozsahu # stejné virtuální IP adresy, jaké byly přiřazeny předtím. ifconfig-pool-persist /etc/openvpn/ipp.txt # Konfigurujte režim serveru pro přemostění ethernetu. # Napřed použijte přemosťovací schopnost svého OS # k přemostění rozhraní TAP ethernetovým rozhraním # NIC. Pak musíte ručně nastavit IP adresu a masku # na rozhraní mostu, zde předpokládáme # 10.8.0.4/255.255.255.0. Nakonec si musíme # reservovat rozsah IP adres v této podsíti # (začátek=10.8.0.50, konec=10.8.0.100) pro alokaci # připojujících se klientů. Nechte tento řádek zakomentovaný # pokud nenastavujete ethernetové přemostění. ;server-bridge 10.1.1.0 255.255.255.0 10.1.1.50 10.1.1.100 # Pošlete trasy klientu a tím mu umožněte # dosáhnout do ostatních privátních podsítí # za serverem. Pamatujte, že tyto # privátní podsítě budou též potřebovat # znát trasu k rozsahu adres klientů OpenVPN # (10.8.0.0/255.255.255.0) # zpět k serveru OpenVPN. push "route 192.168.1.0 255.255.255.0" ;push "route 192.168.20.0 255.255.255.0" ;push "route 0.0.0.0 0.0.0.0" # K přidělení specifických IP adres specifickým # klientům nebo když má připojující se klient za # sebou privátní podsíť, # jež by také měla mít přístup k VPN, použijte # podadresář "ccd" pro konfigurační soubory # specifické pro klienta (více viz stránky "man"). # Příklad: Dejme tomu, že klient má certifikát # s "common name" = "Thelonious" a za jeho připojujícím se strojem # je malá podsíť, např. 192.168.40.128/255.255.255.248. # Napřed odkomentujte řádky: ;client-config-dir ccd ;route 192.168.40.128 255.255.255.248 # Pak vytvořte soubor ccd/Thelonious s tímto řádkem: # iroute 192.168.40.128 255.255.255.248 # To dovolí privátní síti Thelonious' přistupovat k VPN. # Tento příklad funguje jen pro směrováním ne pro # přemostění, tedy použijte direktivy "dev tun" a "server". # Příklad: Chcete dát stroji "Thelonious" pevnou IP adresu # ve VPN, a to 10.9.0.1. # Napřed odkomentujte tyto řádky: ;client-config-dir ccd ;route 10.9.0.0 255.255.255.252 # Pak do ccd/Thelonious přidejte řádek: # ifconfig-push 10.9.0.1 10.9.0.2 # Předpokládejme, že chcete povolit různé # zásady přístupu k bráně firewall pro různé skupiny # klientů. Existují dvě metody: # (1) Spusťte více démonů OpenVPN, jeden pro každou # skupinu a nastavte firewall pro rozhraní TUN/TAP # pro každou skupinu/démona odpovídajícím způsobem. # (2) (Pokročilé) Vytvořte skript, který dynamicky # upraví bránu firewall v reakci na přístup # z různých klientů. Viz stránku "man" - # více informací o skriptu learn-address. ;learn-address ./script # Pokud je tato direktiva povolena, bude konfigurovat # všechny klienty, aby přesměrovali své výchozí # síťovou bránu přes VPN, což způsobí, že # veškerý IP provoz, jako je prohlížení webových stránek # a vyhledávání DNS probíhá přes síť VPN. # (Na serveru OpenVPN může být nutné nastavit NAT # rozhraní TUN/TAP do internetu v síti NAT, # aby to fungovalo správně). # POZOR: Může to narušit konfiguraci sítě klienta, pokud # se pakety klientova místního serveru DHCP přesměrují # přes tunel. Řešení: Ujistěte se, že # klientův místní server DHCP je dosažitelný přes # specifičtější trasu, než je výchozí trasa # 0.0.0.0/0.0.0.0. ;push "redirect-gateway" # Některá nastavení sítě specifická pro systém Windows # mohou být předány klientům, například # adresy serverů WINS nebo DNS. POZOR: # http://openvpn.net/faq.html#dhcpcaveats push "dhcp-option DNS 192.168.1.11" ;push "dhcp-option WINS 10.8.0.1" # Odkomentujte tuto směrnici, abyste umožnili, # aby se různí klienti navzájem "viděli". # Ve výchozím nastavení klienti vidí pouze server. # Chcete-li klienty donutit, aby viděli pouze server, # budete muset také vhodně nastavit firewall na # rozhraní TUN/TAP serveru. client-to-client # Odkomentujte tuto směrnici, pokud se více klientů # může připojovat se stejným souborem certifikátu/priv.klíče # nebo "common names" (CN, běžnými názvy). To je doporučeno # pouze pro účely testování. Pro provozní použití # by měl mít každý klient svůj vlastní pár certifikát/klíč. # # POKUD JSTE NEVYTVOŘILI INDIVIDUÁLNÍ # DVOJICE CERTIFIKÁT/KLÍČ PRO KAŽDÉHO KLIENTA A KAŽDÝ # Z NICH MÁ SVÉ VLASTNÍ JEDINEČNÉ "COMMON NAME" (CN), # ODKOMENTUJTE TENTO ŘÁDEK. ;duplicate-cn # Směrnice keepalive způsobuje, že se tam a zpět # posílají přes spojení zprávy typu "ping", # aby každá strana věděla, kdy druhá strana přerušila spojení. # (1. údaj v keepalive) # Ping se posílá každých 10 sekund a předpokládá se, že vzdálená # strana je mimo provoz, pokud během této doby nepřijme žádný ping; # standardně 120 sekund. (2. údaj v keepalive) keepalive 10 120 # Pro dodatečné zabezpečení nad rámec zabezpečení # poskytovaného SSL/TLS vytvořte "HMAC firewall". # který pomůže blokovat útoky DoS a zahlcení portů UDP. # # Generujte takto: # openvpn --genkey --secret ta.key # # Server a každý klient musí mít # lopii tohoto klíče. # Druhý parametr má být '0' # na serveru a '1' na klientech. ;tls-auth ta.key 0 # Tento soubor je utajený # ct 9/2005 strana 198 auth SHA1 # Vyberte kryptografickou šifru. # Tento údaj konfigurace se musí zkopírovat # také do konfiguračního souboru klienta. cipher BF-CBC # Blowfish (výchozí) ;cipher AES-128-CBC # AES ;cipher DES-EDE3-CBC # Triple-DES # Povolte kompresi na lince VPN. # Pokud ji zde povolíte, musíte ji také # povolit v konfiguračním souboru klienta. ;comp-lzo # Maximální počet současně připojených # klientů, které chcete povolit. ;max-clients 100 # Je dobré snížit privilegia OpenVPN # démona po inicializaci. # # Toto můžete odkomentovat na # jiných systémech než Windows. user nobody group nobody # Možnosti persist se pokusí vyhnout # přístupu k určitým zdrojům při restartu # které již nemusí být přístupné # kvůli snížení práv. persist-key persist-tun # Výstup krátkého stavového souboru zobrazujícího # aktuální připojení, zkracuje # a přepisuje se každou minutu. status openvpn-status.log # Ve výchozím nastavení se zprávy protokolu odesílají do syslogu (nebo # v systému Windows, pokud jsou spuštěny jako služba, půjdou # do adresáře "\Program Files\OpenVPN\log"). # Pro změnu tohoto výchozího nastavení použijte log nebo log-append. # "log" zkrátí soubor protokolu při spuštění OpenVPN, # zatímco "log-append" jej doplní. Použijte jedno # nebo druhé nastavení (ale ne obojí). ;log openvpn.log ;log-append openvpn.log # Nastavení příslušné úrovně podrobnosti souboru protokolu. # # 0 je tichá, s výjimkou fatálních chyb # 4 je přiměřená pro běžné použití # 5 a 6 mohou pomoci při ladění problémů s připojením # 9 je extrémně podrobná verb 3 # Umlčet opakující se zprávy. Do protokolu # bude vypsáno nejvýše 20 po sobě jdoucích # zpráv stejné kategorie. ;mute 20
- start openvpn with:
openvpn --config /etc/openvpn/server-cacert.conf
zde by neměla nastat chyba...
A teď systém klienta (zde: WinXP)
Otázka: Tato metoda se zdá být poněkud matoucí. Používám MyCert.exe pro své klienty ke generování jejich certifikátů. Ověřil jsem jejich e-mailové adresy na CACert, ale moji klienti dostávají vždy stejnou IP adresu. Zdá se, že běžný název (CN=CAcert_WoT_User) je vždy stejný (pozn. překl.: protože si nepřál jméno/název v certifikátu nebo měl málo AP, viz https://wiki.cacert.org/FAQ/Privileges/CZ):
Mon Jun 27 15:39:04 2005 xxx.xxx.xxx.xxx:1866 VERIFY OK: depth=1,/O=Root_CA/OU=http://www.cacert.org/CN=CA_Cert_Signing_Authority/emailAddress=support@cacert.org Mon Jun 27 15:39:04 2005 xxx.xxx.xxx.xxx:1866 VERIFY OK: depth=0, /CN=CAcert_WoT_User/emailAddress=user@address.com
Můžete uvést příklad s použitím MyCert.exe a případně trochu podrobněji vysvětlit Windows? Díky.
- doejte soubor root_X0F.crt do konfiguračního adresáře klienta nebo jej vytvořte později z úložiště certifikátů (viz níže).
vytvořte a ověřte e-mailovou adresu openvpnuser@mylinuxbox.dyndns.org v CAcert
- vytvořte klientský certifikát s 1024bitovým kódem a uložte jej do úložiště certifikátů prohlížeče.
- exportujte certifikát z prohlížeče do souboru 'client-cacert.p12' (formát pkcs#12), nastavte své exportní heslo (potřebné později!).
extrahujte klientský certifikát a klientský klíč do jednoho souboru 'client-cacert.pem' (mělo by to fungovat i na Win-Boxu )
openssl pkcs12 -in client-cacert.p12 -clcerts -out client-cacert.pem
- Program pksc12-export se nejprve zeptá na Vaše importní heslo (nastavené při exportu předtím) a poté na "přístupovou frázi PEM" (jako zadání hesla, s potvrzením). Ta bude chránit váš soukromý klíč a bude opět třeba ji zadat ('private key password') pro spuštění openvpn tunelu!
- Pokud jste nezískali soubor root_X0F.crt ze stránek CAcert-Website, můžete jej získat z exportního souboru .p12 (za předpokladu, že záložní soubor obsahuje nové kořeny):
openssl pkcs12 -in client-cacert.p12 -nokeys -cacerts -out root_X0F.crt
- zde je můj konfigurační soubor 'cacert.ovpn'
############################################## # Ukázka konfiguračního souboru OpenVPN 2.0 # # na straně klienta pro připojení k serveru # # s více klienty. # # Tato konfigurace může být použita více # # klienty, avšak každý klient by měl mít # # své vlastní soubory s certifikáty a klíči. # # V systému Windows byste možná měli # # přejmenovat tento soubor tak, aby měl # # příponu .ovpn # ############################################## # Uveďte, že jsme klient a že budeme stahovat # určité direktivy konfiguračního souboru # ze serveru. client # Použijte stejné nastavení, jaké používáte # v aplikaci na serveru. # Na většině systémů nebude VPN fungovat, # pokud částečně nebo úplně nezakážete # firewall pro rozhraní TUN/TAP. ;dev tap dev tun # Systém Windows potřebuje název adaptéru TAP-Win32 # z panelu Síťová připojení, # pokud jich máte více než jedno. V systému XP SP2 # bude možná nutné vypnout bránu firewall # pro adaptér TAP. dev-node OpenVPN # Připojujeme se k TCP nebo # UDP serveru? Použijte stejné nastavení jako # na serveru. ;proto tcp proto udp # Název hostitele/IP a port serveru. # Můžete mít více záznamů vzdálených serverů # pro vyvážení zátěže mezi servery. remote mylinuxbox.dyndns.org 1194 # Zvolte náhodného hostitele ze seznamu vzdálených # pro vyvažování zátěže. Jinak # vyzkoušejte hostitele v zadaném pořadí. ;remote-random # Pokoušejte se donekonečna vyřešit # název hostitele serveru OpenVPN. Velmi užitečné # na počítačích, které nejsou trvale připojeny # k internetu, například notebooky. resolv-retry infinite # Většina klientů se nepotřebuje vázat na # konkrétní místní port. nobind # Po inicializaci upravit oprávnění (jen v ne-Windows) ;user nobody ;group nobody # Zkusit zachovat některé stavy mezi restarty. persist-key persist-tun # Pokud se připojujete prostřednictvím # HTTP proxy, abyste se dostali ke skutečnému OpenVPN # serveru, vložte proxy server/IP adresu a # číslo portu. Viz stránka "man", # pokud váš proxy server vyžaduje ověřování. ;http-proxy-retry # nové pokusy po selhání spojení ;http-proxy [proxy server] [proxy port #] # Bezdrátové sítě často produkují mnoho # duplicitních paketů. Nastavte tento příznak, # abyste umlčeli upozornění na duplicitní pakety. ;mute-replay-warnings # Parametry SSL/TLS. # Další informace najdete v konfiguračním souboru serveru # Nejlepší je použít # samostatnou dvojici souborů .crt/.key # pro každého klienta. Pro všechny klienty # lze použít jediný soubor ca. ca root_X0F.crt cert client-cacert.pem.crt key client-cacert.pem.key # Ověřte certifikát serveru kontrolou # zda má certifikát nsCertType # pole nastaveno na "server". To je # důležité opatření na ochranu proti # potenciálnímu útoku, o kterém se mluví zde: # http://openvpn.net/howto.html#mitm # # Chcete-li tuto funkci používat, musíte vygenerovat # své serverové certifikáty s polem nsCertType # nastaveným na "server". Skript build-key-server # je ve složce easy-rsa. ;ns-cert-type server # Pokud je na serveru použit klíč tls-auth # pak musí mít tento klíč také každý klient. ;tls-auth ta.key 1 # ct 9/2005 page 199 auth SHA1 # Vyberte kryptografickou šifru. # Pokud je na serveru použita možnost šifra # pak musíte zadat stejnou i zde. ;cipher x cipher BF-CBC # Povolte kompresi na lince VPN. # Tuto funkci nepovolujte, pokud není také # povolena v konfiguračním souboru serveru. ;comp-lzo # Stupeň podrobnosti logu. verb 3 # Tiché opakování zpráv mute 20
* podívejte se na push "redirect-gateway", možná byste to měli povolit.
Nezapomeňte...
- ... nastavit předávání portu 1194 na openvpnserver na vašem routeru
- ... nastavit statickou trasu pro VPN (zde: 10.1.1.0) na openvpn-server na směrovači
To je vše!
(2005-04-22/nju)
Řešení problémů (troubleshooting)
- Pokud se v klientovi objeví chyby o neúspěšném ověření certifikátu, ujistěte se, že soubor crt uvedený v direktivě ca obsahuje certifikát třídy 1 i certifikát třídy 3.