
Problematiche
Fino a poco tempo fa, molti non sapevano cosa significasse lavorare da casa. La pandemia ha cambiato bruscamente la situazione nel mondo; tutti hanno dovuto adattarsi alle circostanze, in particolare al fatto che uscire di casa è diventato semplicemente pericoloso. Molti hanno dovuto organizzare rapidamente il lavoro da casa per i propri dipendenti.
Tuttavia, la mancanza di un approccio adeguato nella scelta delle soluzioni per il lavoro remoto può portare a perdite irreversibili. Le password degli utenti possono essere rubate, consentendo agli intrusi di connettersi senza controllo alla rete e alle risorse IT dell'azienda.
È proprio per questo motivo che è cresciuta la necessità di creare reti VPN aziendali affidabili. Vi parlerò di una affidabile, sicura e semplice rete VPN da utilizzare.
Funziona secondo lo schema IPsec/L2TP, che utilizza chiavi e certificati non estraibili per l'autenticazione dei client, memorizzati nei token, e trasmette i dati attraverso la rete in forma crittografata.
Per i banchi di prova 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 Protocollo Point-to-Point (PPP) opera a livello di collegamento del modello OSI e fornisce autenticazione dell'utente e crittografia dei dati trasmessi. I suoi dati vengono incapsulati nei dati del protocollo L2TP, il quale crea effettivamente la connessione nella rete VPN, ma non fornisce autenticazione e crittografia.
I dati L2TP vengono incapsulati nel protocollo IPSec, che fornisce anch'esso autenticazione e crittografia, ma a differenza del protocollo PPP, l'autenticazione e la crittografia avvengono a livello di dispositivi, e non a livello di utenti.
Questa caratteristica consente di garantire l'autenticazione degli utenti solo da determinati dispositivi. Noi utilizzeremo il protocollo IPSec in tal senso e permetteremo di autenticare gli utenti da qualsiasi dispositivo.

