
Problemområdet
För inte så länge sedan visste många inte hur det var att arbeta hemifrån. Pandemin förändrade plötsligt situationen i världen, alla började anpassa sig till de nya omständigheterna, nämligen att det blev osäkert att gå ut. Många tvingades snabbt organisera distansarbete för sina anställda.
Men bristen på en genomtänkt strategi för val av lösningar för distansarbete kan leda till oåterkalleliga förluster. Användarnas lösenord kan bli stulna, vilket ger en gärningsman möjlighet att obehindrat koppla upp sig mot nätverket och företagets IT-resurser.
Det är därför behovet av att skapa pålitliga företags VPN-nätverk har ökat. Jag kommer att berätta om pålitliga, säkra och enkla att använda VPN-nätverk.
Den fungerar enligt IPsec/L2TP-schemat, som använder icke-extraherbara nycklar och certifikat lagrade på tokens för autentisering av klienter, och överför data över nätverket i krypterad form.
Som demonstrationsplattformar för konfigureringen användes en server med CentOS 7 (adress: centos.vpn.server.ad) samt en klient med Ubuntu 20.04 och en klient med Windows 10.
Systembeskrivning
VPN kommer att fungera enligt schemat IPSec + L2TP + PPP. Protokollet Point-to-Point Protocol (PPP) fungerar på datalänknivån i OSI-modellen och säkerställer autentisering av användare och kryptering av överförda data. Dess data inkapslas i L2TP-protokollet, som i själva verket skapar anslutningen i VPN-nätverket men inte säkerställer autentisering och kryptering.
L2TP-data inkapslas i IPSec-protokollet, som också säkerställer autentisering och kryptering, men till skillnad från PPP sker autentisering och kryptering på enheten istället för på användarnivå.
Denna egenskap gör att autentisering av användare endast kan ske från specifika enheter. Vi kommer att använda IPSec-protokollet som sådant och tillåta autentisering av användare från valfri enhet.

