
Problém
Ešte donedávna mnohí nevedeli, čo to znamená – pracovať z domu. Pandémia radikálne zmenila situáciu vo svete, všetci sa museli prispôsobiť novým okolnostiam, konkrétne tomu, že vychádzať z domu sa stalo jednoducho nebezpečné. Mnohí museli rýchlo zorganizovať prácu z domu pre svojich zamestnancov.
Avšak nedostatok správneho prístupu pri výbere riešení pre prácu na diaľku môže viesť k nezvratným stratám. Heslá užívateľov môžu byť ukradnuté, čo poskytuje útočníkovi možnosť nekontrolovane sa pripojiť k sieti a IT zdrojom firmy.
Práve preto teraz vzrástla potreba vytvorenia spoľahlivých firemných VPN sietí. Povieme si o spoľahlivej, bezpečný a jednoduchej na používanie VPN sieti.
Funguje na princípe IPsec/L2TP, ktorý pre autentifikáciu klientov používa nezískateľné kľúče a certifikáty uložené na tokenoch a tiež prenáša dáta po sieti zakódované.
Ako demo prostredia na nastavenie bol použitý server s CentOS 7 (adresa: centos.vpn.server.ad) a klient s Ubuntu 20.04, ako aj klient s Windows 10.
Opis systému
VPN bude fungovať na schéme IPSec + L2TP + PPP. Protokol Point-to-Point Protocol (PPP) funguje na úrovni kanála modelu OSI a zabezpečuje autentifikáciu používateľa a šifrovanie prenášaných dát. Jeho dáta sú enkapsulované v dátach protokolu L2TP, ktorý vlastne zabezpečuje vytvorenie spojenia v VPN sieti, ale nezabezpečuje autentifikáciu a šifrovanie.
Dáta L2TP sú enkapsulované v protokole IPSec, ktorý tiež zabezpečuje autentifikáciu a šifrovanie, ale na rozdiel od protokolu PPP sa autentifikácia a šifrovanie uskutočňuje na úrovni zariadení, a nie na úrovni používateľov.
Tento aspekt umožňuje autentifikáciu používateľov iba z určitých zariadení. My však použijeme protokol IPSec ako dané a umožníme autentifikáciu používateľov z akéhokoľvek zariadenia.