L'autenticazione dell'utente tramite smart card avverrà a livello del protocollo PPP utilizzando il protocollo EAP-TLS.
Puoi trovare ulteriori informazioni sul funzionamento di questo schema in .
Perché questo schema soddisfa tutti e tre i requisiti di una buona rete VPN
- L'affidabilità di questo schema è stata testata nel tempo. È utilizzato per l'implementazione di reti VPN dal 2000.
- Il protocollo PPP garantisce un'autenticazione sicura dell'utente. non offre un livello di sicurezza sufficiente, poiché per l'autenticazione si basa, nella migliore delle ipotesi, su username e password. Tutti sappiamo che username e password possono essere osservati, indovinati o rubati. Tuttavia, il suo sviluppatore in di questo protocollo ha corretto questo aspetto e ha aggiunto la possibilità di utilizzare protocolli basati su crittografia asimmetrica per l'autenticazione, come EAP-TLS. Inoltre, ha introdotto la possibilità di utilizzare smart card per l'autenticazione, rendendo così questo sistema più sicuro.
Attualmente sono in corso attive trattative per la fusione di questi due progetti e si può essere certi che, prima o poi, questo avverrà. Ad esempio, nei repository di Fedora esiste già 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 di Windows, ma i nostri colleghi dell'MGU, Vasily Shokov e Alexander Smirnov, hanno trovato e lo hanno sviluppato ulteriormente. Grazie agli sforzi congiunti, abbiamo risolto numerosi bug e imperfezioni nel funzionamento del client, semplificando l'installazione e la configurazione del sistema, anche durante la compilazione dai sorgenti. Le modifiche più significative includono:
- Risolti i problemi di compatibilità del vecchio client con l'interfaccia delle nuove versioni di openssl e qt.
- Rimossa la trasmissione del codice PIN pppd del token tramite file temporaneo.
- Corretto l'avvio errato del programma di richiesta della password tramite interfaccia grafica, grazie all'installazione di un ambiente corretto per il servizio xl2tpd.
- La costruzione del demone L2tpIpsecVpn ora avviene insieme alla costruzione del client stesso, semplificando il processo di assemblaggio e configurazione.
- Per facilitare lo sviluppo, è stato integrato Azure Pipelines per testare la correttezza della costruzione.
- È stata aggiunta la possibilità di ridurre forzatamente nel contesto di openssl. Questo è utile per supportare correttamente i nuovi sistemi operativi, dove il livello di sicurezza standard è impostato su 2, con reti VPN che utilizzano certificati non conformi ai requisiti di sicurezza di questo livello. Questa opzione sarà utile per lavorare con reti VPN esistenti e obsolete.
La versione corretta può essere trovata nel .
Questo client supporta l'uso di smart card per l'autenticazione e nasconde il più possibile tutte le difficoltà e i problemi legati alla configurazione di questo schema su Linux, rendendo la configurazione del client il più semplice e rapida possibile.
Certo, per garantire una comunicazione fluida tra PPP e il client GUI, sono stati necessari ulteriori aggiustamenti per ciascun progetto, ma sono stati comunque ridotti al minimo:
- Risolta
- Risolta . Questo errore impediva di caricare dal file di configurazione locale /etc/ppp/openssl.cnf nulla oltre alle informazioni sui motori openssl per lavorare con le smart card, causando notevoli inconvenienti, ad esempio, se oltre alle informazioni sui motori volevamo impostare qualcos'altro. Ad esempio, fissare il livello di sicurezza durante l'installazione della connessione.
Ora si può procedere con la configurazione.
Configurazione del server
Installa tutti i pacchetti necessari.
Installazione di strongswan (IPsec)
Per prima cosa, configuriamo il firewall per il funzionamento di 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 IPSec). Per fare questo, modifichiamo il file /etc/strongswan/ipsec.conf :
configurazione 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-modp1024Imposteremo anche una password comune per l'accesso. La password comune deve essere conosciuta da tutti i membri della rete per l'autenticazione. Questo metodo è intrinsecamente poco sicuro, poiché la password può facilmente diventare nota a persone a cui non vogliamo fornire l'accesso alla rete.
Tuttavia, questo fatto non influirà sulla sicurezza della rete, poiché la crittografia dei dati e l'autenticazione degli utenti sono gestite dal protocollo PPP. È giusto notare che strongswan supporta tecnologie di autenticazione più sicure, ad esempio utilizzando chiavi private. Inoltre, strongswan offre la possibilità di garantire l'autenticazione tramite smart card, ma al momento supporta solo un numero limitato di dispositivi, rendendo quindi difficile l'autenticazione tramite token e smart card Rutoken. Impostiamo una password generale tramite file. /etc/strongswan/ipsec.secrets:
# ipsec.secrets - strongSwan IPsec secrets file
%any %any : PSK "SECRET_PASSPHRASE"Ripartiamo strongswan:
sudo systemctl enable strongswan
sudo systemctl restart strongswanInstallazione di xl2tp
sudo dnf install xl2tpdConfiguriamolo tramite 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
; imposta il raggio 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 disabilitata dopo una configurazione di rete riuscita
ppp debug = yes
length bit = yes
pppoptfile = /etc/ppp/options.xl2tpd
; indica l'indirizzo del server nella rete
name = centos.vpn.server.adRipartiamo il servizio:
sudo systemctl enable xl2tpd
sudo systemctl restart xl2tpdConfigurazione PPP
È consigliabile installare l'ultima versione di pppd. Per fare ciò, eseguiamo la seguente serie 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 installInserisci nel file /etc/ppp/options.xl2tpd quanto segue (se ci sono già dei valori, 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 root 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 di fiducia per questo cliente.
Se un utente desidera diventare membro della rete VPN, deve creare una coppia di chiavi e una richiesta di certificato per questo cliente. Se l'utente è fidato, la richiesta può essere firmata e il certificato risultante deve essere registrato 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 nel file /etc/ppp/eaptls-server per associare 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 evitare confusione, è 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 compaia da nessuna parte il nome dell'utente che stiamo aggiungendo, altrimenti si riscontreranno problemi con il metodo di autenticazione.
Questo stesso certificato deve essere restituito all'utente.
Generazione della coppia di chiavi e certificato
Per una corretta autenticazione, il cliente deve:
- generare una coppia di chiavi;
- disporre di un certificato radice dell'Autorità di Certificazione;
- avere un certificato per la propria coppia di chiavi, firmato dall'Autorità di Certificazione radice.
per il cliente su Linux
Per prima cosa, generiamo una coppia di chiavi sul token e creiamo 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, registralo sul token con lo stesso id del 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 che saranno riconosciuti con successo dagli utenti Windows e Linux, ma richiede una macchina Windows per eseguire la procedura di generazione delle chiavi.
Prima di generare richieste e importare certificati, è necessario aggiungere il certificato radice della rete VPN all'elenco dei certificati attendibili. Per fare questo, apriamo il certificato e nella finestra che si apre selezioniamo l'opzione "Installa certificato":

Nella finestra aperta, selezioniamo l'installazione del certificato per l'utente locale:

Installeremo il certificato nel deposito dei certificati radice affidabili dell'Autorità di Certificazione:

Dopo tutte queste operazioni, accettiamo tutti i successivi punti. Ora il sistema è configurato.
Creeremo un 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 = FALSEDopo di ciò, genereremo un paio di chiavi e creeremo una richiesta di certificato. Per fare questo, apriamo powershell e immettiamo il seguente comando:
certreq.exe -new -pin $PIN .cert.tmp .client.reqInvia la richiesta creata client.req al tuo CA e attendi di ricevere il certificato client.pem. Può essere registrato su un token e aggiunto al repository certificati di Windows utilizzando il seguente comando:
certreq.exe -accept .client.pemVa notato che azioni simili possono essere eseguite 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 considerevole, poiché è necessario compilare singoli programmi dai sorgenti. Ci impegneremo a garantire che tutte le modifiche vengano incluse nei repository ufficiali al più presto.
Per garantire la connessione a livello IPSec al server, viene utilizzato 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 semplificare la configurazione della connessione.
Iniziamo a montare gli elementi passo dopo passo, ma prima installeremo tutti i pacchetti necessari per il corretto funzionamento 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 , insieme alle librerie per lavorare con le smart card:
sudo apt-get install pcscd pcsc-tools opensc libengine-pkcs11-opensslCollega il Rutoken e verifica che venga riconosciuto dal sistema:
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O -lInstallazione del 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 anche il client deve essere compilato dai sorgenti. Questo si fa 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 l'avvio dovrebbe aprirsi l'applet L2tpIpsecVPN. Clicca con il tasto destro su di essa e configura la connessione:

Per lavorare con i token, in primo luogo, specifichiamo il percorso del motore opensc di OpenSSL e della libreria PKCS#11. Per fare ciò, apri la scheda "Preferenze" per configurare i parametri di openssl:
.
Chiudi la finestra delle impostazioni di OpenSSL e procedi alla configurazione della rete. Aggiungi una nuova rete cliccando sul tasto Aggiungi… nel pannello delle impostazioni e inserisci il nome della rete:

Dopo di ciò, questa rete sarà disponibile nel pannello delle impostazioni. Faremo doppio clic con il tasto destro del mouse sulla nuova rete per configurarla. Nella prima scheda, dobbiamo eseguire le impostazioni IPsec. Imposteremo l'indirizzo del server e la chiave condivisa:

Dopo di ciò, passiamo alla scheda delle impostazioni PPP e qui indicheremo il nome utente con cui desideriamo accedere alla rete:

Dopo di ciò, apriremo la scheda Proprietà e specificheremo il percorso della chiave, del certificato del client e dell'CA:

Chiuderemo questa scheda e faremo l'ultima configurazione, per questo apriremo la scheda "Impostazioni IP" e metteremo il segno di spunta accanto all'opzione "Ottieni automaticamente l'indirizzo del server DNS":

Questa opzione consentirà al client di ricevere un indirizzo IP privato dal server all'interno della rete.
Dopo tutte le impostazioni, chiuderemo tutte le schede e riavvieremo il client:

Connessione alla rete
Dopo aver configurato, possiamo connetterci alla rete. Per fare ciò, apriremo la scheda dell'applet e selezioneremo la rete a cui vogliamo connetterci:

Durante l'installazione della connessione, il client chiederà di inserire il 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 eseguita correttamente:

In caso contrario, è importante capire perché la connessione non è stata stabilita. Per fare ciò, controlla il log del programma selezionando nel pannello l'opzione "Informazioni sulla connessione":

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

Nella finestra che si apre, selezioneremo l'installazione del certificato per l'utente locale. Se desideri che il certificato sia accessibile a tutti gli utenti del computer, dovresti scegliere di installare il certificato sul computer locale:

Installeremo il certificato nel deposito dei certificati radice affidabili dell'Autorità di Certificazione:

Dopo tutte queste operazioni, accettiamo tutti i successivi punti. Ora il sistema è configurato.
Configurazione della connessione VPN
Per configurare la connessione VPN, vai al pannello di controllo e seleziona l'opzione per creare una nuova connessione.

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

Nella finestra successiva, seleziona la connessione tramite VPN:

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

La configurazione non è ancora completa. Dobbiamo inserire la chiave condivisa per il protocollo IPsec, quindi passiamo alla scheda “Impostazioni connessioni di rete” e poi alla scheda “Proprietà per questa connessione”:

Nella finestra che si apre, andiamo alla scheda "Sicurezza", impostiamo come tipo di rete "Rete L2TP/IPsec" e selezioniamo "Ulteriori opzioni":

Nella finestra che appare, inseriamo la chiave condivisa IPsec:

Connessione
Una volta completata la configurazione, possiamo provare a connetterci alla rete:

Durante la connessione ci verrà chiesto di inserire il PIN del token:

Abbiamo configurato una rete VPN sicura e verificato che non è difficile.
Ringraziamenti
Vogliamo ringraziare di nuovo 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
