Una VPN è una Rete Privata Virtuale che ti consente di accedere ad Internet o a determinati servizi anche da una rete non attendibile. In pratica è come se fossi connesso fisicamente ad una rete privata: potrai ad esempio accedere al tuo conto corrente o effettuare pagamenti senza aver timore che qualcuno stia intercettando il traffico generato dal tuo device.
OpenVPN è un software open source che permette di creare una VPN e si basa sui protocolli TLS/SSL (Transport Layer Security/Secure Sockets Layer), utilizzando dei certificati per criptare il traffico in modo sicuro tra il server e il client.
In questo tutorial vedrai come installare e configurare OpenVPN su un server Linux con Ubuntu 18.04.
Per seguire le istruzioni contenute nella guida avrai bisogno di un server principale e di una seconda macchina che agirà da CA ovvero da Autorità di certificazione, quest'ultima avrà il compito di verificare la validità dei certificati.
Dovrai connetterti al tuo server e alla tua CA tramite una connessione SSH. Se non l’hai ancora fatto, ti consigliamo di seguire la nostra guida per connetterti in sicurezza con il protocollo SSH. In caso di server locale puoi passare al punto successivo e aprire il terminale del tuo server.
Installare OpenVPN
Per prima cosa accedi al tuo server e installa OpenVPN.
N.B. OpenVPN è disponibile già nel repository ufficiale di Ubuntu quindi non devi aggiungerne ulteriori.
Digita:
$ sudo apt update
$ sudo apt install openvpn
A questo punto avrai installato con successo OpenVPN sul tuo server.
Installare EasyRSA
Prosegui scaricando EasyRSA sul tuo server e sulla tua CA digitando su entrambe le macchine:
$ wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/EasyRSA-3.0.4.tgz
L’ultima versione la puoi scaricare da https://github.com/OpenVPN/easy-rsa/releases
$ cd ~
$ sudo tar xvf EasyRSA-3.0.4.tgz
N.B. Il nome può essere diverso in base alla versione scaricata.
Configurare il server
Completa la configurazione del server digitando:
$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
$ sudo gzip -d /etc/openvpn/server.conf.gz
$ sudo nano /etc/openvpn/server.conf
Trova la sezione che fa riferimento ad HMAC (“tls-auth”). Qualora la linea fosse commentata, rimuovi il “;”.
Trova la sezione sulla cifratura (“cipher"). Qualora fosse commentata, rimuovi il “;” e aggiungi una nuova linea subito sotto contenente il testo “auth SHA256”.
Trova la sezione “dh” che definiscono i parametri Diffie-Hellman e rimuovi “2048” dal nome (Dovresti avere “dh dh.pem”).
Trova la sezione “user” e “group” e rimuovi i “;” per rendere le righe non commentate.
Configurare EasyRSA sulla CA
Sulla tua CA, dopo aver installato EasyRSA è stato creato un file di configurazione utile per definire le variabili per il tuo CA. Digita:
$ cd ~/EasyRSA-3.0.4/
$ sudo cp vars.example vars
$ sudo nano vars
Decommenta le istruzioni mostrate in figura:
Avvia lo script “easyrsa” per inizializzare l’Infrastruttura della Key Pubblica (PKI):
$ sudo ./easyrsa init-pki
$ sudo ./easyrsa build-ca nopass
Con questo comando verranno creati due file:
- ca.crt: certificato pubblico del CA utilizzata da server e client per notificarsi reciprocamente che fanno parte della stessa rete attendibile.
- ca.key: chiave privata che la macchina CA utilizza per firmare chiavi e certificati per server e client. Questo file deve essere mantenuto solo sulla macchina CA (non accessibile da terzi) perchè altrimenti la sicurezza della rete può essere compromessa.
Ti verrà richiesto di inserire un nome. Lascia vuoto e premi Invio.
Richiedere un certificato per il server alla CA
Ora che hai la Macchina CA configurata devi far generare dal server una chiave privata ed una richiesta di certificato ed inviarli sulla Macchina CA per farli firmare:
$ cd ~/EasyRSA-3.0.4
$ sudo ./easyrsa init-pki
$ sudo ./easyrsa gen-req server nopass
Per semplicità lascia “server” come nome della macchina o dovrai effettuare diverse modifiche successivamente.
Hai appena creato una chiave privata per il server e una richiesta di certificato chiamato “server.req”:
$ sudo cp ~/EasyRSA-v3.0.6/pki/private/server.key /etc/openvpn/
Copia il file server.req sulla macchina CA:
$ sudo scp ~/EasyRSA-3.0.4/pki/reqs/server.req user@your_CA_ip:/tmp
Generare e firmare il certificato
Sulla tua CA nella cartella EasyRSA, importa il file appena copiato e firmalo:
$ cd ~/EasyRSA-3.0.4/
$ sudo ./easyrsa import-req /tmp/server.req server
$ sudo ./easyrsa sign-req server server
Digita “yes” e premi Invio.
Trasferisci il certificato firmato e il ca.crt al server VPN:
$ sudo scp pki/issued/server.crt user@your_server_ip:/tmp
$ sudo scp pki/ca.crt user@your_server_ip:/tmp
Successivamente nel tuo server copia i file ricevuti nelle apposite directory:
$ sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/
$ cd ~/EasyRSA-3.0.4/
e genera una chiave di scambio:
$ sudo ./easyrsa gen-dh
$ sudo openvpn --genkey --secret ta.key
Copia i file generati nella cartella “/etc/openvpn/”:
$ sudo cp ~/EasyRSA-3.0.4/ta.key /etc/openvpn/
$ sudo cp ~/EasyRSA-3.0.4/pki/dh.pem /etc/openvpn/
Configurare un client
Crea una cartella per archiviare certificati e chiavi del client. Avendo un solo client in questa guida verrà chiamato “client1”, ma l’operazione dovrai ripeterla per ogni client cambiando nome.
$ sudo mkdir -p ~/client-configs/keys
$ sudo chmod -R 700 ~/client-configs
$ cd ~/EasyRSA-3.0.4/
$ sudo ./easyrsa gen-req client1 nopass
Premi Invio per accettare il nome standard proposto.
Copia la chiave del client nella cartella creata in precedenza:
$ sudo cp pki/private/client1.key ~/client-configs/keys/
Invia il file client1.req alla macchina CA:
$ sudo scp pki/reqs/client1.req user@your_CA_IP:/tmp
Importa la richiesta di certificato sulla tua CA:
$ cd ~/EasyRSA-3.0.4/
$ sudo ./easyrsa import-req /tmp/client1.req client1
$ sudo ./easyrsa sign-req client client1
Digita “yes” per autorizzare la firma.
Trasferisci il certificato sull atua macchina server:
$ sudo scp pki/issued/client1.crt utente@IP_SERVER:/tmp
Nel tuo server copia i seguenti file nelle apposite cartelle:
$ sudo mkdir -p ~/client-configs/keys
$ sudo chmod -R 700 ~/client-configs
$ sudo cp /tmp/client1.crt ~/client-configs/keys/
$ sudo cp ~/EasyRSA-3.0.4/ta.key ~/client-configs/keys/
$ sudo cp /etc/openvpn/ca.crt ~/client-configs/keys/
Al momento sia i certificati che le chiavi del server e del client sono stati generati.
Configurare l'instradamento degli IP e il Firewall
Ora devi modificare le regole di forwarding degli IP.
$ sudo nano /etc/sysctl.conf
Trova la sezione “net.ipv4.ip_forward” e rimuovi il “#” per rendere l’istruzione non commentata.
Devi modificare alcune regole del firewall per poter instradare correttamente le connessioni dei client.
$ ip route | grep default
Memorizza il nome dopo “dev” (in figura il nome è “eth0”).
$ sudo nano /etc/ufw/before.rules
Aggiungi i comandi come in figura sottostante, sostituendo “eth0” con il nome della tua interfaccia di rete.
Salva ed esci.
$ sudo nano /etc/default/ufw
Modifica il valore del parametro “DEFAULT_FORWARD_POLICY” con “ACCEPT“.
Abilita la porta 1194 per il traffico UDP e la porta 22 per il traffico SSH:
$ sudo ufw allow 1194/udp $ sudo ufw allow OpenSSH
Riavvia il firewall:
$ sudo ufw disable
$ sudo ufw enable
Avvia il servizio di OpenVPN:
$ sudo systemctl start openvpn
Verifica lo stato del servizio. Se tutto è andato a buon fine troverai una schermata simile a quella in figura.
$ sudo systemctl status openvpn
Fai eseguire il servizio all’avvio del server:
$ sudo systemctl enable openvpn
Crea la configurazione base per i client:
$ sudo mkdir -p ~/client-configs/files
$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
$ sudo nano ~/client-configs/base.conf
Trova la sezione “remote” e assicurati che sia scritto “remote IP_Server 1194”
- IP_Server: Scrivi l’IP del Server
- 1194: porta scelta in precedenza.
Trova la sezione “proto” per assicurarsi che il server sia impostato su UDP (troverai la linea del TCP commentata con un “;”).
Trova la sezione “user” e “group” e rimuovi i “;” per renderle “non commenti”.
Trova le sezioni “ca.crt” - “client.crt” - “client.key” - “ta.key” e commentale con un “#” all’inizio di ogni linea.
Trova la sezione “cipher” e aggiungi l’istruzione “auth SHA256” sotto all’istruzione “cipher AES-256-CBC”.
Aggiungi in un qualsiasi punto l’istruzione “key-direction 1”.
Aggiungi in un qualsiasi punto queste linee commentate. Qualora il client dovesse essere una macchina Linux, dovranno essere rese non commentate.
# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf
Salva ed esci.
Generare la configurazione per i client
Sul tuo server crea uno script che compilerà la configurazione di un client in maniera automatica:
$ sudo nano ~/client-configs/make_config.sh
Copia e incolla il testo sottostante:
#!/bin/bash
# First argument: Client identifier
KEY_DIR=~/client-configs/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf
cat ${BASE_CONFIG} \
<(echo -e '<ca>') \
${KEY_DIR}/ca.crt \
<(echo -e '</ca>\n<cert>') \
${KEY_DIR}/${1}.crt \
<(echo -e '</cert>\n<key>') \
${KEY_DIR}/${1}.key \
<(echo -e '</key>\n<tls-auth>') \
${KEY_DIR}/ta.key \
<(echo -e '</tls-auth>') \
> ${OUTPUT_DIR}/${1}.ovpn
Salva il file e rendilo eseguibile:
$ sudo chmod 700 ~/client-configs/make_config.sh
Infine prova a generare la configurazione per il client "client1":
$ cd ~/client-configs
$ sudo ./make_config.sh client1
Verrà creato il file client1.ovpn.
Ora devi trasferire questo file sul dispositivo che intendi utilizzare in quanto verrà usato dal software VPN per la connessione.
Revocare i certificati dei client
Per revocare i certificati di un client esegui i seguenti comandi sulla tua CA:
$ cd EasyRSA-3.0.4/
$ sudo ./easyrsa revoke client1
client1 è il nome del client al quale si vogliano revocare le autorizzazioni.
Digita “yes” per confermare.
Genera il file crl.pem e invialo al tuo server:
$ sudo ./easyrsa gen-crl
$ sudo scp ~/EasyRSA-3.0.4/pki/crl.pem user@IP_Server:/tmp
Aggiorna la configurazione sul tuo server per verificare la revoca:
$ sudo cp /tmp/crl.pem /etc/openvpn
$ sudo nano /etc/openvpn/server.conf
Alla fine del file aggiungi “crl-verify crl.pem”.
Salva e chiudi.
$ sudo systemctl restart openvpn@server
Riavvia il server per rendere le modifiche effettive.