
Problematika
Ještě donedávna mnoho lidí nevědělo, jaké to je pracovat z domova. Pandemie náhle změnila situaci ve světě, všichni se začali přizpůsobovat vzniklým okolnostem, zejména tomu, že vycházet z domu se stalo prostě nebezpečné. A mnozí museli rychle organizovat práci z domova pro své zaměstnance.
To je důvod, proč nedostatečný přístup k výběru řešení pro vzdálenou práci může vést k nevratným ztrátám. Uživatelská hesla mohou být ukradena, což umožní útočníkovi bez omezení se připojit k síti a IT zdrojům podniku.
Právě proto nyní vzrostla poptávka po vytváření spolehlivých firemních VPN sítí. Pojďme si povědět o spolehlivé, bezpečné a snadno použitelné VPN síti.
Funguje na základě schématu IPsec/L2TP, které pro autentizaci klientů používá nezískatelné klíče a certifikáty uložené na tokeny, a také přenáší data po síti v zašifrované podobě.
Jako demonstrační stanici pro nastavení byl použit server s CentOS 7 (adresa: centos.vpn.server.ad) a klient s Ubuntu 20.04, stejně jako klient s Windows 10.
Popis systému
VPN bude fungovat na základě schématu IPSec + L2TP + PPP. Protokol Point-to-Point Protocol (PPP) pracuje na datové úrovni modelu OSI a zajišťuje autentizaci uživatele a šifrování přenášených dat. Jeho data jsou zapouzdřena do dat protokolu L2TP, který vlastně zajišťuje vytvoření připojení v VPN síti, ale nezajišťuje autentizaci a šifrování.
Data L2TP jsou zapouzdřena do protokolu IPSec, který také zajišťuje autentizaci a šifrování, ale na rozdíl od protokolu PPP se autentizace a šifrování realizuje na úrovni zařízení, nikoli na úrovni uživatelů.
Tato vlastnost umožňuje zajistit autentizaci uživatelů pouze z určitých zařízení. My však budeme používat protokol IPSec jako toto a umožníme autentizaci uživatelů z jakéhokoli zařízení.

Autentizace uživatele pomocí smart karet bude probíhat na úrovni protokolu PPP pomocí protokolu EAP-TLS.
Podrobnější informace o fungování tohoto schématu lze nalézt v .
Proč toto schéma splňuje všechny tři požadavky na dobrou VPN síť.
- Spolehlivost tohoto schématu byla ověřena časem. Používá se k nasazení VPN sítí od roku 2000.
- Bezpečnou autentizaci uživatelů zajišťuje protokol PPP. nezajišťuje dostatečnou úroveň bezpečnosti, protože pro autentizaci se v nejlepším případě používá autentizace pomocí uživatelského jména a hesla. Všichni víme, že uživatelské jméno a heslo lze odhalit, hádat nebo ukrást. Naprave, již dlouho vývojář v tohoto protokolu tento problém opravil a přidal možnost použití protokolů založených na asymetrickém šifrování pro autentizaci, jako je EAP-TLS. Kromě toho přidal možnost použití smart karet pro autentizaci, což tuto systém učinilo bezpečnější.
V současnosti probíhají aktivní jednání o sloučení těchto dvou projektů a lze si být jisti, že se to dříve či později stane. Například v repozitářích Fedora již dlouho leží patčená verze PPP, která používá pro autentizaci bezpečné protokoly. - Ještě nedávno mohli tuto síť používat pouze uživatelé Windows, ale naši kolegové z MGU Vasily Shokov a Alexandr Smirnov našli a upravili ho. Společnými silami jsme opravili řadu chyb a nedostatků v práci klienta, zjednodušili instalaci a nastavení systému, i při kompilaci ze zdrojových kódů. Mezi nejvýznamnější z nich patří:
- Opraveny byly problémy s kompatibilitou starého klienta s rozhraním nových verzí openssl a qt.
- Odstraněno bylo předávání pppd PIN kódu tokenu přes dočasný soubor.
- Opraveno bylo nesprávné spouštění programu pro žádost o heslo přes grafické rozhraní. Toho bylo dosaženo nastavením správného prostředí pro službu xl2tpd.
- Sestavení démona L2tpIpsecVpn nyní probíhá společně se sestavením samotného klienta, což usnadňuje proces sestavení a nastavení.
- Pro usnadnění vývoje byla připojena systém Azure Pipelines pro testování správnosti sestavení.
- Byla přidána možnost donutit ke snížení v kontextu openssl. To je užitečné pro správnou podporu nových operačních systémů, kde je standardní úroveň zabezpečení nastavena na 2, s VPN sítěmi, ve kterých se používají certifikáty, jež nevyhovují požadavkům zabezpečení této úrovně. Tato volba bude užitečná pro práci se stávajícími starými VPN sítěmi.
Opravenou verzi lze nalézt v .
Tento klient podporuje používání smart karet pro autentizaci a také maximálně skrývá všechna úskalí a obtíže spojené s nastavením této schémy pod Linuxem, což dělá nastavení klienta co nejjednodušší a nejrychlejší.
Samozřejmě, pro pohodlnou interoperabilitu PPP a GUI klienta bylo třeba provést i další úpravy každého z projektů, ale nějsme schopni je minimalizovat na minimum:
- Opraveno
- Opraveno . Tato chyba znemožňovala načítání z lokálního /etc/ppp/openssl.cnf souboru s konfigurací jakýchkoliv informací kromě údajů o enginách openssl pro práci se smart kartami, což představovalo vážné nepříjemnosti, pokud jsme například chtěli kromě informací o enginech nastavit něco dalšího. Například stanovit úroveň zabezpečení při navazování spojení.
Nyní můžeme přistoupit k nastavení.
Nastavení serveru
Nainstalujeme všechny potřebné balíčky.
Instalace strongswan (IPsec)
Nejdříve nastavíme firewall pro práci ipsec
sudo firewall-cmd --permanent --add-port=1701/{tcp,udp}
sudo firewall-cmd --permanent --add-service=ipsec
sudo firewall-cmd --reloadPoté se pustíme do instalace
sudo yum install epel-release ipsec-tools dnf
sudo dnf install strongswanPo instalaci je třeba nastavit konfiguraci pro strongswan (jednu z realizací IPSec). K tomu upravíme soubor /etc/strongswan/ipsec.conf :
config setup
nat_traversal=yes
virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
oe=off
protostack=netkey
conn L2TP-PSK-NAT
rightsubnet=vhost:%priv
also=L2TP-PSK-noNAT
conn L2TP-PSK-noNAT
authby=secret
pfs=no
auto=add
keyingtries=3
rekey=no
ikelifetime=8h
keylife=1h
type=transport
left=%any
leftprotoport=udp/1701
right=%any
rightprotoport=udp/%any
ike=aes128-sha1-modp1536,aes128-sha1-modp1024,aes128-md5-modp1536,aes128-md5-modp1024,3des-sha1-modp1536,3des-sha1-modp1024,3des-md5-modp1536,3des-md5-modp1024
esp=aes128-sha1-modp1536,aes128-sha1-modp1024,aes128-md5-modp1536,aes128-md5-modp1024,3des-sha1-modp1536,3des-sha1-modp1024,3des-md5-modp1536,3des-md5-modp1024Také nastavíme společné heslo pro přístup. Společné heslo by mělo být známo všem účastníkům sítě pro autentizaci. Tento způsob je spolehlivě nezabezpečený, protože toto heslo se snadno může dostat k osobám, kterým nechceme poskytovat přístup do sítě.
I přesto tento fakt neovlivní bezpečnost sítě, protože hlavní šifrování dat a autentizaci uživatelů provádí protokol PPP. Ale pro spravedlnost je třeba poznamenat, že strongswan podporuje bezpečnější technologie pro autentizaci, například pomocí privátních klíčů. Také je ve strongswan možnost zabezpečit autentizaci pomocí čipových karet, ale prozatím je podporován pouze omezený okruh zařízení, a proto je autentizace pomocí tokenů a čipových karet Rutoken zatím problematická. Nastavíme společné heslo pomocí souboru. /etc/strongswan/ipsec.secrets:
# ipsec.secrets - strongSwan IPsec secrets file
%any %any : PSK "SECRET_PASSPHRASE"Restartujeme strongswan:
sudo systemctl enable strongswan
sudo systemctl restart strongswanInstalace xl2tp
sudo dnf install xl2tpdOdpovíme ho pomocí souboru /etc/xl2tpd/xl2tpd.conf:
[global]
force userspace = yes
listen-addr = 0.0.0.0
ipsec saref = yes
[lns default]
exclusive = no
; určuje statickou adresu serveru ve virtuální síti
local ip = 100.10.10.1
; nastavuje rozsah virtuálních adres
ip range = 100.10.10.1-100.10.10.254
assign ip = yes
refuse pap = yes
require authentication = yes
; tuto možnost lze vypnout po úspěšném nastavení sítě
ppp debug = yes
length bit = yes
pppoptfile = \/etc\/ppp\/options.xl2tpd
; určuje adresu serveru v síti
name = centos.vpn.server.adRestartujeme službu:
sudo systemctl enable xl2tpd
sudo systemctl restart xl2tpdNastavení PPP
Je dobré mít poslední verzi pppd. Pro to vykonáme následující sekvenci příkazů:
sudo yum install git make gcc openssl-devel
git clone "https:\/\/github.com\/jjkeijser\/ppp"
cd ppp
.\/configure --prefix \/usr
make -j4
sudo make installZapište do souboru /etc/ppp/options.xl2tpd následující (pokud tam nějaké hodnoty jsou, můžete je odstranit):
ipcp-accept-local
ipcp-accept-remote
ms-dns 8.8.8.8
ms-dns 1.1.1.1
noccp
auth
crtscts
idle 1800
mtu 1410
mru 1410
nodefaultroute
debug
lock
proxyarp
connect-delay 5000Vypíšeme kořenový certifikát a certifikát serveru:
#директория с сертификатами пользователей, УЦ и сервера
sudo mkdir /etc/ppp/certs
#директория с закрытыми ключами сервера и УЦ
sudo mkdir /etc/ppp/keys
#запрещаем любой доступ к этой дирректории кроме администатора
sudo chmod 0600 /etc/ppp/keys/
#генерируем ключ и выписываем сертификат УЦ
sudo openssl genrsa -out /etc/ppp/keys/ca.pem 2048
sudo openssl req -key /etc/ppp/keys/ca.pem -new -x509 -out /etc/ppp/certs/ca.pem -subj "/C=RU/CN=L2TP CA"
#генерируем ключ и выписываем сертификат сервера
sudo openssl genrsa -out /etc/ppp/keys/server.pem 2048
sudo openssl req -new -out server.req -key /etc/ppp/keys/server.pem -subj "/C=RU/CN=centos.vpn.server.ad"
sudo openssl x509 -req -in server.req -CAkey /etc/ppp/keys/ca.pem -CA /etc/ppp/certs/ca.pem -out /etc/ppp/certs/server.pem -CAcreateserialTakže jsme dokončili základní nastavení serveru. Zbytek konfigurace serveru se týká přidání nových klientů.
Přidání nového klienta
Abychom přidali nového klienta do sítě, je třeba uložit jeho certifikát na seznam důvěryhodných pro tohoto klienta.
Pokud se uživatel chce stát účastníkem VPN sítě, vytvoří pár klíčů a žádost o certifikát pro daného klienta. Pokud je uživatel důvěryhodný, lze tuto žádost podepsat a získaný certifikát uložit do adresáře certifikátů:
sudo openssl x509 -req -in client.req -CAkey /etc/ppp/keys/ca.pem -CA /etc/ppp/certs/ca.pem -out /etc/ppp/certs/client.pem -CAcreateserialPřidáme řádek do souboru /etc/ppp/eaptls-server pro přiřazení jména klienta a jeho certifikátu:
"client" * /etc/ppp/certs/client.pem /etc/ppp/certs/server.pem /etc/ppp/certs/ca.pem /etc/ppp/keys/server.pem *POZNÁMKA
Abychom se nezaměnili, bylo by lepší, aby: Common Name, název souboru s certifikátem a uživatelské jméno byly jedinečné.
Je také dobré zkontrolovat, že v ostatních autentizačních souborech se nikde neobjevuje uživatelské jméno, které přidáváme, jinak mohou vzniknout problémy při autentizaci uživatele.
Tento certifikát je nutné poslat uživateli zpět.
Generování páru klíčů a certifikátu
Pro úspěšnou autentizaci je potřeba, aby klient:
- vygeneroval pár klíčů;
- měl kořenový certifikát CA;
- měl certifikát pro svůj pár klíčů podepsaný kořenovou CA.
pro klienta na Linuxu
Nejprve vygenerujeme pár klíčů na tokenu a vytvoříme žádost o certifikát:
#идентификатор ключа (параметр --id) можно заменить на любой другой.
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type rsa:2048 -l --id 45
openssl
OpenSSL> engine dynamic -pre SO_PATH:/usr/lib/x86_64-linux-gnu/engines-1.1/pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:librtpkcs11ecp.so
...
OpenSSL> req -engine pkcs11 -new -key 45 -keyform engine -out client.req -subj "/C=RU/CN=client"Odesílejte vzniklou žádost client.req k CA. Jakmile obdržíte certifikát pro svůj pár klíčů, uložte ho na token se stejným id, jaké má klíč:
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l -y cert -w ./client.pem --id 45pro klienty Windows a Linux (univerzálnější způsob)
Tento způsob je univerzálnější, protože umožňuje vygenerovat klíč a certifikát, který bude úspěšně rozpoznán uživateli Windows a Linux, ale vyžaduje, aby byla k dispozici mašina se systémem Windows pro provedení procedury generování klíčů.
Před generováním žádostí a importováním certifikátů je nutné přidat kořenový certifikát VPN sítě do seznamu důvěryhodných. K tomu jej otevřeme a v otevřeném okně vybereme možnost "Nainstalovat certifikát":