Autentifikácia používateľa pomocou smart kariet sa bude uskutočňovať na úrovni protokolu PPP pomocou protokolu EAP-TLS.
Podrobnejšie informácie o fungovaní tejto schémy nájdete v .
Prečo táto schéma spĺňa všetky tri požiadavky dobrej VPN siete
- Spoľahlivosť tejto schémy bola overená časom. Používa sa na nasadenie VPN sietí od roku 2000.
- Bezpečná autentifikácia používateľa zabezpečuje protokol PPP. nezabezpečuje dostatočnú úroveň bezpečnosti, keďže na autentifikáciu sa v najlepšom prípade používa autentifikácia pomocou prihlásenia a hesla. Všetci vieme, že prihlasovacie meno a heslo je možné odpozorovať, uhádnuť alebo ukradnúť. Napriek tomu už dávno vyvinul v tohto protokolu tento problém opravil a pridal možnosť používať na autentifikáciu protokoly, ktoré sú založené na asymetrickom šifrovaní, ako EAP-TLS. Okrem toho pridali možnosť používania smart kariet na autentifikáciu, čím sa tento systém stal bezpečnejším.
V súčasnosti prebiehajú aktívne rokovania o zlúčení týchto dvoch projektov a môžeme si byť istí, že skôr či neskôr sa to určite stane. Napríklad v repozitároch Fedora už dávno leží upravená verzia PPP, ktorá na autentifikáciu používa bezpečné protokoly. - Ešte nedávno mohli túto sieť využívať iba používatelia Windows, ale naši kolegovia z MGU, Vasilij Šokov a Alexander Smirnov, našli a dokončili ho. Spoločnými silami sme opravili množstvo chýb a nedostatkov v práci klienta, zjednodušili inštaláciu a nastavenie systému, dokonca aj pri kompilácii zo zdrojových kódov. Najzásadnejšie z nich sú:
- Opravené problémy s kompatibilitou starého klienta s rozhraním nových verzií openssl a qt.
- Odstránené odovzdávanie pppd PIN kódu tokenu cez dočasný súbor.
- Opravené nesprávne spúšťanie programu na požiadanie hesla prostredníctvom grafického rozhrania. To bolo dosiahnuté nastavením správneho prostredia pre službu xl2tpd.
- Kompilácia démona L2tpIpsecVpn sa teraz vykonáva súčasne s kompiláciou samotného klienta, čo uľahčuje proces kompilácie a nastavenia.
- Pre pohodlie vývoja bola pripojená systém Azure Pipelines na testovanie správnosti kompilácie.
- Pridaná možnosť nútene znižovať v kontexte openssl. To je užitočné pre správnu podporu nových operačných systémov, kde je štandardná úroveň zabezpečenia nastavená na 2, s VPN sieťami, v ktorých sa používajú certifikáty, ktoré nespĺňajú požiadavky zabezpečenia tejto úrovne. Táto možnosť bude užitočná pre prácu s už existujúcimi starými VPN sieťami.
Opravenú verziu nájdete v .
Tento klient podporuje používanie smart kariet na autentifikáciu a maximálne skrýva všetky ťažkosti a nepríjemnosti súvisiace s nastavením tejto schémy pod Linuxom, čím sa nastavenie klienta stáva maximálne jednoduchým a rýchlym.
Samozrejme, pre pohodlné prepojenie PPP a GUI klienta neobišlo ani bez dodatočných úprav každého z projektov, no aj tak sa podarilo minimalizovať ich počet na minimum:
- Opravená
- Opravená . Táto chyba neumožňovala načítať z lokálneho /etc/ppp/openssl.cnf súboru s konfiguráciou nič, okrem informácií o enginech openssl pre prácu so smart kartami, čo spôsobovalo vážne nepríjemnosti, ak sme, napríklad, okrem informácií o enginech chceli zadať niečo iné. Napríklad fixovať úroveň zabezpečenia pri vytváraní pripojenia.
Teraz sa môžeme pustiť do nastavenia.
Nastavenie servera
Nainštalujeme všetky potrebné balíčky.
Inštalácia strongswan (IPsec)
V prvom rade nastavíme firewall na prácu s ipsec
sudo firewall-cmd --permanent --add-port=1701/{tcp,udp}
sudo firewall-cmd --permanent --add-service=ipsec
sudo firewall-cmd --reloadPotom sa pustíme do inštalácie
sudo yum install epel-release ipsec-tools dnf
sudo dnf install strongswanPo inštalácii je potrebné nastaviť konfiguráciu pre strongswan (jednu z implementácií IPSec). Na to upravíme súbor /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-modp1024Nastavíme aj spoločné heslo na prihlásenie. Spoločné heslo by malo byť známe všetkým účastníkom siete na autentifikáciu. Tento spôsob však nie je veľmi spoľahlivý, pretože sa môže ľahko dostať k osobám, ktorým nechceme umožniť prístup k sieti.
Napriek tomu tento fakt neovplyvní bezpečnosť organizácie siete, pretože základné šifrovanie dát a autentifikáciu používateľov vykonáva protokol PPP. Treba však spravodlivo poznamenať, že strongswan podporuje bezpečnejšie technológie autentifikácie, napríklad pomocou súkromných kľúčov. V strongswan je tiež možnosť zabezpečiť autentifikáciu pomocou smart kariet, avšak v súčasnosti sa podporuje obmedzený počet zariadení, takže autentifikácia pomocou tokenov a smart kariet RUTOKEN je zatiaľ problematická. Nastavíme spoločné heslo cez súbor. /etc/strongswan/ipsec.secrets:
# ipsec.secrets - strongSwan IPsec secrets file
%any %any : PSK "SECRET_PASSPHRASE"Reštartujeme strongswan:
sudo systemctl enable strongswan
sudo systemctl restart strongswanInštalácia xl2tp
sudo dnf install xl2tpdNastavíme ho cez súbor /etc/xl2tpd/xl2tpd.conf:
[global]
force userspace = yes
listen-addr = 0.0.0.0
ipsec saref = yes
[lns default]
exclusive = no
; určí statickú adresu servera vo virtuálnej sieti
local ip = 100.10.10.1
; určuje rozsah virtuálnych adries
ip range = 100.10.10.1-100.10.10.254
assign ip = yes
refuse pap = yes
require authentication = yes
; túto možnosť je možné vypnúť po úspešnom nastavení siete
ppp debug = yes
length bit = yes
pppoptfile = /etc/ppp/options.xl2tpd
; určuje adresu servera v sieti
name = centos.vpn.server.adReštartujeme službu:
sudo systemctl enable xl2tpd
sudo systemctl restart xl2tpdNastavenie PPP
Odporúča sa nainštalovať najnovšiu verziu pppd. Na to vykonáme nasledujúcu sekvenciu príkazov:
sudo yum install git make gcc openssl-devel
git clone "https://github.com/jjkeijser/ppp"
cd ppp
./configure --prefix /usr
make -j4
sudo make installNapíšte do súboru /etc/ppp/options.xl2tpd nasledujúce (ak tam sú nejaké hodnoty, môžete ich odstrániť):
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 koreňový certifikát a certifikát servera:
#директория с сертификатами пользователей, УЦ и сервера
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 -CAcreateserialTýmto sme ukončili základné nastavenie servera. Zvyšok konfigurácie servera súvisí s pridávaním nových klientov.
Pridanie nového klienta
Aby ste pridali nového klienta do siete, je potrebné zapísať jeho certifikát do zoznamu dôveryhodných pre daného klienta.
Ak chce používateľ vstúpiť do VPN siete, vytvorí kľúčový pár a žiadosť o certifikát pre daného klienta. Ak je používateľ dôveryhodný, je možné túto žiadosť podpísať a získaný certifikát zapísať do adresára certifikátov:
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 -CAcreateserialPridáme riadok do súboru /etc/ppp/eaptls-server na zladenie mena 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
Aby sme nezamieňali, je lepšie, aby: Common Name, názov súboru s certifikátom a meno používateľa boli jedinečné.
Tiež je dôležité skontrolovať, či v iných autentifikačných súboroch nikde nevystupuje meno používateľa, ktorého pridávame, inak môžu vzniknúť problémy s metódou autentifikácie používateľa.
Tento certifikát je potrebné poslať používateľovi späť.
Generovanie kľúčového páru a certifikátu
Aby bola autentifikácia úspešná, klient musí:
- vygenerovať kľúčový pár;
- mať root certifikát CA;
- mať certifikát pre svoj kľúčový pár, podpísaný root CA.
pre klienta na Linuxe
Najprv vygenerujme kľúčový pár na token a vytvorme žiadosť 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"Vytvorenú žiadosť client.req pošlite do CA. Po získaní certifikátu pre svoj kľúčový pár ho zapíšte na token so rovnakým id ako má kľúč:
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l -y cert -w ./client.pem --id 45pre klientov Windows a Linux (univerzálnejší spôsob)
Tento spôsob je univerzálnejší, pretože umožňuje vygenerovať kľúč a certifikát, ktorý bude úspešne rozpoznateľný používateľmi Windows a Linux, ale vyžaduje prítomnosť zariadenia so systémom Windows na vykonanie procedúry generovania kľúčov.
Pred generovaním žiadostí a importom certifikátov je potrebné pridať root certifikát VPN siete do zoznamu dôveryhodných. Na to ho otvoríme a v otvorenom okne vyberieme možnosť "Nainštalovať certifikát":

