Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

Problematikken

For ikke så længe siden vidste mange ikke, hvordan det var — at arbejde hjemmefra. Pandemien ændrede pludselig situationen i verden, folk begyndte at tilpasse sig de nye omstændigheder, nemlig at det ikke længere var sikkert at gå hjemmefra. Mange måtte hurtigt organisere hjemmearbejde for deres medarbejdere.

Men manglen på et kvalificeret valg af løsninger til fjernarbejde kan føre til uoprettelige tab. Brugernes adgangskoder kan blive stjålet, hvilket giver en angriber mulighed for frit at tilslutte sig netværket og virksomhedens IT-ressourcer.

Netop derfor er behovet for at oprette pålidelige corporate VPN-netværk steget. Jeg vil fortælle dig om pålidelige, sikre og enkle at bruge VPN-netværk.

Det fungerer efter IPsec/L2TP-schemaet, som bruger ufortrængelige nøgler og certifikater gemt på tokens til autentifikation af klienter og overfører data over netværket i krypteret form.

Som demonstrationsplatforme for opsætning blev der anvendt en server med CentOS 7 (adresse: centos.vpn.server.ad) og en klient med Ubuntu 20.04 samt en klient med Windows 10.

Systembeskrivelse

VPN'en vil fungere efter IPSec + L2TP + PPP-schemaet. Protokollen Point-to-Point Protocol (PPP) arbejder på datalinkniveauet i OSI-modellen og sikrer brugergodkendelse og kryptering af de overførte data. Dens data er indkapslet i L2TP-protokolens data, som i sig selv sikrer oprettelsen af forbindelse i VPN-netværket, men ikke sikrer godkendelse og kryptering.

L2TP-data indkapsles i IPSec-protokollen, der også sikrer godkendelse og kryptering, men i modsætning til PPP-protokollen sker godkendelse og kryptering på enheds-niveau og ikke på brugerniveau.

Denne egenskab muliggør brugergodkendelse kun fra bestemte enheder. Vi vil dog bruge IPSec-protokollen som dette og tillade godkendelse af brugere fra enhver enhed.

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

Brugerautentifikation ved hjælp af smartcards vil ske på niveauet af PPP-protokollen ved hjælp af EAP-TLS-protokollen.

Mere detaljeret information om arbejdet med dette schema kan findes i denne artikel.

Hvorfor denne løsning opfylder alle tre krav til et godt VPN-netværk

  1. Pålideligheden af denne løsning er blevet bekræftet over tid. Den har været brugt til at implementere VPN-netværk siden 2000.
  2. Den sikre brugerauthentificering sikres af PPP-protokollen. Den standardimplementering af PPP-protokollen, der er udviklet af Paul Mackerras sikrer ikke et tilstrækkeligt sikkerhedsniveau, da autentificering højst kan ske med brugernavn og password. Vi ved alle, at brugernavn og password kan overvåges, gættedes eller stjæles. Ikke desto mindre har udvikleren Jan Just Keijser i sin implementering af denne protokol rettet op på dette og tilføjet muligheden for at bruge protokoller baseret på asymmetrisk kryptering, som EAP-TLS, til autentificering. Derudover blev muligheden for at bruge smarte kort til autentificering tilføjet, hvilket gjorde systemet mere sikkert.
    I øjeblikket er der aktive forhandlinger om fusionen af disse to projekter, og man kan være sikker på, at det før eller senere vil ske. For eksempel ligger der længe en patched version af PPP i Fedora-repositories, der bruger sikre protokoller til autentificering.
  3. For ikke længe siden kunne dette netværk kun bruges af Windows-brugere, men vores kolleger fra MSU, Vasily Shokov og Alexander Smirnov, fandt et gammelt L2TP-klientprojekt til Linux og har videreudviklet det. Gennem fælles indsats har vi rettet mange fejl og mangler i klientens funktionalitet, forenklet installation og konfiguration af systemet, selv ved kompilering fra kildekoden. De mest væsentlige forbedringer er:
    • Rettede kompatibilitetsproblemer med den gamle klient med grænsefladen i de nye versioner af openssl og qt.
    • Fjernede overførsel af pppd PIN-koden til tokenet via en midlertidig fil.
    • Rettede den fejlslagne opstart af programmet til at anmode om en adgangskode gennem det grafiske interface. Dette blev gjort ved at indstille det korrekte miljø for xl2tpd-tjenesten.
    • Samlingsprocessen for L2tpIpsecVpn-dæmonen foregår nu samtidig med samlingen af selve klienten, hvilket letter processen med bygning og konfiguration.
    • For udviklingsbekvemmelighed er Azure Pipelines-systemet tilføjet til test af korrekthed i samlingen.
    • Muligheden for at tvinge ned sikkerhedsniveauet er tilføjet I konteksten af openssl. Det er nyttigt for korrekt understøttelse af nye operativsystemer, hvor standard security level er sat til 2, med VPN-netværk, der bruger certifikater, der ikke opfylder sikkerhedskravene for dette niveau. Denne mulighed vil være nyttig til arbejde med eksisterende gamle VPN-netværk.

