Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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.

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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 denna artikel.

Varför detta schema uppfyller alla tre kraven för ett bra VPN-nätverk

  1. Tillförlitligheten av denna lösning har bevisats över tid. Den används för att implementera VPN-nät sedan år 2000.
  2. Säker användarautentisering tillhandahålls av PPP-protokollet. Den standardmässiga implementationen av PPP-protokollet utvecklades av Paul Mackerras. 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 Jan Just Keijser på i sin implementation 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.
  3. 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 ett gammalt L2TP-klientprojekt för Linux 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 säkerhetsnivån har lagts till. 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 detta förråd.

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:

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

Sedan fortsätter vi med installationen

sudo yum install epel-release ipsec-tools dnf
sudo dnf install strongswan

Efter 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-modp1024

Vi 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 strongswan

Installation av xl2tp

sudo dnf install xl2tpd

Vi 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.ad

Vi startar om tjänsten:

sudo systemctl enable xl2tpd
sudo systemctl restart xl2tpd

Instä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 install

Skriv 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 5000

Skriv 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 -CAcreateserial

Så 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 -CAcreateserial

Lä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:

  1. generera ett nyckelpar;
  2. ha ett rotcertifikat från CA;
  3. 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 45

fö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":

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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 = FALSE

Efter 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.req

Skicka 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.pem

Det ä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-3

Installation av programvara för att arbeta med token

Installera den senaste versionen av biblioteket librtpkcs11ecp.so från sidan, samt biblioteken för att arbeta med smartkort:

sudo apt-get install pcscd pcsc-tools opensc libengine-pkcs11-openssl

Anslut Rutoken och kontrollera att den känns igen av systemet:

pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O -l

Installation 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 install

Installation 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 install

Konfigurera L2tpIpsecVpn-klienten

Starta den installerade klienten:

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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:

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI.

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:

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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:

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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:

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

Öppna sedan fliken Egenskaper och ange sökvägen till nyckeln, klientcertifikatet och CA:
Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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":

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI
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:

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

Anslutning till nätverket

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

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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:

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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 den officiella webbplatsen.

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":

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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:

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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.

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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':

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

I det öppnade fönstret anger vi den gemensamma IPsec-nyckeln:
Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

Anslutning

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

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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

Konfigurering av autentisering i L2TP-nätverket med RUTOKEN ECP 2.0 och RUTOKEN PKI

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

Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar 🔥 Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster