
Issues
Krekt koartlyn wisten in protte net hoe't it wie om thús te wurkjen. De pandemy hat de situaasje yn 'e wrâld dramatysk feroare; elkenien is begon oan te passen oan 'e hjoeddeistige omstannichheden, nammentlik oan it feit dat it gewoan ûnfeilich wurden is om it hûs te ferlitten. En in protte moasten it wurk fan hûs fluch organisearje foar har meiwurkers.
It ûntbrekken fan in kompetinte oanpak foar it kiezen fan oplossingen foar wurk op ôfstân kin lykwols liede ta ûnomkearbere ferliezen. Brûkerswachtwurden kinne stellen wurde, en dit sil in oanfaller tastean om unkontroleare ferbining te meitsjen mei it netwurk en IT-boarnen fan 'e ûndernimming.
Dêrom is de needsaak foar it meitsjen fan betroubere VPN-netwurken foar bedriuwen no tanommen. Ik sil dy fertelle oer betrouber, feilich и ienfâldich by it brûken fan in VPN-netwurk.
It wurket neffens it IPsec / L2TP-skema, dy't net werom te heljen kaaien en sertifikaten brûkt dy't op tokens opslein binne om kliïnten te authentisearjen, en ek gegevens oer it netwurk yn fersifere foarm stjoert.
In tsjinner mei CentOS 7 (adres: centos.vpn.server.ad) en in kliïnt mei Ubuntu 20.04, en ek de kliïnt mei Windows 10.
Systeembeskriuwing
De VPN sil wurkje neffens it IPSec + L2TP + PPP-skema. Protokol Point-to-Point Protokol (PPP) wurket by de gegevenslinklaach fan it OSI-model en leveret brûkersautentikaasje en fersifering fan oerdroegen gegevens. Syn gegevens binne ynkapsele yn 'e gegevens fan it L2TP-protokol, dat eins soarget foar it meitsjen fan in ferbining yn it VPN-netwurk, mar gjin ferifikaasje en fersifering leveret.
L2TP-gegevens wurde ynkapsele yn IPSec, dy't ek ferifikaasje en fersifering leveret, mar yn tsjinstelling ta PPP, komt autentikaasje en fersifering op apparaatnivo, net op brûkernivo.
Dizze funksje lit jo brûkers allinich fan bepaalde apparaten ferifiearje. Wy sille it IPSec-protokol brûke sa't it is en tastean brûkersautentikaasje fan elk apparaat.

Brûkersautentikaasje mei smart cards sil wurde útfierd op it PPP-protokolnivo mei it EAP-TLS-protokol.
Mear detaillearre ynformaasje oer de wurking fan dit circuit is te finen yn .
Wêrom foldocht dit skema oan alle trije easken fan in goed VPN-netwurk?
- De betrouberens fan dit skema is troch de tiid hifke. It is sûnt 2000 brûkt om VPN-netwurken yn te setten.
- Feilige brûkersautentikaasje wurdt levere troch it PPP-protokol. jout net in foldwaande nivo fan feiligens, omdat Foar autentikaasje, yn it bêste gefal, wurdt autentikaasje mei in oanmelding en wachtwurd brûkt. Wy witte allegear dat in oanmeldwachtwurd kin wurde bispiede, rieden of stellen. Lykwols, foar in lange tiid no de ûntwikkelder в Dit protokol korrizjearre dit probleem en tafoege de mooglikheid om protokollen te brûken basearre op asymmetryske fersifering, lykas EAP-TLS, foar autentikaasje. Dêrneist foege hy de mooglikheid om smart cards te brûken foar autentikaasje, wat it systeem feiliger makke.
Op it stuit binne der aktive ûnderhannelings oan de gong om dizze twa projekten gear te foegjen en jo kinne der wis fan wêze dat dat ier of let dochs bart. Bygelyks, in patched ferzje fan PPP is in lange tiid yn 'e Fedora-repositories west, mei feilige protokollen foar autentikaasje. - Oant koartlyn koe dit netwurk allinich brûkt wurde troch brûkers Windows, mar ús kollega's fan 'e Steatsuniversiteit fan Moskou Vasily Shokov en Alexander Smirnov fûnen en feroare it. Tegearre reparearren wy in protte bugs en tekoartkommingen yn it wurk fan 'e kliïnt, ferienfâldige de ynstallaasje en konfiguraasje fan it systeem, sels by it bouwen fan boarne. De meast wichtige fan harren binne:
- Fêste kompatibiliteitsproblemen fan 'e âlde kliïnt mei de ynterface fan nije ferzjes fan openssl en qt.
- Pppd fuortsmiten fan it trochjaan fan de token-PIN troch in tydlik bestân.
- Ferkearde start fan it wachtwurdfersykprogramma reparearre fia de grafyske ynterface. Dit waard dien troch de juste omjouwing te ynstallearjen foar de xl2tpd-tsjinst.
- De bou fan 'e L2tpIpsecVpn-daemon wurdt no útfierd tegearre mei de bou fan 'e kliïnt sels, wat it bou- en konfiguraasjeproses ferienfâldiget.
- Foar it gemak fan ûntwikkeling is it Azure Pipelines-systeem ferbûn om de krektens fan 'e bou te testen.
- De mooglikheid tafoege om downgrade te twingen yn it ramt fan openssl. Dit is nuttich foar it korrekt stypjen fan nije bestjoeringssystemen wêr't it standert feiligensnivo is ynsteld op 2, mei VPN-netwurken dy't sertifikaten brûke dy't net foldogge oan de feiligenseasken fan dit nivo. Dizze opsje sil nuttich wêze foar wurkjen mei besteande âlde VPN-netwurken.
De korrizjearre ferzje is te finen yn .
Dizze kliïnt stipet it gebrûk fan smartkaarten foar autentikaasje, en ferberget ek safolle mooglik alle swierrichheden en ûntberingen fan it ynstellen fan dizze regeling ûnder Linux, wêrtroch't de kliïntynstelling sa ienfâldich en fluch mooglik is.
Fansels, foar in handige ferbining tusken PPP en de klant GUI, it wie net mooglik sûnder ekstra bewurkings oan elk fan de projekten, mar dochs binne se minimalisearre en redusearre ta in minimum:
- Fixed
- Fixed . Dizze flater liet ús neat laden fan it lokale /etc/ppp/openssl.cnf konfiguraasjetriem útsein ynformaasje oer openssl-motoren foar it wurkjen mei smart cards, wat in serieuze oerlêst wie as, bygelyks, neist ynformaasje oer motors, wy woenen hwat oars ynstelle. Befestigje bygelyks it feiligensnivo by it oprjochtsjen fan in ferbining.
No kinne jo begjinne mei it ynstellen.
Tsjinner Tuning
Litte wy alle nedige pakketten ynstallearje.
Ynstallaasje fan strongswan (IPsec)
Lit ús earst de firewall konfigurearje foar ipsec-operaasje
sudo firewall-cmd --permanent --add-port=1701/{tcp,udp}
sudo firewall-cmd --permanent --add-service=ipsec
sudo firewall-cmd --reload
Lit ús dan de ynstallaasje begjinne
sudo yum install epel-release ipsec-tools dnf
sudo dnf install strongswan
Nei ynstallaasje moatte jo strongswan konfigurearje (ien fan 'e IPSec-ymplemintaasjes). Om dit te dwaan, bewurkje de triem /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
Wy sille ek in mienskiplik oanmeldwachtwurd ynstelle. It dielde wachtwurd moat bekend wêze by alle netwurkdielnimmers foar autentikaasje. Dizze metoade is fansels net betrouber, omdat dit wachtwurd kin maklik bekend wurde oan persoanen oan wa't wy gjin tagong ta it netwurk jaan wolle.
Lykwols, sels dit feit sil gjin ynfloed op de feiligens fan it netwurk, omdat Basisgegevensfersifering en brûkersautentikaasje wurdt útfierd troch it PPP-protokol. Mar yn earlikens is it de muoite wurdich op te merken dat strongswan feiliger technologyen foar autentikaasje stipet, bygelyks mei help fan privee kaaien. Strongswan hat ek de mooglikheid om te foarsjen autentikaasje mei help fan smart cards, mar oant no ta mar in beheind oanbod fan apparaten wurde stipe en dêrom autentikaasje mei Rutoken tokens en smart cards is noch altyd lestich. Litte wy in algemien wachtwurd ynstelle fia triem /etc/strongswan/ipsec.secrets:
# ipsec.secrets - strongSwan IPsec secrets file
%any %any : PSK "SECRET_PASSPHRASE"
Litte wy strongswan opnij starte:
sudo systemctl enable strongswan
sudo systemctl restart strongswan
Ynstallearje xl2tp
sudo dnf install xl2tpd
Litte wy it konfigurearje fia bestân /etc/xl2tpd/xl2tpd.conf:
[global]
force userspace = yes
listen-addr = 0.0.0.0
ipsec saref = yes
[lns default]
exclusive = no
; определяет статический адрес сервера в виртуальной сети
local ip = 100.10.10.1
; задает диапазон виртуальных адресов
ip range = 100.10.10.1-100.10.10.254
assign ip = yes
refuse pap = yes
require authentication = yes
; данную опцию можно отключить после успешной настройки сети
ppp debug = yes
length bit = yes
pppoptfile = /etc/ppp/options.xl2tpd
; указывает адрес сервера в сети
name = centos.vpn.server.ad
Litte wy de tsjinst opnij starte:
sudo systemctl enable xl2tpd
sudo systemctl restart xl2tpd
PPP opset
It is oan te rieden om de lêste ferzje fan pppd te ynstallearjen. Om dit te dwaan, fiere de folgjende folchoarder fan kommando's út:
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
Skriuw nei triem /etc/ppp/options.xl2tpd de folgjende (as d'r wearden binne, kinne jo se wiskje):
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
Wy jouwe it root-sertifikaat en serversertifikaat út:
#директория с сертификатами пользователей, УЦ и сервера
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
Sa binne wy klear mei de basis tsjinner opset. De rest fan 'e serverkonfiguraasje omfettet it tafoegjen fan nije kliïnten.
In nije klant tafoegje
Om in nije kliïnt oan it netwurk ta te foegjen, moatte jo it sertifikaat tafoegje oan 'e list mei fertroude foar dizze kliïnt.
As in brûker lid wurde wol fan in VPN-netwurk, makket hy in kaaipaar en in sertifikaatapplikaasje foar dizze kliïnt. As de brûker fertroud is, dan kin dizze applikaasje wurde ûndertekene, en it resultearjende sertifikaat kin skreaun wurde nei de sertifikatenmap:
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
Litte wy in rigel tafoegje oan it /etc/ppp/eaptls-server-bestân om oerien te kommen mei de kliïntnamme en har sertifikaat:
"client" * /etc/ppp/certs/client.pem /etc/ppp/certs/server.pem /etc/ppp/certs/ca.pem /etc/ppp/keys/server.pem *
NOAT
Om betizing te foarkommen, is it better dat: Common Name, sertifikaattriemnamme en brûkersnamme unyk binne.
It is ek de muoite wurdich om te kontrolearjen dat de namme fan de brûker dy't wy tafoegje, nergens yn oare autentikaasjebestannen ferskynt, oars sille d'r problemen wêze mei de manier wêrop de brûker ferifiearre wurdt.
Itselde sertifikaat moat weromstjoerd wurde nei de brûker.
It generearjen fan in kaaipaar en sertifikaat
Foar suksesfolle autentikaasje moat de kliïnt:
- generearje in kaaipaar;
- hawwe in CA root sertifikaat;
- hawwe in sertifikaat foar jo kaaipaar tekene troch de root-CA.
foar de kliïnt op Linux
Litte wy earst in kaaipaar generearje op it token en in applikaasje meitsje foar it sertifikaat:
#идентификатор ключа (параметр --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"
Stjoer de client.req applikaasje dy't ferskynt nei de CA. Sadree't jo in sertifikaat foar jo kaaipaar ûntfange, skriuw it dan nei in token mei deselde id as de kaai:
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l -y cert -w ./client.pem --id 45
foar kliïnten Windows и Linux (in mear universele metoade)
Dizze metoade is universeler, om't it jo mooglik makket om in kaai en sertifikaat te generearjen dy't mei súkses troch brûkers erkend wurde sille. Windows и Linux, mar it fereasket it hawwen fan in auto Windows om de proseduere foar it generearjen fan kaaien út te fieren.
Foardat jo oanfragen generearje en sertifikaten ymportearje, moatte jo it root-sertifikaat fan it VPN-netwurk tafoegje oan 'e list mei fertroude. Om dit te dwaan, iepenje it en selektearje yn it finster dat iepent de opsje "Sertifikaat ynstallearje":

Selektearje yn it finster dat iepent it ynstallearjen fan in sertifikaat foar de lokale brûker:

Litte wy it sertifikaat ynstallearje yn 'e fertroude root-sertifikaatwinkel fan' e CA:

Nei al dizze aksjes binne wy it iens mei alle fierdere punten. It systeem is no konfigurearre.
Litte wy in bestân meitsje cert.tmp mei de folgjende ynhâld:
[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
Hjirnei sille wy in kaaipaar generearje en in applikaasje meitsje foar it sertifikaat. Om dit te dwaan, iepenje powershell en fier it folgjende kommando yn:
certreq.exe -new -pin $PIN .cert.tmp .client.req
Dien it generearre client.req-fersyk yn by jo CA en wachtsje oant it client.pem-sertifikaat oankomt. Jo kinne it nei in token skriuwe en it tafoegje oan jo sertifikaatopslach. Windows mei it folgjende kommando:
certreq.exe -accept .client.pem
It is de muoite wurdich op te merken dat ferlykbere aksjes kinne wurde reprodusearre mei de grafyske ynterface fan it mmc-programma, mar dizze metoade is mear tiidslinend en minder programmearber.
Client opset Ubuntu
NOAT
It ynstellen fan de kliïnt foar Linux Dit is op it stuit frij tiidslinend, om't it fereasket dat yndividuele programma's boud wurde moatte út boarnekoade. Wy sille derfoar soargje dat alle feroarings sa gau mooglik yn 'e offisjele repositories opnommen wurde.
Om ferbining op it IPSec-nivo mei de tsjinner te garandearjen, wurde it strongswan-pakket en de xl2tp-daemon brûkt. Om it ferbinen mei it netwurk te ferienfâldigjen mei smart cards, sille wy it l2tp-ipsec-vpn-pakket brûke, dat in grafyske shell leveret foar ferienfâldige ferbiningsopstelling.
Litte wy de eleminten stap foar stap begjinne te gearstallen, mar dêrfoar sille wy alle nedige pakketten ynstallearje foar de VPN om direkt te wurkjen:
sudo apt-get install xl2tpd strongswan libp11-3
Ynstallearje software foar wurkjen mei tokens
Ynstallearje de lêste librtpkcs11ecp.so bibleteek fan , ek biblioteken foar wurkjen mei smart cards:
sudo apt-get install pcscd pcsc-tools opensc libengine-pkcs11-openssl
Ferbine Rutoken en kontrolearje dat it wurdt werkend troch it systeem:
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O -l
Ynstallaasje fan patched 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
It ynstallearjen fan de L2tpIpsecVpn-kliïnt
Op it stuit moat de kliïnt ek kompilearre wurde út boarnekoade. Dit wurdt dien mei de folgjende folchoarder fan kommando's:
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
It ynstellen fan de L2tpIpsecVpn-kliïnt
Starte de ynstalleare client:

Nei lansearring moat de L2tpIpsecVPN-applet iepenje. Rjochtsklik derop en konfigurearje de ferbining:

Om mei tokens te wurkjen, jouwe wy earst it paad oan nei de opensc-motor fan 'e OpenSSL-motor en de PKCS#11-bibleteek. Om dit te dwaan, iepenje de "Foarkarren" ljepper om openssl parameters te konfigurearjen:
.
Litte wy it OpenSSL-ynstellingsfinster slute en trochgean mei it ynstellen fan it netwurk. Litte wy in nij netwurk tafoegje troch te klikken op de knop taheakje ... yn it ynstellingspaniel en de netwurknamme ynfiere:

Hjirnei sil dit netwurk beskikber wêze yn it ynstellingspaniel. Dûbel-rjochts-klikke op it nije netwurk om it te konfigurearjen. Op it earste ljepblêd moatte jo IPsec-ynstellingen meitsje. Litte wy it serveradres en de iepenbiere kaai ynstelle:

Gean dan nei it ljepblêd PPP-ynstellingen en jouwe dêr de brûkersnamme oan wêrop wy tagong wolle ta it netwurk:

Hjirnei iepenje de ljepper Eigenskippen en spesifisearje it paad nei de kaai, kliïntsertifikaat en CA:

Litte wy dit ljepblêd slute en de lêste ynstellings útfiere; om dit te dwaan, iepenje it ljepblêd "IP-ynstellings" en selektearje it fakje neist de opsje "DNS-tsjinneradres automatysk krije":

Dizze opsje lit de kliïnt in persoanlik IP-adres binnen it netwurk ûntfange fan 'e tsjinner.
Nei alle ynstellings slute alle ljeppers en starte de kliïnt opnij:

Netwurk ferbining
Nei de ynstellings kinne jo ferbine mei it netwurk. Om dit te dwaan, iepenje de applet-ljepper en selektearje it netwurk wêrmei wy wolle ferbine:

Tidens it proses foar it oprjochtsjen fan ferbining sil de kliïnt ús freegje om de Rutoken PIN-koade yn te fieren:

As in notifikaasje ferskynt yn 'e statusbalke dat de ferbining mei súkses is makke, betsjut dit dat de opset suksesfol wie:

Oars, it is de muoite wurdich út te finen wêrom't de ferbining waard net oprjochte. Om dit te dwaan, moatte jo it programmalog besjen troch it kommando "Ferbiningsynformaasje" te selektearjen yn 'e applet:

Client opset Windows
It ynstellen fan de kliïnt yn Windows wurdt folle makliker útfierd as yn Linux, om't alle nedige software al yn it systeem ynboud is.
Systeem opset
Wy sille alle nedige stjoerprogramma's ynstalleare foar wurkjen mei Rutokens troch se te downloaden fan .
It ymportearjen fan in root-sertifikaat foar autentikaasje
Download it tsjinner root-sertifikaat en ynstallearje it op it systeem. Om dit te dwaan, iepenje it en selektearje yn it finster dat iepent de opsje "Sertifikaat ynstallearje":

Selektearje yn it finster dat iepenet it ynstallearjen fan in sertifikaat foar de lokale brûker. As jo wolle dat it sertifikaat beskikber is foar alle brûkers op 'e kompjûter, dan moatte jo kieze om it sertifikaat te ynstallearjen op' e lokale kompjûter:

Litte wy it sertifikaat ynstallearje yn 'e fertroude root-sertifikaatwinkel fan' e CA:

Nei al dizze aksjes binne wy it iens mei alle fierdere punten. It systeem is no konfigurearre.
In VPN-ferbining ynstelle
Om in VPN-ferbining yn te stellen, gean nei it kontrôlepaniel en selektearje de opsje om in nije ferbining te meitsjen.

Selektearje yn it pop-upfinster de opsje om in ferbining te meitsjen om te ferbinen mei jo wurkplak:

Selektearje yn it folgjende finster in VPN-ferbining:

en fier de VPN-ferbiningsdetails yn, en spesifisearje ek de opsje om in smart card te brûken:

De opset is noch net kompleet. Alles wat oerbliuwt is de dielde kaai foar it IPsec-protokol op te jaan; om dit te dwaan, gean nei it ljepblêd "Netwurkferbiningynstellingen" en gean dan nei it ljepblêd "Eigenskippen foar dizze ferbining":

Gean yn it finster dat iepent nei de ljepper "Feiligens", spesifisearje "L2TP/IPsec Network" as it netwurktype en selektearje "Avansearre ynstellings":

Spesifisearje yn it finster dat iepent de dielde IPsec-kaai:

Konnektiviteit
Nei it foltôgjen fan de opset, kinne jo besykje te ferbinen mei it netwurk:

Tidens it ferbiningsproses sille wy de token PIN-koade moatte ynfiere:

Wy hawwe in feilich VPN-netwurk ynsteld en derfoar soarge dat it net dreech is.
Erkennings
Ik wol ús kollega's Vasily Shokov en Alexander Smirnov nochris betankje foar harren mienskiplike wurk om it meitsjen fan VPN-ferbiningen foar kliïnten te ferienfâldigjen. Linux.
Boarne: www.habr.com