Den rettede version kan findes i dette repository.

Denne klient understøtter brugen af smartkort til autentifikation og skjuler alle belastninger og ulemper ved at konfigurere denne ordning under Linux, hvilket gør klientkonfigurationen så enkel og hurtig som muligt.

Selvfølgelig var der behov for yderligere justeringer af hvert projekt for at sikre en bekvem integration af PPP med GUI-klienten, men de blev mindsket til et minimum:

Nu kan vi begynde konfigurationen.

Serverkonfiguration

Lad os installere alle nødvendige pakker.

Installation af strongswan (IPsec)

Først skal vi konfigurere firewall'en for at arbejde med ipsec

sudo firewall-cmd --permanent --add-port=1701/{tcp,udp}
sudo firewall-cmd --permanent --add-service=ipsec
sudo firewall-cmd --reload

Derefter går vi videre til installationen

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

Efter installationen er det nødvendigt at specificere konfigurationen for strongswan (en af implementeringerne af IPSec). For at gøre dette redigerer 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

Lad os også angive en fælles adgangskode til login. Den fælles adgangskode skal være kendt af alle medlemmer af netværket for godkendelse. Denne metode er dog i forvejen usikker, da adgangskoden let kan blive kendt af personer, vi ikke ønsker at give adgang til netværket.
Selvom denne faktor ikke vil påvirke netværkets sikkerhed, da hovedkrypteringen af data og brugerautentificeringen udføres af PPP-protokollen, er det retfærdigt at nævne, at strongswan understøtter mere sikre autentificeringsteknologier, for eksempel ved hjælp af private nøgler. Derudover har strongswan mulighed for at sikre autentificering ved hjælp af smartkort, men i øjeblikket understøttes kun et begrænset antal enheder, og derfor er autentificering ved hjælp af tokens og smartkort Rūtoken stadig vanskelig. Lad os angive en fælles adgangskode gennem en fil. /etc/strongswan/ipsec.secrets:

# ipsec.secrets - strongSwan IPsec secrets file
%any %any : PSK "SECRET_PASSPHRASE"

Lad os genstarte strongswan:

sudo systemctl enable strongswan
sudo systemctl restart strongswan

Installation af xl2tp

sudo dnf install xl2tpd

Vi konfigurerer det gennem en fil /etc/xl2tpd/xl2tpd.conf:

[global]
force userspace = yes
listen-addr = 0.0.0.0
ipsec saref = yes

[lns default]
exclusive = no
; definerer den statiske serveradresse i det virtuelle netværk
local ip = 100.10.10.1
; angiver området for de virtuelle adresser
ip range = 100.10.10.1-100.10.10.254
assign ip = yes
refuse pap = yes
require authentication = yes
; denne mulighed kan deaktiveres efter vellykket opsætning af netværket
ppp debug = yes
length bit = yes
pppoptfile = /etc/ppp/options.xl2tpd
; angiver serverens adresse i netværket
name = centos.vpn.server.ad

Lad os genstarte tjenesten:

sudo systemctl enable xl2tpd
sudo systemctl restart xl2tpd

Konfiguration af PPP

Det anbefales at installere den nyeste version af pppd. For at gøre dette udfører vi følgende kommandoer:

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 i filen /etc/ppp/options.xl2tpd det følgende (hvis der er nogen værdier der, kan de slettes):

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

Udgiv rodcertifikatet og serverens certifikat:

