
Problematica
Fino a poco tempo fa, molti non sapevano cosa significasse lavorare da casa. La pandemia ha cambiato bruscamente la situazione nel mondo, tutti hanno iniziato ad adattarsi alle circostanze, in particolare al fatto che uscire di casa era diventato pericoloso. E molti hanno dovuto organizzarsi rapidamente per lavorare da casa per i propri dipendenti.
Tuttavia, l'assenza di un approccio competente nella scelta delle soluzioni per il lavoro remoto può portare a perdite irreversibili. Le password degli utenti possono essere rubate, dando così la possibilità a un malintenzionato di connettersi senza controllo alla rete e alle risorse IT dell'azienda.
Ecco perché è aumentata la necessità di creare reti VPN aziendali affidabili. Vi parlerò di un'affidabile, sicura e e semplice rete VPN da usare.
Funziona secondo lo schema IPsec/L2TP, utilizzando chiavi e certificati non estraibili per l'autenticazione dei clienti, memorizzati su token, e trasmette i dati attraverso la rete in forma crittografata.
Per la configurazione sono stati utilizzati un server con CentOS 7 (indirizzo: centos.vpn.server.ad) e un client con Ubuntu 20.04, oltre a un client con Windows 10.
Descrizione del sistema
La VPN funzionerà secondo lo schema IPSec + L2TP + PPP. Il protocollo Point-to-Point Protocol (PPP) opera al livello di collegamento del modello OSI e assicura l'autenticazione dell'utente e la crittografia dei dati trasmessi. I suoi dati sono incapsulati nei dati del protocollo L2TP, che effettivamente stabilisce la connessione nella rete VPN, ma non fornisce autenticazione e crittografia.
I dati L2TP sono incapsulati nel protocollo IPSec, che offre anche autenticazione e crittografia, ma a differenza del protocollo PPP, l'autenticazione e la crittografia avvengono a livello dei dispositivi e non a livello degli utenti.
Questa caratteristica consente di autenticare gli utenti solo da determinati dispositivi. Utilizzeremo il protocollo IPSec in modo tale da consentire l'autenticazione degli utenti da qualsiasi dispositivo.

L'autenticazione dell'utente tramite smart card avverrà a livello del protocollo PPP utilizzando il protocollo EAP-TLS.
Magiori informazioni sul funzionamento di questo schema possono essere trovate in .
Perché questo schema soddisfa tutti e tre i requisiti di una buona rete VPN
- L'affidabilità di questo schema è stata comprovata nel tempo. Viene utilizzato per il dispiegamento di reti VPN dal 2000.
- L'autenticazione sicura degli utenti è garantita dal protocollo PPP. non garantisce un livello di sicurezza adeguato, poiché per l'autenticazione viene utilizzata al massimo l'autenticazione tramite nome utente e password. Tutti sappiamo che è possibile spiare, indovinare o rubare un nome utente e una password. Tuttavia, è già da tempo che lo sviluppatore in di questo protocollo ha corretto questo aspetto e ha aggiunto la possibilità di utilizzare protocolli per l'autenticazione basati su crittografia asimmetrica, come EAP-TLS. Inoltre, ha aggiunto la possibilità di utilizzare smart card per l'autenticazione, rendendo questo sistema più sicuro.
Attualmente sono in corso attive negoziazioni per la fusione di questi due progetti e si può essere certi che prima o poi ciò avverrà. Ad esempio, nei repository di Fedora esiste da tempo una versione patchata di PPP, che utilizza protocolli sicuri per l'autenticazione. - Fino a poco tempo fa, questa rete poteva essere utilizzata solo dagli utenti Windows, ma i nostri colleghi dell'MGU, Vasily Shokov e Alexander Smirnov, hanno trovato e lo hanno aggiornato. Grazie agli sforzi congiunti, abbiamo corretto molti bug e imperfezioni nel funzionamento del client, semplificato l'installazione e la configurazione del sistema, anche durante la compilazione dai sorgenti. Le modifiche più significative includono:
- Correzione dei problemi di compatibilità del vecchio client con le interfacce delle nuove versioni di openssl e qt.
- Rimozione della trasmissione del codice PIN del token pppd tramite file temporanei.
- Corretto l'avvio errato del programma di richieste di password attraverso l'interfaccia grafica. Questo è stato fatto impostando l'ambiente corretto per il servizio xl2tpd.
- La compilazione del demone L2tpIpsecVpn ora avviene insieme alla compilazione del client stesso, facilitando il processo di compilazione e configurazione.
- Per comodità di sviluppo, è stato implementato il sistema Azure Pipelines per testare la correttezza della compilazione.
- Aggiunta la possibilità di forzare l'abbassamento Nel contesto di openssl. Questo è utile per una corretta compatibilità con i nuovi sistemi operativi, dove il livello di sicurezza standard è impostato su 2, con reti VPN che utilizzano certificati che non soddisfano i requisiti di sicurezza di questo livello. Questa opzione sarà utile per operare con reti VPN obsolete esistenti.
La versione corretta può essere trovata in .
Questo client supporta l'uso di smart card per l'autenticazione, oltre a mascherare al massimo tutte le complessità e le difficoltà di configurazione di tale schema su Linux, rendendo la configurazione del client il più semplice e veloce possibile.
Naturalmente, per una comunicazione agevole tra PPP e il client GUI sono state necessarie ulteriori modifiche a ciascuno dei progetti, tuttavia, sono state comunque minimizzate al massimo:
- Corretto
- Corretto . Questo errore impediva di caricare dal file locale /etc/ppp/openssl.cnf nulla, tranne le informazioni sui motori openssl per lavorare con le smart card, che rappresentava un serio inconveniente, se ad esempio, oltre alle informazioni sui motori, volevamo impostare qualcos'altro. Ad esempio, fissare il livello di sicurezza durante l'instaurazione della connessione.
Ora possiamo procedere alla configurazione.
Configurazione del server
Installeremo tutti i pacchetti necessari.
Installazione di strongswan (IPsec)
Per prima cosa, configureremo il firewall per lavorare con ipsec
sudo firewall-cmd --permanent --add-port=1701/{tcp,udp}
sudo firewall-cmd --permanent --add-service=ipsec
sudo firewall-cmd --reloadPoi procederemo con l'installazione
sudo yum install epel-release ipsec-tools dnf
sudo dnf install strongswanDopo l'installazione è necessario impostare la configurazione per strongswan (una delle implementazioni di IPSec). Per fare ciò, modificheremo il file /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-modp1024Impostiamo anche una password comune per l'accesso. Questa password deve essere nota a tutti i partecipanti della rete per l'autenticazione. Questo metodo è intrinsecamente poco sicuro, poiché la password può facilmente diventare nota a persone a cui non vogliamo concedere l'accesso alla rete.
Tuttavia, anche questo fatto non influirà sulla sicurezza dell'organizzazione della rete, poiché la crittografia principale dei dati e l'autenticazione degli utenti sono gestite dal protocollo PPP. È giusto notare che strongswan supporta tecnologie di autenticazione più sicure, ad esempio tramite chiavi private. Inoltre, strongswan offre la possibilità di garantire l'autenticazione tramite smart card, ma attualmente supporta solo un numero limitato di dispositivi, rendendo quindi difficoltosa l'autenticazione con token e smart card Rutoken. Impostiamo una password comune tramite un file. /etc/strongswan/ipsec.secrets:
# ipsec.secrets - strongSwan IPsec secrets file
%any %any : PSK "SECRET_PASSPHRASE"Riavviamo strongswan:
sudo systemctl enable strongswan
sudo systemctl restart strongswanInstallazione di xl2tp
sudo dnf install xl2tpdConfiguriamolo tramite un file /etc/xl2tpd/xl2tpd.conf:
[global]
force userspace = yes
listen-addr = 0.0.0.0
ipsec saref = yes
[lns default]
exclusive = no
; definisce l'indirizzo statico del server nella rete virtuale
local ip = 100.10.10.1
; definisce l'intervallo degli indirizzi virtuali
ip range = 100.10.10.1-100.10.10.254
assign ip = yes
refuse pap = yes
require authentication = yes
; questa opzione può essere disattivata dopo una configurazione corretta della rete
ppp debug = yes
length bit = yes
pppoptfile = /etc/ppp/options.xl2tpd
; indica l'indirizzo del server nella rete
name = centos.vpn.server.adRiavviamo il servizio:
sudo systemctl enable xl2tpd
sudo systemctl restart xl2tpdConfigurazione PPP
È consigliabile installare l'ultima versione di pppd. Per fare ciò, eseguiamo la seguente sequenza di comandi:
sudo yum install git make gcc openssl-devel
git clone "https://github.com/jjkeijser/ppp"
cd ppp
./configure --prefix /usr
make -j4
sudo make installScrivi nel file /etc/ppp/options.xl2tpd la seguente (se ci sono già valori presenti, possono essere rimossi):
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 5000Annotiamo il certificato radice e il certificato del server:
#директория с сертификатами пользователей, УЦ и сервера
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 -CAcreateserialIn questo modo, abbiamo completato la configurazione principale del server. Il resto della configurazione del server riguarda l'aggiunta di nuovi clienti.
Aggiunta di un nuovo cliente
Per aggiungere un nuovo cliente alla rete, è necessario registrare il suo certificato nell'elenco dei fidati per questo cliente.
Se un utente vuole diventare parte di una rete VPN, crea una coppia di chiavi e una richiesta di certificato per questo cliente. Se l'utente è fidato, è possibile firmare questa richiesta e registrare il certificato risultante nella directory dei certificati:
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 -CAcreateserialAggiungiamo una riga al file /etc/ppp/eaptls-server per abbinare il nome del cliente e il suo certificato:
"client" * /etc/ppp/certs/client.pem /etc/ppp/certs/server.pem /etc/ppp/certs/ca.pem /etc/ppp/keys/server.pem *NOTA
Per non confondersi, è meglio che: il Common Name, il nome del file del certificato e il nome utente siano unici.
È anche importante verificare che in altri file di autenticazione non figuri il nome utente che stiamo aggiungendo, altrimenti si presenteranno problemi con il metodo di autenticazione dell'utente.
Questo stesso certificato deve essere inviato di nuovo all'utente.
Generazione della coppia di chiavi e del certificato
Per una corretta autenticazione, il cliente deve:
- generare una coppia di chiavi;
- disporre di un certificato root dell'Autorità di Certificazione (CA);
- disporre di un certificato per la propria coppia di chiavi, firmato dalla CA root.
per il cliente su Linux
Iniziamo generando una coppia di chiavi su un token e creando una richiesta di certificato:
#идентификатор ключа (параметр --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"Invia la richiesta client.req all'Autorità di Certificazione. Dopo aver ricevuto il certificato per la tua coppia di chiavi, scrivilo sul token con lo stesso id della chiave:
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l -y cert -w ./client.pem --id 45per i clienti Windows e Linux (metodo più universale)
Questo metodo è più universale poiché consente di generare una chiave e un certificato riconosciuti dagli utenti di Windows e Linux, ma richiede una macchina Windows per il processo di generazione delle chiavi.
Prima di generare le richieste e importare i certificati, è necessario aggiungere il certificato root della rete VPN all'elenco dei certificati fidati. Per farlo, apriamolo e nella finestra che appare selezioniamo l'opzione "Installa certificato":

Nella finestra che si apre, scegliamo di installare il certificato per l'utente locale:

Installa il certificato nel negozio dei certificati radice fidati della CA:

Dopo tutte queste operazioni, accettiamo tutte le ulteriori indicazioni. Ora il sistema è configurato.
Creiamo il file cert.tmp con il seguente contenuto:
[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 = FALSESuccessivamente genereremo una coppia di chiavi e creeremo una richiesta di certificato. Per fare ciò apriremo PowerShell e inseriremo il seguente comando:
certreq.exe -new -pin $PIN .cert.tmp .client.reqInvia la richiesta client.req creata al tuo CA e attendi di ricevere il certificato client.pem. Può essere scritto su un token e aggiunto al repository di certificati di Windows con il seguente comando:
certreq.exe -accept .client.pemVale la pena notare che azioni analoghe possono essere riprodotte tramite l'interfaccia grafica del programma mmc, ma questo metodo è più dispendioso in termini di tempo e meno programmabile.
Configurazione del client Ubuntu
NOTA
Attualmente la configurazione del client su Linux richiede un tempo significativo, poiché richiede la compilazione di singoli programmi dai sorgenti. Cercheremo di far sì che tutte le modifiche vengano incluse nei repository ufficiali nel più breve tempo possibile.
Per garantire la connettività a livello IPSec al server, si utilizza il pacchetto strongswan e il demone xl2tp. Per semplificare la connessione alla rete tramite smart card, utilizzeremo il pacchetto l2tp-ipsec-vpn, che fornisce un'interfaccia grafica per una configurazione semplificata della connessione.
Iniziamo a montare gli elementi passo dopo passo, ma prima installiamo tutti i pacchetti necessari per il funzionamento diretto del VPN:
sudo apt-get install xl2tpd strongswan libp11-3Installazione del software per lavorare con i token
Installa l'ultima versione della libreria librtpkcs11ecp.so con , oltre alle librerie per lavorare con le smart card:
sudo apt-get install pcscd pcsc-tools opensc libengine-pkcs11-opensslCollegare il RuToken e verificare che venga riconosciuto dal sistema:
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O -lInstallazione di ppp patchato
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 installInstallazione del client L2tpIpsecVpn
Attualmente il client deve essere compilato anche dai sorgenti. Questo avviene con la seguente sequenza di comandi:
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 installConfigurazione del client L2tpIpsecVpn
Avviamo il client installato:

Dopo aver avviato, dovrebbe aprirsi l'applet L2tpIpsecVPN. Facciamo clic destro su di essa e procediamo con la configurazione della connessione:

Per lavorare con i token, innanzitutto specifichiamo il percorso del motore opensc di OpenSSL e della libreria PKCS#11. A tal fine, aprire la scheda "Preferenze" per configurare i parametri di openssl:
.
Chiudiamo la finestra delle impostazioni di OpenSSL e passiamo alla configurazione della rete. Aggiungiamo una nuova rete cliccando sul pulsante Add… nel pannello delle impostazioni e inseriamo il nome della rete:

Dopo questo, la rete diventerà disponibile nel pannello delle impostazioni. Facciamo doppio click con il tasto destro sulla nuova rete per configurararla. Nella prima scheda è necessario configurare le impostazioni IPsec. Indichiamo l'indirizzo del server e la chiave condivisa:

Dopo di ciò, passiamo alla scheda delle impostazioni PPP e indichiamo lì il nome utente con cui vogliamo accedere alla rete:

Dopo di questo, apriamo la scheda Proprietà e indichiamo il percorso per la chiave, il certificato del cliente e l'CA:

Chiudiamo questa scheda e completiamo la configurazione finale, per questo apriamo la scheda "Impostazioni IP" e selezioniamo l'opzione "Ottieni automaticamente l'indirizzo del server DNS":

Questa opzione consentirà al cliente di ricevere un indirizzo IP personale dal server all'interno della rete.
Dopo tutte le impostazioni, chiudiamo tutte le schede e riavviamo il cliente:

Connessione a una rete
Dopo le impostazioni, possiamo connetterci alla rete. Per fare ciò, apriamo la scheda dell'applet e scegliamo la rete a cui vogliamo connetterci:

Durante il processo di connessione, il cliente chiederà di inserire il codice PIN del RUTOKEN:

Se nella barra di stato appare una notifica che indica che la connessione è stata stabilita con successo, significa che la configurazione è stata effettuata correttamente:

In caso contrario, vale la pena capire perché la connessione non è stata stabilita. Per questo, è consigliabile controllare il log del programma, selezionando nel widget il comando "Informazioni sulla connessione":

Configurazione del cliente Windows
La configurazione del cliente in Windows è molto più semplice rispetto a Linux, poiché tutto il software necessario è già integrato nel sistema.
Impostazione del sistema
Installeremo tutti i driver necessari per lavorare con i RUTOKEN scaricandoli da .
Importazione del certificato radice per l'autenticazione
Scarichiamo il certificato radice del server e lo installiamo nel sistema. Per fare ciò, apriamolo e nella finestra che si apre selezioniamo l'opzione "Installa certificato":

Nella finestra aperta, selezioniamo l'installazione del certificato per l'utente locale. Se desideriamo che il certificato sia accessibile a tutti gli utenti del computer, allora dobbiamo scegliere l'installazione del certificato sul computer locale:

Installa il certificato nel negozio dei certificati radice fidati della CA:

Dopo tutte queste operazioni, accettiamo tutte le ulteriori indicazioni. Ora il sistema è configurato.
Configurazione della connessione VPN
Per configurare una connessione VPN, accedi al pannello di controllo e seleziona l'opzione per creare una nuova connessione.

Nella finestra popup, seleziona l'opzione per creare una connessione per collegarti al posto di lavoro:

Nella finestra successiva, seleziona la connessione VPN:

e inserisci i dati della connessione VPN, specificando anche l'opzione per utilizzare la smart card:

A questo punto, la configurazione non è completa. È necessario specificare la chiave condivisa per il protocollo IPsec, quindi andiamo alla scheda 'Impostazioni connessioni di rete' e poi sulla scheda 'Proprietà per questa connessione':

Nella finestra che si apre, vai alla scheda "Sicurezza", imposta come tipo di rete "Rete L2TP/IPsec" e seleziona "Opzioni avanzate":

Nella finestra che si apre, inserisci la chiave condivisa IPsec:

Collegamento
Dopo aver completato la configurazione, puoi provare a connetterti alla rete:

Durante il processo di connessione, ti verrà richiesto di inserire il codice PIN del token:

Abbiamo configurato una rete VPN sicura e ci siamo assicurati che non sia difficile.
Ringraziamenti
Desidero ringraziare ancora una volta i nostri colleghi Vasily Shokov e Alexander Smirnov per il lavoro svolto insieme per semplificare la creazione di connessioni VPN per i clienti Linux.
Fonte: habr.com