Användarautentisering med hjälp av smartkort sker på PPP-protokollets nivå med hjälp av EAP-TLS-protokollet.
Mer detaljerad information om hur detta schema fungerar kan hittas i .
Varför detta schema uppfyller alla tre kraven för ett bra VPN-nätverk
- Tillförlitligheten av denna lösning har bevisats över tid. Den används för att implementera VPN-nät sedan år 2000.
- Säker användarautentisering tillhandahålls av PPP-protokollet. denna implementation erbjuder inte tillräcklig säkerhet, eftersom autentisering i bästa fall använder inloggning och lösenord. Vi vet alla att inloggning-lösenord kan observeras, gissas eller stjälas. Trots detta har utvecklaren på av detta protokoll åtgärdat detta problem och lagt till möjlighet att använda protokoll baserade på asymmetrisk kryptering för autentisering, som EAP-TLS. Dessutom har han lagt till möjlighet att använda smarta kort för autentisering, vilket gjort systemet mer säkert.
För närvarande pågår aktiva förhandlingar för att förena dessa två projekt, och man kan vara säker på att det förr eller senare kommer att ske. Till exempel finns det sedan länge en patchad version av PPP i Fedora-repositorierna som använder säkra protokoll för autentisering. - Ett tag kunde denna nätverkslösning endast användas av Windows-användare, men våra kollegor Vasily Shokov och Alexander Smirnov från MSU har hittat och vidareutvecklat det. Genom samarbete har vi åtgärdat många buggar och brister i klientens funktionalitet, vidgat installations- och konfigurationsprocessen, även vid kompilering från källkod. Några av de mest betydande förbättringarna är:
- Kompatibilitetsproblem med den gamla klienten och gränssnittet för nya versioner av openssl och qt har åtgärdats.
- Överföringen av pppd PIN-koden för token via en tillfällig fil har tagits bort.
- Det har gjorts en korrekt start av programmet för att fråga efter lösenord genom grafiskt gränssnitt. Detta uppnåddes genom att ställa in rätt miljö för xl2tpd-tjänsten.
- Bygget av L2tpIpsecVpn-demonen görs nu gemensamt med bygget av själva klienten, vilket underlättar bygg- och konfigurationsprocessen.
- För att underlätta utvecklingen har Azure Pipelines-systemet anslutits för att testa byggnosse.
- Möjligheten att tvinga ner I kontext av openssl. Detta är användbart för korrekt stöd för nya operativsystem där standard security level är inställd på 2, med VPN-nätverk som använder certifikat som inte uppfyller säkerhetskraven för denna nivå. Detta alternativ kommer att vara användbart för arbete med befintliga gamla VPN-nätverk.
Den korrigerade versionen kan hittas i .
Denna klient stöder användning av smartkort för autentisering och döljer maximalt alla besvär och svårigheter med att konfigurera detta schema under Linux, vilket gör klientens inställning så enkel och snabb som möjligt.
Självklart, för att underlätta integrationen mellan PPP och klientens GUI krävdes även vissa justeringar av varje projekt, men dessa kunde minimeras till ett minimum:
- Fixad
- Fixad . Detta fel gjorde att det inte gick att ladda konfiguration från den lokala /etc/ppp/openssl.cnf-filen, förutom information om openssl-motorer för att arbeta med smartkort, vilket var en stor olägenhet om vi ville specificera något annat än information om motorerna. Till exempel att fastställa security level vid anslutning.
Nu kan vi gå vidare med konfigurationen.
Serverkonfiguration
Vi installerar alla nödvändiga paket.
Installation av strongswan (IPsec)
Först kommer vi att konfigurera brandväggen för ipsec.
sudo firewall-cmd --permanent --add-port=1701/{tcp,udp}
sudo firewall-cmd --permanent --add-service=ipsec
sudo firewall-cmd --reloadSedan fortsätter vi med installationen
sudo yum install epel-release ipsec-tools dnf
sudo dnf install strongswanEfter installationen måste vi ange konfigurationen för strongswan (ett av implementationsalternativen för IPSec). För att göra detta redigerar vi filen /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-modp1024Vi kommer också att ställa in ett gemensamt lösenord för inloggning. Det gemensamma lösenordet måste vara känt av alla deltagare i nätverket för autentisering. Denna metod är bekant osäker eftersom detta lösenord lätt kan bli känt av personer som vi inte vill ge tillgång till nätverket.
Även om detta faktum inte påverkar säkerheten i nätverket, eftersom huvudsaklig kryptering av data och autentisering av användare utförs av PPP-protokollet. Men för rättvisans skull bör det påpekas att strongswan stödjer säkrare teknologier för autentisering, till exempel med hjälp av privata nycklar. Det finns också möjlighet i strongswan att säkerställa autentisering med smartkort, men för närvarande stöds en begränsad mängd enheter, vilket gör autentisering med token och smartkort från RUToken besvärlig. Vi ställer in ett gemensamt lösenord via fil. /etc/strongswan/ipsec.secrets:
# ipsec.secrets - strongSwan IPsec secrets file
%any %any : PSK "SECRET_PASSPHRASE"Vi startar om strongswan:
sudo systemctl enable strongswan
sudo systemctl restart strongswanInstallation av xl2tp
sudo dnf install xl2tpdVi konfigurerar det via fil /etc/xl2tpd/xl2tpd.conf:
[global]
force userspace = yes
listen-addr = 0.0.0.0
ipsec saref = yes
[lns default]
exclusive = no
; definierar serverns statiska adress i det virtuella nätverket
local ip = 100.10.10.1
; ställer in området för virtuella adresser
ip range = 100.10.10.1-100.10.10.254
assign ip = yes
refuse pap = yes
require authentication = yes
; denna alternativ kan inaktiveras efter att nätverket har konfigurerats framgångsrikt
ppp debug = yes
length bit = yes
pppoptfile = /etc/ppp/options.xl2tpd
; anger serverns adress i nätverket
name = centos.vpn.server.adVi startar om tjänsten:
sudo systemctl enable xl2tpd
sudo systemctl restart xl2tpdInställning av PPP
Det är önskvärt att installera den senaste versionen av pppd. För att göra detta kör vi följande kommandon:
sudo yum install git make gcc openssl-devel
git clone "https://github.com/jjkeijser/ppp"
cd ppp
./configure --prefix /usr
make -j4
sudo make installSkriv in i filen /etc/ppp/options.xl2tpd följande (om det finns några värden där kan de tas bort):
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 5000Skriv ut rotcertifikatet och servercertifikatet:
#директория с сертификатами пользователей, УЦ и сервера
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 -CAcreateserialSå vi har avslutat den grundläggande konfigurationen av servern. Den andra delen av serverkonfigurationen är relaterad till att lägga till nya klienter.
Lägg till en ny klient
För att lägga till en ny klient i nätverket måste dess certifikat skrivas in i listan över betrodda för denna klient.
Om användaren vill bli medlem i VPN-nätverket, skapar hen ett nyckelpar och en certifikatbegäran för denna klient. Om användaren är betrodd kan begäran signeras, och det resulterande certifikatet kan sparas i certifikatkatalogen:
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 -CAcreateserialLägg till en rad i filen /etc/ppp/eaptls-server för att matcha klientens namn med sitt certifikat:
"client" * /etc/ppp/certs/client.pem /etc/ppp/certs/server.pem /etc/ppp/certs/ca.pem /etc/ppp/keys/server.pem *ANTECKNING
För att undvika förvirring är det bäst att: Common Name, filnamnet på certifikatet och användarnamnet är unika.
Det är också viktigt att kontrollera att användarnamnet vi lägger till inte förekommer i andra autentiseringsfiler, annars kan det uppstå problem med autentiseringsmetoden.
Detta certifikat måste skickas tillbaka till användaren.
Generation av nyckelpar och certifikat
För att autentisera framgångsrikt måste klienten:
- generera ett nyckelpar;
- ha ett rotcertifikat från CA;
- ha ett certifikat för sitt nyckelpar, signerat av rot-CA.
för klienter på Linux
Först ska vi generera ett nyckelpar på token och skapa en certifikatbegäran:
#идентификатор ключа (параметр --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"Skicka begäran client.req till CA. Efter att du fått certifikatet för ditt nyckelpar, skriv det på token med samma id som nyckeln:
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l -y cert -w ./client.pem --id 45för Windows- och Linux-klienter (mer universell metod)
Denna metod är mer universell eftersom den gör det möjligt att generera en nyckel och certifikat som framgångsrikt kommer att kännas igen av användare på både Windows och Linux, men den kräver en dator med Windows för att utföra nyckelgenereringsproceduren.
Innan vi genererar begärningar och importerar certifikat måste vi lägga till rotcertifikatet för VPN-nätverket i listan över betrodda certifikat. För att göra detta öppnar vi det och väljer alternativet "Installera certifikat":