V otevřeném okně zvolíme instalaci certifikátu pro místního uživatele:

Nainstalujeme certifikát do úložiště důvěryhodných kořenových certifikátů CA:

Po všech těchto krocích souhlasíme se všemi dalšími body. Nyní je systém nakonfigurován.
Vytvoříme soubor cert.tmp s následujícím obsahem:
[NewRequest]
Subject = "CN=client"
KeyLength = 2048
KeySpec = "AT_KEYEXCHANGE"
ProviderName = "Microsoft Base Smart Card Crypto Provider"
KeyUsage = "CERT_KEY_ENCIPHERMENT_KEY_USAGE"
KeyUsageProperty = "NCRYPT_ALLOW_DECRYPT_FLAG"
RequestType = PKCS10
SMIME = FALSENásledně vygenerujeme pár klíčů a vytvoříme žádost o certifikát. Za tímto účelem otevřeme PowerShell a zadáme následující příkaz:
certreq.exe -new -pin $PIN .cert.tmp .client.reqOdešlete vytvořenou žádost client.req do vašeho certifikačního úřadu a vyčkejte na certifikát client.pem. Ten lze zapsat na token a přidat do úložiště certifikátů Windows pomocí následujícího příkazu:
certreq.exe -accept .client.pemJe třeba poznamenat, že obdobné akce lze provést pomocí grafického rozhraní programu mmc, ale tento způsob je časově náročnější a méně programovatelný.
Nastavení klienta Ubuntu
POZNÁMKA
Nastavení klienta na Linuxu je v současné době poměrně časově náročné, protože vyžaduje kompilaci jednotlivých programů ze zdrojového kódu. Budeme se snažit, aby se všechna tato vylepšení co nejdříve dostala do oficiálních repozitářů.
Pro zajištění připojení na úrovni IPSec k serveru se používá balíček strongswan a démon xl2tp. Pro usnadnění připojení k síti pomocí smart karet použijeme balíček l2tp-ipsec-vpn, který poskytuje grafické rozhraní pro jednodušší konfiguraci připojení.
Zahájíme sestavu prvků postupně, ale předtím nainstalujeme všechny potřebné balíčky pro přímou práci s VPN:
sudo apt-get install xl2tpd strongswan libp11-3Instalace softwaru pro práci s tokeny
Nainstalujte poslední verzi knihovny librtpkcs11ecp.so s , stejně jako knihovny pro práci se smart kartami:
sudo apt-get install pcscd pcsc-tools opensc libengine-pkcs11-opensslPřipojte RUT token a zkontrolujte, zda je systémem rozpoznán:
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O -lInstalace upraveného ppp
sudo apt-get -y install git make gcc libssl-dev
git clone "https://github.com/jjkeijser/ppp"
cd ppp
./configure --prefix /usr
make -j4
sudo make installInstalace klienta L2tpIpsecVpn
V současné době je také nutné klienta sestavit ze zdrojového kódu. To se provádí pomocí následujícího sledu příkazů:
sudo apt-get -y install git qt5-qmake qt5-default build-essential libctemplate-dev libltdl-dev
git clone "https://github.com/Sander80/l2tp-ipsec-vpn"
cd l2tp-ipsec-vpn
make -j4
sudo make installNastavení klienta L2tpIpsecVpn
Spouštíme nainstalovaného klienta:

Po spuštění by se vám měl otevřít applet L2tpIpsecVPN. Klikneme na něj pravým tlačítkem myši a provedeme nastavení připojení:

Aby pracovat s tokeny, nejprve určíme cestu k modulu OpenSSL a knihovně PKCS#11. K tomu otevřete kartu "Nastavení" pro konfiguraci parametrů openssl:
.
Zavřeme okno nastavení OpenSSL a přejdeme k nastavení sítě. Přidáme novou síť kliknutím na tlačítko Přidat… v panelu nastavení a zadejte jméno sítě:

Poté se tato síť stane dostupnou v panelu nastavení. Dvakrát klikneme pravým tlačítkem myši na novou síť, abychom ji nakonfigurovali. Na první kartě je třeba provést nastavení IPsec. Zadejte adresu serveru a sdílený klíč:

Poté přejdeme na kartu nastavení PPP a uvedeme tam uživatelské jméno, pod kterým se chceme přihlásit do sítě:

Poté otevřeme kartu Vlastnosti a uvedeme cestu k klíči, certifikátu klienta a certifikační autoritě:

Zavřeme tuto kartu a provedeme konečná nastavení, k tomu otevřeme kartu "IP nastavení" a zaškrtneme možnost "Získat adresu DNS serveru automaticky":