#директория с сертификатами пользователей, УЦ и сервера
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

På denne måde har vi afsluttet den grundlæggende opsætning af serveren. Den resterende del af serverkonfigurationen er relateret til tilføjelse af nye klienter.

Tilføjelse af en ny klient

For at tilføje en ny klient til netværket skal dens certifikat skrives på listen over betroede certifikater for denne klient.

Hvis brugeren ønsker at blive medlem af VPN-netværket, opretter han et nøglepar og en ansøgning om certifikat til denne kunde. Hvis brugeren er betroet, kan denne ansøgning underskrives, og det resulterende certifikat kan gemmes i certifikatbiblioteket:

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

Lad os tilføje en linje i filen /etc/ppp/eaptls-server for at matche klientens navn med hans certifikat:

"client" * /etc/ppp/certs/client.pem /etc/ppp/certs/server.pem /etc/ppp/certs/ca.pem /etc/ppp/keys/server.pem *

NOTE
For ikke at blive forvirret, er det bedst, hvis: Common Name, filnavnet til certifikatet og brugernavnet er unikke.

Det er også vigtigt at sikre, at brugerens navn ikke optræder i andre godkendelsesfiler, ellers vil der opstå problemer med brugerens godkendelsesmetode.

Det samme certifikat skal sendes tilbage til brugeren.

Generering af nøglepar og certifikat

For at gennemføre en vellykket godkendelse skal klienten:

  1. generere et nøglepar;
  2. have et rodcertifikat fra CA;
  3. have et certifikat for sit nøglepar, der er underskrevet af rod-CA.

for klienten på Linux

Lad os først generere et nøglepar på en token og oprette en ansøgning om certifikat:

#идентификатор ключа (параметр --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"

Send den resulterende ansøgning client.req til CA. Når du har modtaget certifikatet til dit nøglepar, skal du gemme det på token med den samme id som nøglen:

pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l -y cert -w ./client.pem --id  45

for Windows- og Linux-klienter (mere universel metode)

Denne metode er mere universel, da den giver mulighed for at generere en nøgle og et certifikat, som vil blive genkendt af brugere af både Windows og Linux, men det kræver en maskine med Windows til at gennemføre proceduren for nøglegenerering.

Før du genererer anmodninger og importerer certifikater, skal du tilføje rodcertifikatet fra VPN-netværket til listen over betroede certifikater. For at gøre dette åbner vi det og vælger indstillingen "Installer certifikat" i det åbne vindue:

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

I det åbne vindue vælger vi installation af certifikatet for den lokale bruger:

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

Vi installerer certifikatet i opbevaringen for betroede rodcertifikater fra CA:

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

Efter alle disse trin accepterer vi alle fremtidige punkter. Systemet er nu konfigureret.

Lad os oprette en fil cert.tmp med følgende indhold:

[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

Derefter genererer vi et nøglepar og opretter en ansøgning om certifikat. Til dette åbner vi PowerShell og skriver følgende kommando:

certreq.exe -new -pin $PIN .cert.tmp .client.req

Send den oprettede ansøgning client.req til dit CA og vent på at modtage certifikatet client.pem. Det kan gemmes på token og tilføjes til Windows' certifikatlager med følgende kommando:

certreq.exe -accept .client.pem

Det skal bemærkes, at tilsvarende handlinger også kan udføres ved hjælp af den grafiske grænseflade i mmc-programmet, men denne metode er mere tidskrævende og mindre programmerbar.

Opsætning af Ubuntu-klienten

NOTE
Opsætning af klienten på Linux er i øjeblikket ret tidskrævende, da det kræver at samle specifikke programmer fra kildekoden. Vi vil bestræbe os på at få alle ændringer ind i de officielle repositories snarest.

For at sikre tilslutning på IPSec-niveau til serveren bruges pakken strongswan og daemonen xl2tp. For at forenkle tilslutningen til netværket med smartkort – vil vi bruge pakken l2tp-ipsec-vpn, der giver en grafisk brugerflade til lettere konfiguration af forbindelsen.

Lad os begynde at samle elementerne trin for trin, men før det installerer vi alle nødvendige pakker til direkte arbejde med VPN:

sudo apt-get install xl2tpd strongswan libp11-3

Installation af software til arbejde med tokens

Installer den nyeste version af biblioteket librtpkcs11ecp.so fra webstedet, samt biblioteker til arbejde med smartkort:

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

Tilslut Rutoken, og kontroller, at den genkendes af systemet:

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

Installation af det patchede 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 af L2tpIpsecVpn-klienten

I øjeblikket skal klienten også samles fra kildekoden. Dette gøres ved hjælp af følgende kommandoer:

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

Opsætning af L2tpIpsecVpn-klienten

Åbn den installerede klient:

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

Når klienten er startet, skal du åbne L2tpIpsecVPN-applet. Højreklik på den og konfigurer forbindelsen:

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

For working with tokens, first, we will specify the path to the OpenSSL engine and the PKCS#11 library. To do this, open the "Preferences" tab to configure OpenSSL settings:

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI.

We will close the OpenSSL settings window and move on to network configuration. Add a new network by clicking the Add… button in the settings panel and enter the network name:

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

After that, this network will become available in the settings panel. Double-click on the new network with the right mouse button to configure it. In the first tab, it is necessary to configure the IPsec settings. We will set the server address and shared key:

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

Next, we move to the PPP settings tab and specify the username we wish to use to access the network:

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

Then we will open the Properties tab and specify the path to the key, client certificate, and CA:
Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

We will close this tab and perform the final setup by opening the "IP settings" tab and checking the option "Obtain DNS server address automatically":

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI
This option will allow the client to receive a personal IP address from the server within the network.

After completing all settings, we will close all tabs and restart the client:

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

Connecting to the network

After the settings, we can connect to the network. To do this, we will open the applet tab and select the network we wish to connect to:

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

During the connection setup, the client will ask us to enter the PIN code for the Rutoken:

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

If a notification appears in the status bar indicating that the connection has been successfully established, it means that the configuration was successful:

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

Otherwise, we need to investigate why the connection was not established. For that, we should check the program log by selecting the "Connection information" command in the applet:

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

Windows Client Configuration

Setting up the client in Windows is much simpler than in Linux, as all necessary software is already built into the system.

System Configuration

We will install all the necessary drivers for working with Rutokens by downloading them from the official website.

Importing the Root Certificate for Authentication

We will download the server root certificate and install it in the system. To do this, we will open it and in the opened window select the "Install certificate" option:

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

In the opened window, we will choose to install the certificate for the local user. If you want the certificate to be available to all users on the computer, then you should choose to install the certificate on the local computer:

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

Vi installerer certifikatet i opbevaringen for betroede rodcertifikater fra CA:

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

Efter alle disse trin accepterer vi alle fremtidige punkter. Systemet er nu konfigureret.

Opsætning af VPN-forbindelse

For at konfigurere VPN-forbindelsen, gå til kontrolpanelet og vælg indstillingen for at oprette en ny forbindelse.

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

I det pop op-vindue, vælg muligheden for at oprette en forbindelse til arbejdspladsen:

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

I det næste vindue, vælg VPN-forbindelse:

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

og indtast oplysningerne til VPN-forbindelsen, samt angiv indstillingen for at bruge smartkort:

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

Opsætningen slutter ikke her. Vi skal angive den fælles nøgle til IPsec-protokollen, for dette går vi til fanen 'Indstillinger for netværksforbindelser' og derefter til fanen 'Egenskaber for denne forbindelse':

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

I det åbne vindue, gå til fanen "Sikkerhed", angiv som netværkstypen "L2TP/IPsec-netværk" og vælg "Yderligere indstillinger":

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

I det åbne vindue, angiv den fælles nøgle for IPsec:
Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

Forbindelse

Efter opsætningen kan du prøve at oprette forbindelse til netværket:

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

Under forbindelse vil vi blive bedt om at indtaste PIN-koden for tokenet:

Opsætning af L2TP-netværksautentifikation ved hjælp af Rutoken EDS 2.0 og Rutoken PKI

Vi har opsat et sikkert VPN-netværk og bekræftet, at det ikke er svært.

Taknemmelighed

Vi vil gerne endnu en gang takke vores kolleger Vasiliy Shokov og Alexander Smirnov for det fælles arbejde i at gøre oprettelsen af VPN-forbindelser til kunder med Linux lettere.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster