
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.

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 .
Hvorfor denne løsning opfylder alle tre krav til et godt VPN-netværk
- 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.
- Den sikre brugerauthentificering sikres af PPP-protokollen. 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 i 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. - 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 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 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 .
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:
- Rettet
- Rettet . Denne fejl forhindrede indlæsningen af noget fra den lokale /etc/ppp/openssl.cnf-fil med konfiguration, bortset fra oplysninger om openssl-motorer til arbejde med smartkort, hvilket udgjorde en betydelig ulempe, hvis vi eksempelvis ønskede at angive noget andet ud over informationen om motorerne. For eksempel at fastsætte security level ved opsætning af forbindelsen.
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 --reloadDerefter går vi videre til installationen
sudo yum install epel-release ipsec-tools dnf
sudo dnf install strongswanEfter 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-modp1024Lad 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 strongswanInstallation af xl2tp
sudo dnf install xl2tpdVi 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.adLad os genstarte tjenesten:
sudo systemctl enable xl2tpd
sudo systemctl restart xl2tpdKonfiguration 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 installSkriv 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 5000Udgiv 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 -CAcreateserialPå 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 -CAcreateserialLad 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:
- generere et nøglepar;
- have et rodcertifikat fra CA;
- 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 45for 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:

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

Vi installerer certifikatet i opbevaringen for betroede rodcertifikater fra CA:

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 = FALSEDerefter 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.reqSend 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.pemDet 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-3Installation af software til arbejde med tokens
Installer den nyeste version af biblioteket librtpkcs11ecp.so fra , samt biblioteker til arbejde med smartkort:
sudo apt-get install pcscd pcsc-tools opensc libengine-pkcs11-opensslTilslut Rutoken, og kontroller, at den genkendes af systemet:
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O -lInstallation 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 installInstallation 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 installOpsætning af L2tpIpsecVpn-klienten
Åbn den installerede klient:

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

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

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:

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

Then we will open the Properties tab and specify the path to the key, client certificate, and CA:

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

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:

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:

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

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

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:

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

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:

Vi installerer certifikatet i opbevaringen for betroede rodcertifikater fra CA:

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.

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

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

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

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

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

I det åbne vindue, angiv den fælles nøgle for IPsec:

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

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

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
