====== Openvpn ======
Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **// 28/08/2019 - 11:30 //** // //
[[http://openvpn.net/|Openvpn]] e' un programma nato per creare tunnel crittografici attraverso la rete (internet o altre reti tcp/ip) ,scritto da James Yonan e rilasciato con [[http://it.wikipedia.org/wiki/GNU_General_Public_License|licenza GNU/GPL]]. Gestisce la cifratura del traffico di rete e la cifratura dell'autenticazione mediante le librerie [[http://it.wikipedia.org/wiki/OpenSSL|OpenSSL]] . E' disponibile per svariati sistemi operativi come GNU/Linux, xBSD, Mac OSX, Solaris e Windows 2000/XP e consiste in un unico file eseguibile che puo' funzionare sia da cilent che da server. \\
Un tipico schema di funzionamento che ne riassume le potenzialita' potrebbe essere il seguente: \\
{{rete:openvpn.png|}} \\
Quindi con Openvpn e' come se i terminali e i server si trovassero nella medesima rete locale.
===== Note introduttive sul funzionamento =====
Come si evince dalla [[http://openvpn.net/index.php/documentation/manuals/openvpn-20x-manpage.html|Documentazione]] e dagli
[[http://openvpn.net/index.php/documentation/examples.html|esempi di utilizzo nel sito ufficiale]] Openvpn possiede un gran numero di opzioni e puo' usare __**tre metodi** di //autenticazione/cifratura//__ :
- **chiave segreta condivisa**;
- **certificati digitali**;
- **credenziali utente/password (con o senza certificato client)**.
La connessione avviene mediante la creazione di //interfacce di rete virtuali// di tipo **tun/tap**. Ovvero per esempio quando lanceremo openvpn verra creata una scheda di rete virtuale di nome **tun0** la quale criptera' tutto il traffico di rete e lo spedira' verso l'altro capo della vpn .
==== Evitare problemi ====
Per funzionare openvpn richiede l'apertura della porta 1194 oppure 5000 (o qualunque altra porta voi specificate nel file di configurazione) e dell'abilitazione dell 'inoltro dell IP (forwarding) .\\ \\
=== Apertura porte (solo se la macchina fa anche da firewall) ===
**Per GNU/Linux**
Se non si ha un firewall le porte sono aperte e quindi non si deve fare nulla , altrimenti su GNU/Linux basta impartire i seguenti comandi all'avvio (del server):
iptables -A INPUT -p udp --dport 1194 -s 10.0.0.0/24 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -s 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
**N.B. se deciderete di configurare openvpn per funzionare con il **protocollo tcp** allora alla prima riga // -p udp// diventa //-p tcp// ** (vedremo poi come fare) . Fate inoltre attenzione all'indirizzo della rete nelle righe 2 e 3 (in base a cio' che specificherete nel file di configurazione).
=== Abilitare l'inoltro dei pacchetti IP ===
Per abilitare l'inoltro dei pacchetti ip (ovvero se vogliamo la condivisione della rete attraverso una macchina) basta lanciare il seguente comando all'avvio.
echo 1 > /proc/sys/net/ipv4/ip_forward
===== Funzionamento a chiave segreta condivisa =====
Il funzionamento piu' semplice e' quello a //chiave segreta condivisa//, ovvero i due capi della vpn possiederanno una chiave crittografica simmetrica e tutto il flusso dei dati verra cifrato mediante essa.
==== generazione della chiave condivisa ====
Creiamo in questo modo il file //static.key// contenete la nostra chiave condivisa che verra fornita a client e server
openvpn --genkey --secret static.key
==== La configurazione del server ====
**openvpn.conf**
#Dispositivo virtuale da utilizzare
dev tun
#Porta scelta da noi(default 1194)
port 3856
#il primo ip e' l'indirizzo del server, l'altro del client
ifconfig 10.8.0.1 10.8.0.2
#la chiave crittografica simmetrica condivisa da server e client
secret static.key
#Per i log del nostro server, verbosita' 3 , file di log openvpn.log
verb 3
log-append openvpn.log
#Rende piu' resistente il collegamento ai malfunzionamenti della rete
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
==== La configurazione del client ====
**openvpn.conf**
#L'indirizzo del server
remote
#Porta scelta da noi(default 1194)
port 3856
#Dispositivo virtuale da utilizzare
dev tun
#il primo ip e' l'indirizzo del client, l'altro del server
ifconfig 10.8.0.2 10.8.0.1
#la chiave crittografica simmetrica condivisa da server e client
secret static.key
#Rende piu' resistente il collegamento ai malfunzionamenti della rete
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
A questo punto e' sufficiente lanciare openvpn ai due capi (client e server) per instaurare il collegamento tramite il seguente comando:
openvpn --config openvpn.conf
**NB il file della chiave statica deve essere in questo caso nello stessa directory del file di configurazione **
__Questa e' la configurazione base__, ma si possono inserire nuove voci nei file di configurazione per abilitare altre funzioni come per esempio per **la compressione dei dati** basta aggiungere **comp-lzo** ai due file di configurazione, per la resa del **collegamento piu' resistente ai malfunzionamenti della rete** invece aggiungere le seguenti opzioni ai due file di configurazione (client e server):
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
Per le altre opzioni e' opportuno dare uno sguardo al chiarissimo [[http://openvpn.net/index.php/documentation/miscellaneous/static-key-mini-howto.html|tutorial per la configurazione a chiave statica condivisa]] .
===== Funzionamento con certificati digitali =====
Nel funzionamento con certificati digitali Openvpn (server) fara' parte della nostra CA (Certification Authority) cos' come i client che si collegano ad esso con il proprio certificato. Quindi il client e il server devono prima di tutto possedere il certificato rilasciato dalla CA, la quale ad ogni connessione controllera' se il certificato presentato dal client sara' valido (ovvero non iscritto nel file dei certificati revocati [CRL]). Prima di proseguire nella trattazione di questa modalita' di funzionamento e' opportuno dare una rapida lettura all'articolo "[[sicurezza:certification_authority_casereccia]]" .
==== Creare la nostra CA per Openvpn ====
Come menzionato nella documentazione ufficale openvpn prevede l'utilizzo di alcuni software all'interno della directory "easy-rsa" per la gestione della CA, ma noi per comodita' useremo il software di gestione CA [[http://tinyca.sm-zone.net/|TinyCA2]] .
TinyCA2 e' una semplice interfaccia GTK+2 per gestire una piccola/media CA, nonostante sia stata realizzata per facilitare il lavoro di creazione di CA possiede tante e dettagliate opzioni per configurare ogni aspetto della nostra CA. TinyCA2 posiziona i file di configurazioni e i relativi certificati in ''~/.TinyCA'' , e' quindi possibile accedere ai vari certificati e/o alle chiavi pubbliche direttamente da questa directory, ma e' altresì possibile esportare i certificati, le CA, la CRL direttamente dalla toolbar(**e così dobbiamo fare, sia per il client che il server di openvpn**) con il pulsante "Export", "Export CA", "Export CRL" . \\
E' indispensabile (per la sicurezza) mantenere la directory ''~/.TinyCA'' "privata" in quanto contiene le chiavi private della nostra CA. Per quanto riguarda il trasferimento delle chiavi da una macchina ad un altra magari via internet e' altamente consigliabile usare sistemi sicuri come per esempio [[http://it.wikipedia.org/wiki/OpenSSH|Open Ssh]] \\
{{sicurezza:tinyca2:tinyca2-main.png|}} \\
[[http://tinyca.sm-zone.net/|http://tinyca.sm-zone.net]] \\
==== [Parte server] - Creiamo il certificato e le chiavi per il server di Openvpn ====
Il server in questione fara' parte della nostra CA quindi si procedera' creando :
* Chiave pubblica/privata CA;
* Root certificate per la nostra CA (ovvero la chiave pubblica autofirmata);
Non appena avviamo TinyCA2 per la prima volta si apre automaticamente la schermata che ci permette di inserire i dati per la nostra nuova CA. Le prime due voci //NAME// e //Common Name// le imposteremo uguali con un nome a nostra scelta, le altre richieste non sono affatto complicate ci viene chiesto infatti di inserire soltanto i "dati anagrafici" della nostra CA e poi ancora ci viene chiesto di inserire la lughezza delle chiavi e gli algoritmi di cifratura. \\
Al termine della procedura di creazione della CA verranno generato **un file** di grande importanza:
* **crl.pem** (in '' ~/.TinyCA'')rappresenta la CRL ovvero l'elenco dei certificati che sono stati sospesi o revocati per qualsiasi motivo . \\
La procedura puo' ,eventualmente,essere ripetuta per la creazione di una nuova CA semplicemente cliccando nel bottone //"New CA"// situato sulla toolbar. \\
Altra cosa che serve alla parte server di Openvpn e' [[http://it.wikipedia.org/wiki/Scambio_di_chiavi_Diffie-Hellman|la chiave per il protocollo Diffie hellman]], ovvero un file (nel nostro caso ''dh1024.pem'') che aiutera Openvpn a rendere sicuro lo scambio della chiave per cifrare i dati tra server e client. \\
Per creare il suddetto file utilizzare il comando:
openssl dhparam -out dh1024.pem 1024
Procediamo adesso nell'esportare il certificato e le chiavi che serviranno per il server di Openvpn. **Aprire il tab //"Requests"// ,cliccare sul pulsante //"New"// sulla toolbar .** \\ Verra' cosi' creata la richiesta di certificato che dovra' essere firmato dal menu popup **Sign Request** (verra' chiesta durante la procedura la password della CA). Se si vuole usare il certificato per il server di openvpn selezionare **Sign request server** nel successivo popup. Il certificato finalmente verra' visualizzato nel tab **Certificates**. A questo punto possiamo esportare certificato e chiavi del server in un archivio zip. \\
Dunque esportiamo le chiavi ed il certificato andando sul tab **Keys** e cliccando sul bottone nell toolbar **Export** . Assicuriamoci di scegliere l'opzione di esportazione che ci consente di esportare sia chiavi che certificati, ovvero **Zip (Certificate and Keys) ** o anche **Tar (Certificate and Keys) ** . Estraiamo i file dell' archivio zip o tar nella directory di configurazione del server Openvpn, dove verra creato il nostro ''openvpn.conf''.
{{:rete:tinyca-openvpn0.png?864|}}
Adesso avendo ottenuto tutti i file che ci interessano per la parte server, possiamo passare al file di configurazione del server ''openvpn.conf'' \\
**openvpn.conf**
proto udp
dev tun
port 3131
#Chiave pubblica CA
ca cacert.pem
#Certificato CA
cert cert.pem
#Chiave privata CA
key key.pem
#CRL lista certificati sospesi o revocati
crl-verify crl.pem
#Diffie hellman (per scambiare la chiave simmetrica con Openssl)
#ottenibile con "openssl dhparam -out dh1024.pem 1024"
dh dh1024.pem
#Indirizzi che verranno assegnati, 10.8.0.1 sara' il server.
server 10.8.0.0 255.255.255.0
#File che tiene conto dei client collegati, così se openvpn va giu'
#al successivo riavvio ricontatta i client.
ifconfig-pool-persist ipp.txt
#Password CA server (per evitare che la chieda a ogni riavvio)
askpass password.txt
keepalive 10 60
Se si vuole fare in modo che Openvpn server non chieda la password della chiave privata allora aggiungere questa direttiva:
askpass password.txt
dove il file password.txt contiene nella prima riga la password in chiaro della chiave privata.
==== [Parte client] - Creiamo un certificato per un client ====
Adesso possiamo cominciare a creare le configurazioni per i vari client, ed in particolare per ogni client ci servono (oltre al file di configurazione di openvpn ''openvpn.conf'') le seguenti cose:
- Coppia chiave pubblica/privata;
- Certificato X509;
Come si e' detto per creare un certificato di tipo X509 si deve innanzitutto creare una coppia di chiavi pubblica/privata per l'utente o l'applicazione client in questione, dopodicche' si deve fare firmare alla CA la chiave pubblica mediante una richiesta di firma (CSR- Certificate Submission Request ). La CA esegue dunque i controlli sulla richiesta di firma e poi appone la firma sulla chiave del client . La chiave pubblica firmata diventa finalmente un certificato X509. \\
TinyCA2 esegue tutte queste operazioni in 2 passaggi soltanto , basta : \\
**aprire il tab //"Requests"// ,cliccare sul pulsante //"New"// sulla toolbar .** \\
Si aprira' una finestra di inserimento che permettera di inserire il "Common name" (ovvero un nome a nostra scelta), la password per la chiave privata, altri "dettagli anagrafici" e le immancabili impostazioni per gli algoritmi crittografici (se non si ha una preferenza lasciare le opzioni predefinite, vanno bene per la maggioranza dei casi). \\
**Una volta generata la richiesta (CSR) cliccare sul bottone //"Sign"// sulla toolbar o sul menu popup , selezionare "Sign request (Client)" ** \\
Verra' cosi' generato il certificato X509 che comparira' nel tab //"Certificates"// (verra chiesto di inserire la password per la chiave privata della CA) \\
Dopodicche' esportiamo le chiavi ed il certificato andando sul tab **Keys** e cliccando sul bottone nell toolbar **Export** . Assicuriamoci di scegliere l'opzione di esportazione che ci consente di esportare sia chiavi che certificati, ovvero **Zip (Certificate and Keys) ** o anche **Tar (Certificate and Keys) ** . Estraiamo i file dell' archivio zip o tar nella directory di configurazione del client, dove verra creato il nostro ''openvpn.conf'' nel seguente modo:
**openvpn.conf**
#Connessione client
client
dev tun
proto udp
remote
# prova a preservare lo stato dopo un riavvio.
persist-key
persist-tun
#Chiave pubblica CA
ca cacert.pem
#Chiave privata client
key key.pem
#Certificato X509
cert cert.pem
A questo punto e' sufficiente lanciare openvpn ai due capi (client e server) per instaurare il collegamento tramite il seguente comando:
openvpn --config openvpn.conf
==== Bloccare l'accesso ad uno specifico client ====
Bloccare l'accesso ad uno specifico client significa revocarne il certificato, ovvero iscrivere il certificato nella lista dei certificati revocati, la CRL che risiede sul server (nel nostro esempio il file ''debian-casa-crl.pem '' ). Sempre usando TinyCA2 andiamo sul **tab "Certificates"** clicchiamo con il tasto destro del mouse sul certificato client che vogliamo revocare, scegliamo dal menu popup la voce ** "Revoke Certificate" ** . \\
Fatto cio' andiamo sul **tab "CA"** ed clicchiamo sul pulsante della toolbar **"Export CRL"** e andiamo a sovrascrivere il nostro precedente file della CRL . Non e' necessario riavviare openvpn, ma accertarsi comunque che il server sia rimasto in esecuzione anche dopo aver aggiornato la CRL .
===== Demonizzare Openvpn =====
Per lanciare openvpn come un demone basta lanciare (anche da client se si vuole) openvpn con il parametro ''--daemon'' in questo modo:
openvpn --daemon --config openvpn.conf
Si puo' anche aggiungere la direttiva ''daemon'' all'interno di ''openvpn.conf''.
===== Funzionamento con credenziali utente/password =====
Il funzionamento con credenziali di tipo utente/pasword puo' fare uso di certificati digitali oppure no, in questo caso si esaminera' il funzionamento con certificati digitali.
La logica e' che openvpn in questo caso delega ad uno script (o eseguibile binario) esterno l'autenticazione dell'utente . Infatti **openvpn passera' la coppia nomeutente/password allo script** e in base al **valore di ritorno** dello script (**0 autenticato, 1 non autenticato**) instaurera' la connessione.
La coppia di credenziali utente/password puo' essere passata da openvpn allo script in 2 modi:
- via variabili di sistema (**via-env**);
- attraverso file temporaneo (**via-file**);
La direttiva in ''openvpn.conf'' che riguarda questo tipo di autenticazione e' **auth-user-pass-verify** e si usa come segue:
auth-user-pass-verify script metodo
dove **script** e' appunto lo script o l'eseguibile binario che restituira' 0 in caso di autenticazione con successo o 1 in caso contrario. \\
Invece **metodo** puo' essere ,come si e' detto, **via-env** o **via-file** .
==== Parte server ====
Nella parte server dunque ''openvpn.conf'' si presentera' in questa maniera:
**openvpn.conf**
proto udp
dev tun
#Chiave pubblica CA
ca cacert.pem
#Certificato CA
cert debian-casa-cacert.pem
#Chiave privata CA
key cacert.key
#CRL lista certificati sospesi o revocati
crl-verify debian-casa-crl.pem
#Diffie hellman (per scambiare la chiave simmetrica con Openssl)
#ottenibile con "openssl dhparam -out dh1024.pem 1024"
dh dh1024.pem
#Indirizzi che verranno assegnati, 10.8.0.1 sara' il server.
server 10.8.0.0 255.255.255.0
#File che tiene conto dei client collegati, così se openvpn va giu'
#al successivo riavvio ricontatta i client.
ifconfig-pool-persist ipp.txt
#Per i log
verb 3
log-append openvpn.log
#Per l'autenticazione attraverso lo script/programma "auth.bin"
auth-user-pass-verify ./auth.bin via-file
==== La parte client ====
Per la parte client basta aggiungere a ''openvpn.conf'' la direttiva **auth-user-pass** la quale indica al client che deve inviare nome utente e password.
#Connessione client
client
dev tun
proto udp
remote 192.168.1.2 1194
# prova a preservare lo stato dopo un riavvio.
persist-key
persist-tun
#Chiave pubblica
ca cacert.pem
#Chiave privata
key key.pem
#Certificato X509
cert cert.pem
#Indica che e' prevista l'autenticazione user/pass (in aggiunta)
auth-user-pass
==== Lanciare openvnp come servizio su Windows ====
Configurare la propria vpn, dopodicche lanciare ''services.msc'' , trovare **OpenVPN service** e settarlo su "Automatic". Al successivo riavvio Openvpn dovrebbe partire come servizio lanciando un processo openvpn per ogni file di configurazione trovato in //C:\Program Files\OpenVPN\config// .