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

                      <-- 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)

cd /etc/openvpn
mkdir cacert
cd cacert
mkdir certs private
chmod 0700 private

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á

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

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.

openssl pkcs12 -in client-cacert.p12 -clcerts -out client-cacert.pem

openssl pkcs12 -in client-cacert.p12 -nokeys -cacerts -out root_X0F.crt

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

To je vše! ;-)

(2005-04-22/nju)

Řešení problémů (troubleshooting)


openVPN/CZ (last edited 2022-05-23 14:27:24 by AlesKastner)