Tato možnost umožní klientovi získat od serveru osobní IP adresu uvnitř sítě.
Po všech nastaveních zavřeme všechny karty a restartujeme klienta:

Připojení k síti
Po nastavení můžeme přejít k připojení k síti. K tomu otevřeme kartuApplet a vybereme síť, k níž se chceme připojit:

Během procesu vytváření spojení klient požádá o zadání PIN kódu pro Rútoken:

Pokud se v stavovém řádku objeví oznámení, že spojení bylo úspěšně navázáno, pak bylo nastavení provedeno úspěšně:

V opačném případě stojí za to zjistit, proč spojení nebylo navázáno. K tomu se podívejte do protokolu programu a vyberte vAppletu příkaz "Informace o připojení":

Nastavení klienta Windows
Nastavení klienta ve Windows je mnohem jednodušší než v Linuxu, protože veškerý potřebný software je již zabudován do systému.
Nastavení systému
Nainstalujeme všechny potřebné ovladače pro práci s Rútokeny tím, že je stáhneme z .
Import kořenového certifikátu pro autentizaci
Stáhneme kořenový certifikát serveru a nainstalujeme ho do systému. K tomu ho otevřeme a v otevřeném okně vybereme možnost "Nainstalovat certifikát":

V otevřeném okně vybereme instalaci certifikátu pro místního uživatele. Pokud chceme, aby byl certifikát dostupný všem uživatelům na počítači, pak bychom měli vybrat instalaci certifikátu na místní počítač:

Nainstalujeme certifikát do úložiště důvěryhodných kořenových certifikátů CA:

Po všech těchto krocích souhlasíme se všemi dalšími body. Nyní je systém nakonfigurován.
Nastavení VPN připojení
Pro nastavení VPN připojení přejděte do ovládacího panelu a vyberte možnost vytvoření nového připojení.

V vyskakovacím okně vyberte možnost vytvoření připojení k pracovnímu místu:

V dalším okně vyberte připojení přes VPN:

a zadejte údaje VPN připojení, stejně jako nastavte možnost pro použití smart karty:

Tímto nastavení nekončí. Zbývá zadat sdílený klíč pro protokol IPsec, proto přejděme na kartu "Nastavení síťových připojení" a poté na kartu "Vlastnosti tohoto připojení":

V zobrazeném okně přejděme na kartu "Bezpečnost", nastavíme jako typ sítě "Síť L2TP/IPsec" a vybereme "Pokročilé možnosti":

V otevřeném okně uveďte sdílený klíč IPsec:

Připojení
Po dokončení nastavení můžete vyzkoušet připojení k síti:

Během připojování budeme požádáni o zadání PIN kódu tokenu:

Nastavili jsme si bezpečnou VPN síť a ujistili se, že to není složité.
Poděkování
Chtěl bych ještě jednou poděkovat našim kolegům Vasilii Šokovovi a Aleksandru Smirnovovi za společně odvedenou práci na zjednodušení vytváření VPN připojení pro klienty Linux.
Zdroj: habr.com
