Ubuntu 20.04 Focal Fossa je poslední dlouhodobá podpora jedné z nejpoužívanějších distribucí Linuxu. V tomto tutoriálu uvidíme, jak použít tento operační systém k vytvoření serveru OpenVPN a jak vytvořit .ovpn
soubor, pomocí kterého se k němu připojíme z našeho klientského počítače.
V tomto tutoriálu se naučíte:
- Jak vygenerovat certifikační autoritu
- Jak vygenerovat serverový a klientský certifikát a klíč
- Jak podepsat certifikát u certifikační autority
- Jak vytvořit parametry Diffie-Hellman
- Jak vygenerovat klíč tls-auth
- Jak nakonfigurovat server OpenVPN
- Jak vygenerovat soubor .ovpn pro připojení k síti VPN
Požadavky na software a použité konvence
Kategorie | Požadavky, konvence nebo použitá verze softwaru |
---|---|
Systém | Ubuntu 20.04 Focal Fossa |
Software | openvpn, ufw, easy-rsa |
Jiné | Kořenová oprávnění k provádění administrativních úkolů |
Konvence | # – vyžaduje, aby dané linuxové příkazy byly spouštěny s právy root buď přímo jako uživatel root, nebo pomocí sudo příkaz$ – vyžaduje, aby dané linuxové příkazy byly spouštěny jako běžný neprivilegovaný uživatel |
Nastavení scénáře
Než přistoupíme ke skutečné konfiguraci VPN, promluvme si o konvencích a nastavení, které přijmeme v tomto tutoriálu.
Budeme používat dva stroje, oba poháněné Ubuntu 20.04 Focal Fossa . První, camachine
budou použity k hostování naší Certifikační autority; druhý, openvpnmachine
bude ta, kterou nastavíme jako skutečnou VPN server. Je možné použít stejný stroj pro oba účely, ale bylo by to méně bezpečné, protože osoba, která naruší server, by se mohla „vydávat“ za certifikační autoritu a používat ji k podepisování nechtěných certifikátů (problém je zvláště relevantní pouze v případě, že plánujete mít více než jeden server nebo pokud plánujete používat stejnou CA pro jiné účely). Pro přesun souborů mezi jedním počítačem a druhým použijeme scp
příkaz (zabezpečená kopie). 10 hlavních kroků, které provedeme, je následujících:
- Vytvoření certifikační autority;
- Generování klíče serveru a žádosti o certifikát;
- Podepsání žádosti o certifikát serveru s CA;
- Generování parametrů Diffie-Hellman na serveru;
- Vygenerování klíče tls-auth na serveru;
- Konfigurace OpenVPN;
- Konfigurace sítě a firewallu (ufw) na serveru;
- Generování klientského klíče a žádosti o certifikát;
- Podpis klientského certifikátu s CA;
- Vytvoření souboru .ovpn klienta používaného k připojení k síti VPN.
Krok 1 – Vygenerování certifikační autority (CA)
Prvním krokem na naší cestě je vytvoření Certifikační autority na vyhrazeném stroji. Budeme pracovat jako neprivilegovaný uživatel, abychom vygenerovali potřebné soubory. Než začneme, musíme nainstalovat easy-rsa
balíček:
$ sudo apt-get update &&sudo apt-get -y install easy-rsa
S nainstalovaným balíčkem můžeme použít make-cadir
příkaz pro vygenerování adresáře obsahujícího potřebné nástroje a konfigurační soubory, v tomto případě jej budeme nazývat certificate_authority
. Po vytvoření se do něj přesuneme:
$ make-cadir certificate_authority &&cd certificate_authority
Uvnitř adresáře najdeme soubor s názvem vars
. V souboru můžeme definovat některé proměnné, které budou použity pro generování certifikátu. Komentovanou sadu těchto proměnných lze nalézt na řádku 91
na 96
. Stačí odstranit komentář a přiřadit příslušné hodnoty:
set_var EASYRSA_REQ_COUNTRY "US"set_var EASYRSA_REQ_PROVINCE "Kalifornie"set_var EASYRSA_REQ_CITY "San Francisco"set_var EASYRSA_REQ_ORG "Copyleft Certificate Co"set_var Unit_var EASYRSA_REQAample_EMAIL" "QOURSEampleAreample_EMAIL" "QJakmile jsou změny uloženy, můžeme pokračovat a vygenerovat PKI (Public Key Infrastructure), pomocí následujícího příkazu, který vytvoří adresář s názvem
pki
:$ ./easyrsa init-pkiSe zavedenou infrastrukturou můžeme vygenerovat náš klíč CA a certifikát. Po spuštění níže uvedeného příkazu budeme požádáni o zadání přístupové fráze pro klíč ca . Při každé interakci s úřadem budeme muset zadat stejné heslo. Obecné jméno neboť by měl být předložen i certifikát. To může být libovolná hodnota; pokud ve výzvě pouze stiskneme enter, použije se výchozí, v tomto případě
Easy-RSA CA
:$ ./easyrsa build-caZde je výstup příkazu:
Poznámka:pomocí konfigurace Easy-RSA z:./varsUsing SSL:openssl OpenSSL 1.1.1d 10. září 2019Zadejte nové přístupové heslo klíče CA:Znovu zadejte nové přístupové heslo klíče CA:Generování soukromého klíče RSA, 2048 bitů dlouhý modul (2 prvočísla ...........++++++ ...................................... ...................................++++++e je 65537 (0x010001)Nelze načíst / home/egdoc/certificate_authority/pki/.rnd do RNG140296362980608:error:2406F079:generátor náhodných čísel:RAND_load_file:Nelze otevřít soubor:../crypto/rand/randfile.c:98:Filename=/home_authorki/certity/eghordoc /.rnd Chystáte se být požádáni o zadání informací, které budou začleněny do vaší žádosti o certifikát. Chystáte se zadat to, co se nazývá rozlišovací jméno nebo DN. Existuje poměrně málo polí, ale některá můžete nechat prázdná. bude výchozí hodnota. Pokud zadáte '.', pole zůstane prázdné.-----Common Name (např.:váš uživatel, název hostitele nebo serveru) [Easy-RSA CA]:Vytvoření CA dokončeno a nyní můžete importovat a s ign cert requirements. Váš nový soubor certifikátu CA pro publikování je na adrese:/home/egdoc/certificate_authority/pki/ca.crt
build-ca
příkaz vygeneroval dva soubory; jejich cesta vzhledem k našemu pracovnímu adresáři je:
- pki/ca.crt
- pki/private/ca.key
První je veřejný certifikát, druhý je klíč, který bude použit k podepsání serverových a klientských certifikátů, takže by měl být co nejbezpečnější.
Malá poznámka, než přejdeme vpřed:ve výstupu příkazu jste si mohli všimnout chybové zprávy. Přestože chyba není násilná, řešením, jak se jí vyhnout, je zakomentovat třetí řádek souboru openssl-easyrsa.cnf
soubor, který je uvnitř vygenerovaného pracovního adresáře. Problém je diskutován v úložišti openssl github. Po úpravě by soubor měl vypadat takto:
# Pro použití s Easy-RSA 3.1 a OpenSSL nebo LibreSSLRANDFILE =$ENV::EASYRSA_PKI/.rnd
To znamená, že přejdeme na stroj, který budeme používat jako server OpenVPN, a vygenerujeme klíč serveru a certifikát.
Krok 2 – Generování klíče serveru a žádosti o certifikát
V tomto kroku vygenerujeme klíč serveru a žádost o certifikát, která bude následně podepsána certifikační autoritou. Na stroji, který budeme používat jako OpenVPN server, musíme nainstalovat openvpn
, easy-rsa
a ufw
balíčky:
$ sudo apt-get update &&sudo apt-get -y install openvpn easy-rsa ufw
Pro vygenerování klíče serveru a žádosti o certifikát provedeme stejný postup, jaký jsme použili na počítači hostujícím certifikační autoritu:
- Vygenerujeme pracovní adresář pomocí
make-cadir
příkazu a pohybujte se v něm. - Nastavte proměnné obsažené v
vars
soubor, který bude použit pro certifikát. - Vygenerujte infrastrukturu veřejného klíče pomocí
./easyrsa init-pki
příkaz.
Po těchto předběžných krocích můžeme vydat příkaz pro vygenerování souboru certifikátu serveru a klíče:
$ ./easyrsa gen-req server nopass
Tentokrát, protože jsme použili nopass
možnost, nebudeme během generování klíče serveru vyzváni k zadání hesla . Stále budeme požádáni o zadání Common Name pro certifikát serveru . V tomto případě je použita výchozí hodnota server
. To je to, co použijeme v tomto tutoriálu:
Poznámka:pomocí konfigurace Easy-RSA z:./varsUsing SSL:openssl OpenSSL 1.1.1d 10. září 2019Generování soukromého klíče RSA...................+ ++++.................++++++zápis nového soukromého klíče do '/home/egdoc/openvpnserver/pki/private/server.key.9rU3WfZMbW'- ----Jste požádáni o zadání informací, které budou začleněny do vaší žádosti o certifikát. To, co se chystáte zadat, se nazývá rozlišovací jméno nebo DN. Existuje poměrně málo polí, ale některá můžete nechat prázdná. některá pole budou mít výchozí hodnotu. Pokud zadáte '.', pole zůstane prázdné.-----Common Name (např.:název vašeho uživatele, hostitele nebo serveru) [server]:Pár klíčů a žádost o certifikát dokončeno. Vaše soubory jsou:req:/home/egdoc/openvpnserver/pki/reqs/server.reqkey:/home/egdoc/openvpnserver/pki/private/server.key
Žádost o podpis certifikátu a soukromý klíč bude vygenerováno:
/home/egdoc/openvpnserver/pki/reqs/server.req
/home/egdoc/openvpnserver/pki/private/server.key
.
Soubor klíče musí být přesunut do /etc/openvpn
adresář:
$ sudo mv pki/private/server.key /etc/openvpn
Místo toho musí být žádost o certifikát odeslána na stroj certifikační autority, aby byla podepsána. Můžeme použít scp
příkaz k přenosu souboru:
$ scp pki/reqs/server.req egdoc@camachine:/home/egdoc/
Vraťme se k camachine
a autorizovat certifikát.
Krok 3 – Podepsání certifikátu serveru pomocí CA
Na počítači certifikační autority bychom měli najít soubor, který jsme zkopírovali v předchozím kroku v $HOME
adresář našeho uživatele:
$ ls ~certificate_authority server.req
První věc, kterou uděláme, je importovat žádost o certifikát. Ke splnění úkolu používáme import-req
akce easyrsa
skript. Jeho syntaxe je následující:
import-req
V našem případě to znamená:
$ ./easyrsa import-req ~/server.req server
Příkaz vygeneruje následující výstup:
Poznámka:pomocí konfigurace Easy-RSA z:./varsUsing SSL:openssl OpenSSL 1.1.1d 10. září 2019Požadavek byl úspěšně importován s krátkým názvem:serverTento název nyní můžete použít k provádění operací podepisování tohoto požadavku.
K podepsání požadavku používáme sing-req
akce, která bere typ požadavku jako první argument (v tomto případě server) a short_basename
jsme použili v předchozím příkazu (server). Spouštíme:
server serveru $ ./easyrsa sign-req
Budeme požádáni o potvrzení, že chceme certifikát podepsat, ao zadání hesla, které jsme použili pro klíč certifikační autority. Pokud vše proběhne podle očekávání, certifikát bude vytvořen:
Poznámka:pomocí konfigurace Easy-RSA z:./varsUsing SSL:openssl OpenSSL 1.1.1d 10. září 2019Chystáte se podepsat následující certifikát. Zkontrolujte prosím podrobnosti uvedené níže kvůli přesnosti. Upozorňujeme, že tento požadavek nebyl kryptograficky ověřen. Ujistěte se prosím, že pochází z důvěryhodného zdroje nebo že jste ověřili kontrolní součet požadavku u odesílatele. Předmět požadavku, který má být podepsán jako certifikát serveru po dobu 1080 dní:subject=commonName =serverZadejte slovo 'ano' a pokračujte nebo jakékoli jiné vstup k přerušení. Potvrďte podrobnosti požadavku:yesPoužití konfigurace z /home/egdoc/certificate_authority/pki/safessl-easyrsa.cnfZadejte heslo pro /home/egdoc/certificate_authority/pki/private/ca.key:Zkontrolujte, zda požadavek odpovídá podpisuPodpis okThe Subject's je následujícícommonName :ASN.1 12:'server'Certifikát má být certifikován do 20. března 02:12:08 2023 GMT (1080 dní)Zapište databázi s 1 novými položkamiDatabáze AktualizovanýCertifikát vytvořen na:/home/egdoc/certificate_authority/ pki/issued/server.crt
Nyní můžeme smazat soubor požadavku, který jsme dříve přenesli z openvpnmachine
. A zkopírujte vygenerovaný certifikát zpět do našeho OpenVPN serveru spolu s veřejným certifikátem CA:
$ rm ~/server.req$ scp pki/{ca.crt,issued/server.crt} egdoc@openvpnmachine:/home/egdoc
Zpět na openvpnmachine
měli bychom najít soubory v našem domovském adresáři. Nyní je můžeme přesunout do /etc/openvpn
:
$ sudo mv ~/{ca.crt,server.crt} /etc/openvpn
Krok 4 – Generování parametrů Diffie-Hellman
Dalším krokem je vygenerování Diffie-Hellmana parametry. Diffie-Hellman výměna klíčů je metoda používaná k přenosu krypto klíčů přes veřejný, nezabezpečený kanál. Příkaz pro vygenerování klíče je následující (dokončení může chvíli trvat):
$ ./easyrsa gen-dh
Klíč bude vygenerován uvnitř pki
adresář jako dh.pem
. Přesuňme to do /etc/openvpn
jako dh2048.pem
:
$ sudo mv pki/dh.pem /etc/openvpn/dh2048.pem
Krok 5 – Vygenerování klíče tls-auth (ta.key)
Chcete-li zlepšit zabezpečení, OpenVPN implementuje tls-auth . Citace z oficiální dokumentace:
Direktiva tls-auth přidává další podpis HMAC ke všem paketům handshake SSL/TLS pro ověření integrity. Jakýkoli paket UDP, který nenese správný podpis HMAC, lze zahodit bez dalšího zpracování. Podpis tls-auth HMAC poskytuje další úroveň zabezpečení nad rámec zabezpečení SSL/TLS. Dokáže chránit proti:
– útokům DoS nebo zahlcení portů na portu OpenVPN UDP.
– Skenování portů k určení, které porty UDP serveru jsou ve stavu naslouchání.
– Chyby zabezpečení v oblasti přetečení vyrovnávací paměti Implementace SSL/TLS.
– Iniciace handshake SSL/TLS z neautorizovaných počítačů (zatímco takové handshake by se nakonec nepodařilo ověřit, tls-auth je může přerušit v mnohem dřívější fázi).
Pro vygenerování klíče tls_auth můžeme spustit následující příkaz:
$ openvpn --genkey --secret ta.key
Po vygenerování přesuneme ta.key
soubor do /etc/openvpn
:
$ sudo mv ta.key /etc/openvpn
Nastavení klíčů našeho serveru je nyní dokončeno. Můžeme pokračovat ve skutečné konfiguraci serveru.
Krok 6 – Konfigurace OpenVPN
Konfigurační soubor OpenVPN ve výchozím nastavení v /etc/openvpn
neexistuje . K jeho vygenerování používáme šablonu, která se dodává s openvpn
balík. Spusťte tento příkaz:
$ zcat \ /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz \ | sudo tee /etc/openvpn/server.conf> /dev/null
Nyní můžeme upravit /etc/openvpn/server.conf
soubor. Příslušné části jsou uvedeny níže. První věc, kterou chceme udělat, je ověřit, že název odkazovaných klíčů a certifikátů odpovídá těm, které jsme vygenerovali. Pokud jste postupovali podle tohoto návodu, rozhodně by tomu tak mělo být (řádky 78-80
a 85
):
ca ca.crtcert server.crtkey server.key # Tento soubor by měl být uchován v tajnosti dh2048.pem
Chceme, aby démon OpenVPN běžel s nízkými oprávněními, nobody
uživatel a nogroup
skupina. Příslušná část konfiguračního souboru je na řádcích 274
a 275
. Potřebujeme pouze odstranit úvodní ;
:
uživatel nonegroup nogroup
Další řádek, ze kterého chceme odstranit komentář, je 192
. To způsobí, že všichni klienti přesměrují svou výchozí bránu přes VPN:
stiskněte "redirect-gateway def1 bypass-dhcp"
Řádky 200
a 201
to lze také použít k povolení serveru odesílat konkrétní servery DNS klientům. Ty v konfiguračním souboru jsou ty, které poskytuje opendns.com
:
push "dhcp-option DNS 208.67.222.222"push "dhcp-option DNS 208.67.220.220"
V tomto bodě /etc/openvpn
adresář by měl obsahovat tyto soubory, které jsme vygenerovali:
/etc/openvpn├── ca.crt├── dh2048.pem├── server.conf├── server.crt├── server.key└── ta.key
Ujistěte se, že jsou všechny vlastněny rootem:
$ sudo chown -R root:root /etc/openvpn
Můžeme přejít k dalšímu kroku:konfigurace síťových možností.
Krok 7 – nastavení sítě a ufw
Aby naše VPN fungovala, musíme povolit přesměrování IP na našem serveru. K tomu stačí odkomentovat řádek 28
z /etc/sysctl.conf
soubor:
# Odkomentováním dalšího řádku povolíte předávání paketů pro IPv4net.ipv4.ip_forward=1
Chcete-li znovu načíst nastavení:
$ sudo sysctl -p
Musíme také povolit předávání paketů v ufw firewallu a modifikovat /etc/default/ufw
a změnou DEFAULT_FORWARD_POLICY
z DROP
ACCEPT
(řádek 19
):
# Nastavte výchozí zásadu předávání na ACCEPT, DROP nebo REJECT. Vezměte prosím na vědomí, že # pokud toto změníte, pravděpodobně budete chtít upravit svá pravidlaDEFAULT_FORWARD_POLICY="ACCEPT"
Nyní musíme přidat následující pravidla na začátek /etc/ufw/before.rules
soubor. Zde předpokládáme, že rozhraní použité pro připojení je eth0
:
*nat:POSTROUTING ACCEPT [0:0]-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADECOMMIT
Nakonec musíme povolit příchozí provoz pro openvpn
služba ve správci brány firewall ufw:
$ sudo ufw povolit openvpn
V tomto okamžiku můžeme restartovat ufw, aby se změny uplatnily. Pokud váš firewall nebyl v tomto okamžiku povolen, ujistěte se, že ssh
služba je vždy povolena, jinak můžete být odpojeni, pokud pracujete na dálku.
$ sudo ufw zakázat &&sudo ufw povolit
Nyní můžeme spustit a povolit službu openvpn.service při bootování:
$ sudo systemctl restart openvpn &&sudo systemctl povolit openvpn
Krok 8 – Generování klientského klíče a žádosti o certifikát
Nastavení našeho serveru je nyní dokončeno. Další krok spočívá ve vygenerování klientského klíče a žádosti o certifikát. Postup je stejný, jaký jsme použili pro server:jen jako jméno použijeme „klient“ místo „sever“, vygenerujeme klíč a žádost o certifikát a poté předáme CA stroji, který má být podepsán.
$ ./easyrsa gen-req klient nopass
Stejně jako dříve budeme požádáni o zadání běžného názvu. Budou vygenerovány následující soubory:
- /home/egdoc/openvpnserver/pki/reqs/client.req
- /home/egdoc/openvpnserver/pki/private/client.key
Zkopírujeme client.req
do stroje CA:
$ scp pki/reqs/client.req egdoc@camachine:/home/egdoc
Jakmile je soubor zkopírován, na camachine
, importujeme požadavek:
$ ./easyrsa import-req ~/client.req client
Poté certifikát podepíšeme:
$ ./easyrsa sign-req klientský klient
Po zadání hesla CA bude certifikát vytvořen jako pki/issued/client.crt
. Odeberte soubor požadavku a zkopírujte podepsaný certifikát zpět na server VPN:
$ rm ~/client.req$ scp pki/issued/client.crt egdoc@openvpnmachine:/home/egdoc
Pro usnadnění si vytvořte adresář, do kterého budou uloženy všechny věci související s klientem, a přesuneme do něj klientský klíč a certifikát:
$ mkdir ~/client$ mv ~/client.crt pki/private/client.key ~/client
Dobře, už jsme skoro tam. Nyní musíme zkopírovat šablonu konfigurace klienta, /usr/share/doc/openvpn/examples/sample-config-files/client.conf
uvnitř ~/client
adresář a upravit jej tak, aby vyhovoval našim potřebám:
$ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client
Zde jsou řádky, které musíme v souboru změnit. Na řádku 42
vložte skutečnou IP adresu serveru nebo název hostitele místo my-server-1
:
vzdálený můj-server-1 1194
Na řádcích 61
a 62
odstraňte úvodní ;
znak pro snížení úrovně oprávnění po inicializaci:
uživatel nonegroup nogroup
Na řádcích 88
na 90
a 108
vidíme, že se odkazuje na certifikát CA, klientský certifikát, klientský klíč a klíč tls-auth. Tyto řádky chceme okomentovat, protože skutečný obsah souborů vložíme mezi dvojici vyhrazených „tagů“:
<ca></ca>
pro certifikát CA<cert></cert>
pro klientský certifikát<key></key>
pro klientský klíč<tls-auth></tls-auth>
pro klíč tls-auth
Jakmile jsou řádky okomentovány, připojíme na konec souboru následující obsah:
# Zde je obsah souboru ca.crt # Zde je obsah souboru client.crt # Zde je obsah klienta .key soubor key-direction 1# Zde je obsah souboru ta.key
Po dokončení úprav souboru jej přejmenujeme na .ovpn
přípona:
$ mv ~/client/client.conf ~/client/client.ovpn
Zbývá pouze importovat soubor do naší klientské aplikace, aby se mohl připojit k naší VPN. Pokud například používáme desktopové prostředí GNOME, můžeme importovat soubor ze Sítě části ovládacího panelu. V sekci VPN stačí kliknout na +
a poté na „importovat ze souboru“ pro výběr a import souboru „.ovpn“, který jste dříve přenesli do klientského počítače.
Rozhraní GNOME pro import souboru .ovpn
Závěry
V tomto tutoriálu jsme viděli, jak vytvořit fungující nastavení OpenVPN. Vygenerovali jsme certifikační autoritu a použili jsme k podepisování serverových a klientských certifikátů, které jsme vygenerovali společně s odpovídajícími klíči. Viděli jsme, jak nakonfigurovat server a jak nastavit síť, umožňující předávání paketů a provádění potřebných úprav konfigurace ufw firewallu. Nakonec jsme viděli, jak vygenerovat klienta .ovpn soubor, který lze importovat z klientské aplikace za účelem snadného připojení k naší VPN. Užijte si to!