I det öppnade fönstret väljer vi installationen av certifikatet för den lokala användaren:

Vi installerar certifikatet i lagringen för betrodda rotcertifikat från CA:

Efter alla dessa åtgärder godkänner vi alla kommande punkter. Nu är systemet konfigurerat.
Skapa filen cert.tmp med följande innehåll:
[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 = FALSEEfter detta kommer vi att generera ett nyckelpar och skapa en begäran om certifikat. För detta ändamål öppnar vi powershell och skriver in följande kommando:
certreq.exe -new -pin $PIN .cert.tmp .client.reqSkicka den skapade begäran client.req till din CA och vänta på att få certifikatet client.pem. Det kan kopieras till token och läggas till Windows certifikatlagring med följande kommando:
certreq.exe -accept .client.pemDet är värt att notera att liknande åtgärder kan utföras med hjälp av det grafiska gränssnittet i programmet mmc, men denna metod är mer tidskrävande och mindre programmeringsbar.
Konfigurera Ubuntu-klienten
ANTECKNING
Konfigurera klienten på Linux är just nu ganska tidskrävande, eftersom det kräver att specifika program byggs från källkod. Vi kommer att sträva efter att säkerställa att alla ändringar hamnar i de officiella arkiven inom kort.
För att säkerställa anslutning på IPSec-nivå till servern används paketet strongswan och demon xl2tp. För att underlätta anslutningen till nätverket med hjälp av smartkort kommer vi att använda paketet l2tp-ipsec-vpn, som ger ett grafiskt gränssnitt för enklare anslutningsinställningar.
Vi börjar samla komponenter steg för steg, men innan dess installerar vi alla nödvändiga paket för VPN-funktionaliteten:
sudo apt-get install xl2tpd strongswan libp11-3Installation av programvara för att arbeta med token
Installera den senaste versionen av biblioteket librtpkcs11ecp.so från , samt biblioteken för att arbeta med smartkort:
sudo apt-get install pcscd pcsc-tools opensc libengine-pkcs11-opensslAnslut Rutoken och kontrollera att den känns igen av systemet:
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O -lInstallation av patchat 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 installInstallation av L2tpIpsecVpn-klienten
För tillfället behöver klienten också byggas från källkod. Detta görs med hjälp av följande kommandosekvens:
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 installKonfigurera L2tpIpsecVpn-klienten
Starta den installerade klienten:

Efter att ha startat bör L2tpIpsecVPN-applet öppnas. Högerklicka på det och konfigurera anslutningen:

För att arbeta med tokens ska vi först ange sökvägen till opensc-motorn i OpenSSL och PKCS#11-biblioteket. Öppna fliken "Inställningar" för att konfigurera openssl-parametrarna:
.
Vi stänger inställningsfönstret för OpenSSL och går vidare till nätverkskonfigurationen. Lägga till ett nytt nätverk genom att trycka på knappen Add… i inställningspanelen och ange nätverksnamnet:

Därefter blir detta nätverk tillgängligt i inställningspanelen. Högerklicka två gånger på det nya nätverket för att konfigurera det. På den första fliken behöver vi göra IPsec-inställningarna. Ange serveradressen och den gemensamma nyckeln:

Därefter går vi till fliken för PPP-konfiguration och anger där användarnamnet som vi vill använda för att ansluta till nätverket:

Öppna sedan fliken Egenskaper och ange sökvägen till nyckeln, klientcertifikatet och CA:

Vi stänger denna flik och gör den slutliga konfigurationen genom att öppna fliken "IP-inställningar" och markera alternativet "Hämta DNS-serveradress automatiskt":

Detta alternativ gör att klienten kan få en privat IP-adress från servern inom nätverket.
Efter att alla inställningar har gjorts stänger vi alla flikar och startar om klienten:

Anslutning till nätverket
Efter konfigurationen kan vi ansluta till nätverket. Öppna appletfliken och välj nätverket som vi vill ansluta till:

Under anslutningsprocessen kommer klienten att be om att ange PIN-koden för Rutoken:

Om det kommer en avisering i statusfältet om att anslutningen har etablerats framgångsrikt, betyder det att konfigurationen var framgångsrik:

Om inte bör vi ta reda på varför anslutningen inte upprättades. För detta är det bra att titta på programmets logg genom att välja kommandot "Anslutningsinformation" i applet:

Konfiguration av Windows-klienten
Konfigurationen av klienten i Windows är mycket enklare än i Linux, eftersom all nödvändig mjukvara redan är inbyggd i systemet.
Systemkonfiguration
Vi installerar alla nödvändiga drivrutiner för att arbeta med Rutokens genom att ladda ner dem från .
Import av rotcertifikat för autentisering
Ladda ner rotcertifikatet från servern och installera det i systemet. Öppna det och välj alternativet "Installera certifikat":

I det öppnade fönstret väljer vi att installera certifikatet för den lokala användaren. Om vi vill att certifikatet ska vara tillgängligt för alla användare på datorn bör vi välja att installera certifikatet på den lokala datorn:

Vi installerar certifikatet i lagringen för betrodda rotcertifikat från CA:

Efter alla dessa åtgärder godkänner vi alla kommande punkter. Nu är systemet konfigurerat.
Inställning av VPN-anslutning
För att konfigurera VPN-anslutningen, gå till kontrollpanelen och välj alternativet för att skapa en ny anslutning.

I det pop-up-fönstret, välj alternativet för att skapa en anslutning för att koppla upp dig till arbetsplatsen:

I nästa fönster väljer du VPN-anslutningen:

och ange VPN-anslutningsuppgifterna, samt välj alternativet för att använda smartkort:

Inställningen är inte klar ännu. Vi måste ange den gemensamma nyckeln för IPsec-protokollet, för detta går vi till fliken 'Inställningar för nätverksanslutningar' och sedan till fliken 'Egenskaper för denna anslutning':

I det öppnade fönstret, gå till fliken "Säkerhet", ange "L2TP/IPsec" som nätverkstyp och välj "Ytterligare alternativ":

I det öppnade fönstret anger vi den gemensamma IPsec-nyckeln:

Anslutning
När inställningen är klar kan du försöka ansluta till nätverket:

Under anslutningen kommer vi att bli ombedda att ange PIN-koden för token:

Vi har konfigurerat ett säkert VPN-nätverk och bekräftat att det inte är komplicerat.
Tack.
Jag vill återigen tacka våra kollegor Vasiliy Shokov och Alexander Smirnov för det gemensamma arbete vi har gjort för att förenkla skapandet av VPN-anslutningar för Linux-kunder.
Källa: habr.com