V otvorenom okne vyberieme inštaláciu certifikátu pre lokálneho používateľa:

Nainštalujeme certifikát do úložiska dôveryhodných root certifikátov CA:

Po všetkých týchto krokoch súhlasíme so všetkými nasledujúcimi bodmi. Systém je teraz nastavený.
Vytvoríme súbor cert.tmp s nasledujúcim obsahom:
[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 = FALSEPo tomto vygenerujeme kľúčový pár a vytvoríme žiadosť o certifikát. Na to otvoríme powershell a zadáme nasledujúci príkaz:
certreq.exe -new -pin $PIN .cert.tmp .client.reqOdošlite vytvorenú žiadosť client.req do vášho certifikačného úradu a počkajte na prijatie certifikátu client.pem. Ten môžete zapísať na token a pridať do úložiska certifikátov Windows pomocou nasledujúceho príkazu:
certreq.exe -accept .client.pemJe potrebné poznamenať, že podobné kroky môžu byť vykonané aj prostredníctvom grafického rozhrania programu mmc, avšak tento spôsob je zdĺhavejší a menej programovateľný.
Nastavenie klienta Ubuntu
POZNÁMKA
Nastavenie klienta na Linuxe je momentálne dosť časovo náročné, pretože si vyžaduje zostavenie jednotlivých programov zo zdrojových súborov. Pokúsime sa čoskoro dosiahnuť, aby sa všetky zmeny dostali do oficiálnych repozitárov.
Na zabezpečenie pripojenia na úrovni IPSec k serveru sa používa balík strongswan a démon xl2tp. Na zjednodušenie pripojenia k sieti pomocou smart kariet použijeme balík l2tp-ipsec-vpn, ktorý poskytuje grafické rozhranie na zjednodušené nastavenie pripojenia.
Začneme zostavovanie prvkov po etapách, ale predtým nainštalujeme všetky potrebné balíky pre okamžitú prácu VPN:
sudo apt-get install xl2tpd strongswan libp11-3Inštalácia softvéru na prácu s tokenmi
Nainštalujte poslednú verziu knižnice librtpkcs11ecp.so s , ako aj knižnice na prácu so smart kartami:
sudo apt-get install pcscd pcsc-tools opensc libengine-pkcs11-opensslPripojte Rutikon a skontrolujte, či ho systém rozpoznáva:
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O -lInštalácia opravené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 installInštalácia klienta L2tpIpsecVpn
V súčasnosti je potrebné aj klienta zostavovať zo zdrojových súborov. To sa robí pomocou nasledujúcej sekvencie príkazov:
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 installNastavenie klienta L2tpIpsecVpn
Spúšťame nainštalovaného klienta:

Po spustení by sa vám mal otvoríť applet L2tpIpsecVPN. Klikneme naň pravým tlačidlom myši a vykonáme nastavenie pripojenia:

Na prácu s tokenmi najprv uvádzame cestu opensc motora OpenSSL a knižnice PKCS#11. Na to otvorte kartu "Preferences" na nastavenie parametrov openssl:
.
Zavrieme okno nastavení OpenSSL a prejdeme k nastaveniu siete. Pridáme novú sieť kliknutím na tlačidlo Add… v paneli nastavení a zadajte názov siete:

Po tomto bude táto sieť dostupná v paneli nastavení. Dvakrát kliknite pravým tlačidlom myši na novú sieť, aby ste ju nastavili. Na prvej karte je potrebné vykonať nastavenia IPsec. Zadajte adresu servera a spoločný kľúč:

Po tomto prejdeme na kartu nastavenia PPP a uvedieme tam meno používateľa, pod ktorým sa chceme prihlásiť do siete:

Potom otvoríme kartu Properties a uvedieme cestu k kľúču, certifikátu klienta a certifikačnej autorite:

Zavrieme túto kartu a vykonáme finálne nastavenie, na to otvoríme kartu "IP settings" a zaškrtneme možnosť "Obtain DNS server address automatically":

Táto možnosť umožní klientovi získať od servera osobnú IP adresu v rámci siete.
Po všetkých nastaveniach zavrieme všetky karty a reštartujeme klienta:

Pripojenie na sieť
Po nastaveniach môžeme vykonať pripojenie k sieti. Na to otvoríme kartu appletu a vyberieme sieť, k ktorej sa chceme pripojiť:

V procese ustanovenia spojenia klient požiada o zadanie PIN kódu RUTOKEN:

Ak sa na stavovom páse objaví upozornenie, že spojenie bolo úspešne ustanovené, znamená to, že nastavenie bolo vykonané úspešne:

V opačnom prípade je potrebné zistiť, prečo spojenie nebolo ustanovené. Na to si pozrite log programu a vyberte v applete príkaz "Connection information":

Nastavenie klienta Windows
Nastavenie klienta vo Windows sa vykonáva oveľa jednoduchšie ako v Linuxe, pretože celý potrebný softvér je už zabudovaný v systéme.
Nastavenie systému
Nainštalujeme všetky potrebné ovládače na prácu s RUTOKENmi stiahnutím ich z .
Import koreňového certifikátu na autentifikáciu
Stiahneme koreňový certifikát servera a nainštalujeme ho do systému. Na to otvoríme certifikát a v otvorenom okne vyberieme možnosť "Uložiť certifikát":

V otvorenom okne vyberieme inštaláciu certifikátu pre lokálneho používateľa. Ak chcete, aby bol certifikát prístupný všetkým používateľom na počítači, mali by ste vybrať inštaláciu certifikátu na lokálnom počítači:

Nainštalujeme certifikát do úložiska dôveryhodných root certifikátov CA:

Po všetkých týchto krokoch súhlasíme so všetkými nasledujúcimi bodmi. Systém je teraz nastavený.
Nastavenie VPN spojenia
Prejdite na ovládací panel a vyberte možnosť na vytvorenie nového pripojenia pre nastavenie VPN.

V zobrazenej ponuke vyberte možnosť vytvorenia pripojenia na prácu:

V nasledujúcom okne vyberte pripojenie cez VPN:

a zadajte údaje o pripojení VPN, ako aj možnosť používania čipovej karty:

Týmto nastavenie nekončí. Ešte je potrebné zadať zdieľaný kľúč pre protokol IPsec, preto prejdeme na kartu "Nastavenia sieťových pripojení" a následne na kartu "Vlastnosti tohto pripojenia":

V otvorenom okne prejdeme na kartu "Bezpečnosť", ako typ siete vyberieme "Sieť L2TP/IPsec" a zvolíme "Ďalšie parametre":

V otvorenom okne zadáme zdieľaný kľúč IPsec:

Pripojenie
Po dokončení nastavenia môžete vyskúšať pripojiť sa k sieti:

Počas pripojenia nás požiadajú o zadanie PIN kódu tokenu:

Nastavili sme bezpečnú VPN sieť a uistili sa, že to nie je zložité.
Poďakovanie
Ešte raz by sme chceli poďakovať našim kolegom Vasiliovi Šokovovi a Alexandrovi Smirnovovi za spoločnú prácu na zjednodušení vytvárania VPN pripojení pre klientov Linux.
Zdroj: habr.com
