Ubuntu 20.04 Focal Fossa è l'ultimo supporto a lungo termine di una delle distribuzioni Linux più utilizzate. In questo tutorial vedremo come utilizzare questo sistema operativo per creare un server OpenVPN e come creare un .ovpn
file che useremo per connetterci ad esso dal nostro computer client.
In questo tutorial imparerai:
- Come generare un'autorità di certificazione
- Come generare il certificato e la chiave del server e del client
- Come firmare un certificato con l'Autorità di certificazione
- Come creare parametri Diffie-Hellman
- Come generare una chiave tls-auth
- Come configurare il server OpenVPN
- Come generare un file .ovpn per connettersi alla VPN
Requisiti e convenzioni software utilizzati
Categoria | Requisiti, convenzioni o versione del software utilizzata |
---|---|
Sistema | Ubuntu 20.04 Fossa focale |
Software | openvpn, ufw, easy-rsa |
Altro | Autorizzazioni di root per eseguire attività amministrative |
Convenzioni | # – richiede che i comandi linux dati vengano eseguiti con i privilegi di root direttamente come utente root o usando sudo comando$ – richiede che i comandi linux dati vengano eseguiti come un normale utente non privilegiato |
Impostazione scenario
Prima di procedere con la configurazione vera e propria della VPN, parliamo delle convenzioni e delle impostazioni che adotteremo in questo tutorial.
Utilizzeremo due macchine, entrambe alimentate da Ubuntu 20.04 Focal Fossa . Il primo, camachine
sarà utilizzato per ospitare la nostra Autorità di certificazione; il secondo, openvpnmachine
sarà quella che imposteremo come VPN effettiva server. È possibile utilizzare la stessa macchina per entrambi gli scopi, ma sarebbe meno sicuro, dal momento che una persona che viola il server, potrebbe "impersonare" l'Autorità di Certificazione e utilizzarla per firmare certificati indesiderati (il problema è particolarmente rilevante solo se si prevedi di avere più di un server o se prevedi di utilizzare la stessa CA per altri scopi). Per spostare i file tra una macchina e l'altra utilizzeremo il scp
comando (copia sicura). I 10 passaggi principali che eseguiremo sono i seguenti:
- Generazione dell'Autorità di Certificazione;
- Generazione della chiave del server e richiesta del certificato;
- Firma della richiesta di certificato del server con la CA;
- Generazione dei parametri Diffie-Hellman sul server;
- Generazione della chiave tls-auth sul server;
- Configurazione OpenVPN;
- Configurazione di rete e firewall (ufw) sul server;
- Generazione di una chiave client e richiesta di certificato;
- Firma del certificato client con la CA;
- Creazione del file .ovpn del client utilizzato per la connessione alla VPN.
Fase 1 – Generazione dell'Autorità di Certificazione (CA)
Il primo passo del nostro percorso consiste nella creazione della Autorità di certificazione sulla macchina dedicata. Lavoreremo come utente non privilegiato per generare i file necessari. Prima di iniziare, dobbiamo installare easy-rsa
pacchetto:
$ sudo apt-get update && sudo apt-get -y install easy-rsa
Con il pacchetto installato, possiamo usare il make-cadir
comando per generare una directory contenente gli strumenti necessari e i file di configurazione, in questo caso lo chiameremo certificate_authority
. Una volta creato, ci sposteremo al suo interno:
$ make-cadir certificate_authority && cd certificate_authority
All'interno della directory troveremo un file chiamato vars
. Nel file possiamo definire alcune variabili che verranno utilizzate per la generazione del certificato. Un insieme commentato di queste variabili può essere trovato alla riga 91
a 96
. Basta rimuovere il commento e assegnare i valori appropriati:
set_var EASYRSA_REQ_COUNTRY "US" set_var EASYRSA_REQ_PROVINCE "California" set_var EASYRSA_REQ_CITY "San Francisco" set_var EASYRSA_REQ_ORG "Copyleft Certificate Co" set_var EASYRSA_REQ_EMAIL "[email protected]" set_var EASYRSA_REQ_OU "My Organizational Unit"
Una volta salvate le modifiche, possiamo procedere e generare la PKI (Public Key Infrastructure), con il seguente comando che creerà una directory chiamata pki
:
$ ./easyrsa init-pki
Con l'infrastruttura in atto, possiamo generare la nostra chiave CA e il certificato. Dopo aver lanciato il comando seguente, ci verrà chiesto di inserire una passphrase per la chiave ca . Dovremo fornire la stessa password ogni volta che interagiamo con l'autorità. Un Nome comune per il certificato dovrebbe essere fornito anche. Questo può essere un valore arbitrario; se premiamo semplicemente invio al prompt, verrà utilizzato quello predefinito, in questo caso Easy-RSA CA
:
$ ./easyrsa build-ca
Ecco l'output del comando:
Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.1.1d 10 Sep 2019 Enter New CA Key Passphrase: Re-Enter New CA Key Passphrase: Generating RSA private key, 2048 bit long modulus (2 primes) ..........+++++ ....................................................................+++++ e is 65537 (0x010001) Can't load /home/egdoc/certificate_authority/pki/.rnd into RNG 140296362980608:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:98:Filename=/home/egdoc/certificate_authority/pki/.rnd You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Common Name (eg: your user, host, or server name) [Easy-RSA CA]: CA creation complete and you may now import and sign cert requests. Your new CA certificate file for publishing is at: /home/egdoc/certificate_authority/pki/ca.crt
Il build-ca
il comando ha generato due file; il loro percorso, relativo alla nostra directory di lavoro sono:
- pki/ca.crt
- pki/private/ca.key
Il primo è il certificato pubblico, il secondo è la chiave che verrà utilizzata per firmare i certificati del server e dei client, quindi dovrebbe essere mantenuto il più sicuro possibile.
Una piccola nota, prima di andare avanti:nell'output del comando potresti aver notato un messaggio di errore. Sebbene l'errore non sia grave, una soluzione alternativa per evitarlo è commentare la terza riga di openssl-easyrsa.cnf
file che si trova all'interno della directory di lavoro generata. Il problema è discusso nel repository github di openssl. Dopo la modifica, il file dovrebbe apparire così:
# For use with Easy-RSA 3.1 and OpenSSL or LibreSSL RANDFILE = $ENV::EASYRSA_PKI/.rnd
Detto questo, passiamo alla macchina che useremo come server OpenVPN e generiamo la chiave e il certificato del server.
Fase 2 – Generazione della chiave del server e della richiesta di certificato
In questo passaggio genereremo la chiave del server e la richiesta di certificato che verrà poi firmata dall'autorità di certificazione. Sulla macchina che useremo come server OpenVPN, dobbiamo installare il openvpn
, easy-rsa
e ufw
pacchetti:
$ sudo apt-get update && sudo apt-get -y install openvpn easy-rsa ufw
Per generare la chiave del server e la richiesta di certificato, eseguiamo la stessa procedura che abbiamo utilizzato sulla macchina che ospita l'Autorità di Certificazione:
- Generiamo una directory di lavoro con
make-cadir
comando e spostati al suo interno. - Imposta le variabili contenute in
vars
file che verrà utilizzato per il certificato. - Genera l'infrastruttura a chiave pubblica con
./easyrsa init-pki
comando.
Dopo questi passaggi preliminari, possiamo emettere il comando per generare il certificato del server e il file chiave:
$ ./easyrsa gen-req server nopass
Questa volta, poiché abbiamo usato il nopass
opzione, non ci verrà richiesto di inserire una password durante la generazione della chiave del server . Ci verrà comunque chiesto di inserire un Nome comune per il certificato del server . In questo caso il valore predefinito utilizzato è server
. Questo è ciò che useremo in questo tutorial:
Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.1.1d 10 Sep 2019 Generating a RSA private key ....................+++++ .................+++++ writing new private key to '/home/egdoc/openvpnserver/pki/private/server.key.9rU3WfZMbW' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Common Name (eg: your user, host, or server name) [server]: Keypair and certificate request completed. Your files are: req: /home/egdoc/openvpnserver/pki/reqs/server.req key: /home/egdoc/openvpnserver/pki/private/server.key
Una richiesta di firma del certificato e una chiave privata verrà generato:
/home/egdoc/openvpnserver/pki/reqs/server.req
/home/egdoc/openvpnserver/pki/private/server.key
.
Il file della chiave deve essere spostato all'interno di /etc/openvpn
directory:
$ sudo mv pki/private/server.key /etc/openvpn
La richiesta di certificato, invece, deve essere inviata alla macchina dell'autorità di certificazione, per essere firmata. Possiamo usare scp
comando per trasferire il file:
$ scp pki/reqs/server.req egdoc@camachine:/home/egdoc/
Torniamo a camachine
e autorizzare il certificato.
Fase 3 – Firma del certificato del server con la CA
Sulla macchina dell'Autorità di Certificazione dovremmo trovare il file che abbiamo copiato nel passaggio precedente nel $HOME
directory del nostro utente:
$ ls ~ certificate_authority server.req
La prima cosa che facciamo è importare la richiesta di certificato. Per portare a termine l'attività, utilizziamo import-req
azione di easyrsa
sceneggiatura. La sua sintassi è la seguente:
import-req <request_file_path> <short_basename>
Nel nostro caso, questo si traduce in:
$ ./easyrsa import-req ~/server.req server
Il comando genererà il seguente output:
Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.1.1d 10 Sep 2019 The request has been successfully imported with a short name of: server You may now use this name to perform signing operations on this request.
Per firmare la richiesta, utilizziamo il sing-req
action, che prende il tipo della richiesta come primo argomento (server, in questo caso) e il short_basename
abbiamo usato nel comando precedente (server). Corriamo:
$ ./easyrsa sign-req server server
Ci verrà chiesto di confermare che vogliamo firmare il certificato e di fornire la password che abbiamo utilizzato per la chiave dell'autorità di certificazione. Se tutto va come previsto, verrà creato il certificato:
Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.1.1d 10 Sep 2019 You are about to sign the following certificate. Please check over the details shown below for accuracy. Note that this request has not been cryptographically verified. Please be sure it came from a trusted source or that you have verified the request checksum with the sender. Request subject, to be signed as a server certificate for 1080 days: subject= commonName = server Type the word 'yes' to continue, or any other input to abort. Confirm request details: yes Using configuration from /home/egdoc/certificate_authority/pki/safessl-easyrsa.cnf Enter pass phrase for /home/egdoc/certificate_authority/pki/private/ca.key: Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows commonName :ASN.1 12:'server' Certificate is to be certified until Mar 20 02:12:08 2023 GMT (1080 days) Write out database with 1 new entries Data Base Updated Certificate created at: /home/egdoc/certificate_authority/pki/issued/server.crt
Ora possiamo eliminare il file di richiesta che abbiamo precedentemente trasferito da openvpnmachine
. E copia il certificato generato nel nostro OpenVPN server, insieme al certificato pubblico della CA:
$ rm ~/server.req $ scp pki/{ca.crt,issued/server.crt} egdoc@openvpnmachine:/home/egdoc
Torna su openvpnmachine
dovremmo trovare i file nella nostra home directory. Ora possiamo spostarli in /etc/openvpn
:
$ sudo mv ~/{ca.crt,server.crt} /etc/openvpn
Fase 4 – Generazione dei parametri Diffie-Hellman
Il passo successivo consiste nella generazione di un Diffie-Hellman parametri. Il Diffie Hellman lo scambio di chiavi è il metodo utilizzato per trasferire le chiavi crittografiche su un canale pubblico e non sicuro. Il comando per generare la chiave è il seguente (il completamento potrebbe richiedere del tempo):
$ ./easyrsa gen-dh
La chiave verrà generata all'interno del pki
directory come dh.pem
. Spostiamolo in /etc/openvpn
come dh2048.pem
:
$ sudo mv pki/dh.pem /etc/openvpn/dh2048.pem
Fase 5 – Generazione della chiave tls-auth (ta.key)
Per migliorare la sicurezza, OpenVPN implementa tls-auth . Citando la documentazione ufficiale:
La direttiva tls-auth aggiunge una firma HMAC aggiuntiva a tutti i pacchetti di handshake SSL/TLS per la verifica dell'integrità. Qualsiasi pacchetto UDP che non porta la firma HMAC corretta può essere eliminato senza ulteriore elaborazione. La firma HMAC tls-auth fornisce un ulteriore livello di sicurezza oltre a quello fornito da SSL/TLS. Può proteggere da:
– Attacchi DoS o port flooding sulla porta UDP di OpenVPN.
– Scansione delle porte per determinare quali porte UDP del server sono in stato di ascolto.
– Vulnerabilità di overflow del buffer nella Implementazione SSL/TLS.
– Iniziazioni di handshake SSL/TLS da macchine non autorizzate (sebbene tali handshake alla fine non riuscirebbero ad autenticarsi, tls-auth può interromperli molto prima).
Per generare la chiave tls_auth possiamo eseguire il seguente comando:
$ openvpn --genkey --secret ta.key
Una volta generato, spostiamo il ta.key
file in /etc/openvpn
:
$ sudo mv ta.key /etc/openvpn
La configurazione delle nostre chiavi del server è ora completa. Possiamo procedere con l'effettiva configurazione del server.
Fase 6 – Configurazione OpenVPN
Il file di configurazione di OpenVPN non esiste per impostazione predefinita all'interno di /etc/openvpn
. Per generarlo, utilizziamo un modello fornito con openvpn
pacchetto. Eseguiamo questo comando:
$ zcat \ /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz \ | sudo tee /etc/openvpn/server.conf > /dev/null
Ora possiamo modificare il /etc/openvpn/server.conf
file. Le parti rilevanti sono mostrate di seguito. La prima cosa che vogliamo fare è verificare che il nome delle chiavi e dei certificati a cui si fa riferimento corrisponda a quelli che abbiamo generato. Se hai seguito questo tutorial dovrebbe essere sicuramente il caso (linee 78-80
e 85
):
ca ca.crt cert server.crt key server.key # This file should be kept secret dh dh2048.pem
Vogliamo far funzionare il demone OpenVPN con privilegi bassi, il nobody
utente e nogroup
gruppo. La parte rilevante del file di configurazione si trova alle righe 274
e 275
. Dobbiamo solo rimuovere il ;
iniziale :
user nobody group nogroup
Un'altra riga da cui vogliamo rimuovere il commento è 192
. Ciò farà sì che tutti i client reindirizzeranno il loro gateway predefinito tramite la VPN:
push "redirect-gateway def1 bypass-dhcp"
Righe 200
e 201
to può essere utilizzato anche per consentire al server di inviare server DNS specifici ai client. Quelli nel file di configurazione sono quelli forniti da opendns.com
:
push "dhcp-option DNS 208.67.222.222" push "dhcp-option DNS 208.67.220.220"
A questo punto il /etc/openvpn
directory dovrebbe contenere questi file che abbiamo generato:
/etc/openvpn ├── ca.crt ├── dh2048.pem ├── server.conf ├── server.crt ├── server.key └── ta.key
Assicuriamoci che siano tutti di proprietà di root:
$ sudo chown -R root:root /etc/openvpn
Possiamo procedere al passaggio successivo:la configurazione delle opzioni di rete.
Fase 7:configurazione della rete e dell'ufw
Affinché la nostra VPN funzioni, dobbiamo abilitare l'inoltro IP sul nostro server. Per farlo, decomponiamo semplicemente la riga 28
dal /etc/sysctl.conf
file:
# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1
Per ricaricare le impostazioni:
$ sudo sysctl -p
Dobbiamo anche consentire l'inoltro dei pacchetti nel firewall ufw modificando il /etc/default/ufw
file e modificando il DEFAULT_FORWARD_POLICY
da DROP
per ACCEPT
(riga 19
):
# Set the default forward policy to ACCEPT, DROP or REJECT. Please note that # if you change this you will most likely want to adjust your rules DEFAULT_FORWARD_POLICY="ACCEPT"
Ora dobbiamo aggiungere le seguenti regole all'inizio di /etc/ufw/before.rules
file. Qui assumiamo che l'interfaccia utilizzata per la connessione sia eth0
:
*nat :POSTROUTING ACCEPT [0:0] -A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE COMMIT
Infine, dobbiamo consentire il traffico in entrata per openvpn
servizio nel gestore del firewall ufw:
$ sudo ufw allow openvpn
A questo punto possiamo riavviare ufw per applicare le modifiche. Se il tuo firewall non era abilitato a questo punto, assicurati che ssh
il servizio è sempre consentito, altrimenti potresti essere tagliato fuori se lavori da remoto.
$ sudo ufw disable && sudo ufw enable
Ora possiamo avviare e abilitare openvpn.service all'avvio:
$ sudo systemctl restart openvpn && sudo systemctl enable openvpn
Fase 8 – Generazione di una chiave client e di una richiesta di certificato
La configurazione del nostro server è ora terminata. Il passaggio successivo consiste nella generazione della chiave client e della richiesta di certificato. La procedura è la stessa che abbiamo usato per il server:utilizziamo semplicemente “client” come nome invece di “sever”, generiamo la chiave e la richiesta di certificato, quindi passiamo quest'ultima alla macchina della CA per la firma.
$ ./easyrsa gen-req client nopass
Proprio come prima, ci verrà chiesto di inserire un nome comune. Verranno generati i seguenti file:
- /home/egdoc/openvpnserver/pki/reqs/client.req
- /home/egdoc/openvpnserver/pki/private/client.key
Copiamo il client.req
alla macchina CA:
$ scp pki/reqs/client.req egdoc@camachine:/home/egdoc
Una volta copiato il file, su camachine
, importiamo la richiesta:
$ ./easyrsa import-req ~/client.req client
Quindi, firmiamo il certificato:
$ ./easyrsa sign-req client client
Dopo aver inserito la password della CA, il certificato verrà creato come pki/issued/client.crt
. Rimuoviamo il file di richiesta e ricopiamo il certificato firmato sul server VPN:
$ rm ~/client.req $ scp pki/issued/client.crt egdoc@openvpnmachine:/home/egdoc
Per comodità, creiamo una directory per contenere tutte le informazioni relative al client e spostarci la chiave e il certificato del client:
$ mkdir ~/client $ mv ~/client.crt pki/private/client.key ~/client
Bene, ci siamo quasi. Ora dobbiamo copiare il modello di configurazione del client, /usr/share/doc/openvpn/examples/sample-config-files/client.conf
all'interno del ~/client
directory e modificarlo in base alle nostre esigenze:
$ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client
Ecco le righe che dobbiamo modificare nel file. Alla riga 42
metti l'IP o il nome host del server effettivo al posto di my-server-1
:
remote my-server-1 1194
Sulle righe 61
e 62
rimuovi il ;
iniziale carattere per eseguire il downgrade dei privilegi dopo l'inizializzazione:
user nobody group nogroup
Sulle righe 88
a 90
e 108
possiamo vedere che il certificato CA, il certificato client, la chiave client e la chiave tls-auth sono referenziati. Vogliamo commentare quelle righe, poiché inseriremo il contenuto effettivo dei file tra una coppia di "tag" dedicati:
<ca></ca>
per il certificato CA<cert></cert>
per il certificato cliente<key></key>
per la chiave client<tls-auth></tls-auth>
per la chiave tls-auth
Una volta commentate le righe, aggiungiamo il seguente contenuto in fondo al file:
<ca> # Here goes the content of the ca.crt file </ca> <cert> # Here goes the content of the client.crt file </cert> <key> # Here goes the content of the client.key file </key> key-direction 1 <tls-auth> # Here goes the content of the ta.key file </tls-auth>
Una volta terminata la modifica del file, lo rinominiamo con .ovpn
suffisso:
$ mv ~/client/client.conf ~/client/client.ovpn
Tutto ciò che resta da fare è importare il file nella nostra applicazione client per collegarlo alla nostra VPN. Se stiamo utilizzando l'ambiente desktop GNOME, ad esempio, possiamo importare il file da Rete sezione del pannello di controllo. Nella sezione VPN basta cliccare su +
pulsante, quindi su “importa da file” per selezionare e importare il file “.ovpn” precedentemente trasferito sulla macchina client.
Interfaccia GNOME per importare file .ovpn
Conclusioni
In questo tutorial abbiamo visto come creare una configurazione OpenVPN funzionante. Abbiamo generato un'autorità di certificazione e l'abbiamo utilizzata per firmare i certificati server e client che abbiamo generato insieme alle chiavi corrispondenti. Abbiamo visto come configurare il server e come configurare la rete, consentendo l'inoltro dei pacchetti ed eseguendo le modifiche necessarie alla configurazione del firewall ufw. Infine, abbiamo visto come generare un client .ovpn file che può essere importato da un'applicazione client per connettersi facilmente alla nostra VPN. Divertiti!