Autore: Fabio Di Matteo
Ultima revisione: 28/08/2019 - 11:30
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 licenza GNU/GPL. Gestisce la cifratura del traffico di rete e la cifratura dell'autenticazione mediante le librerie 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:
Quindi con Openvpn e' come se i terminali e i server si trovassero nella medesima rete locale.
Come si evince dalla Documentazione e dagli esempi di utilizzo nel sito ufficiale Openvpn possiede un gran numero di opzioni e puo' usare tre metodi di autenticazione/cifratura :
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 .
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) .
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).
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
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.
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
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
openvpn.conf
#L'indirizzo del server remote <ip oppure hostname del server> #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 tutorial per la configurazione a chiave statica condivisa .
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 “Certification Authority casereccia” .
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 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 Open Ssh
Il server in questione fara' parte della nostra CA quindi si procedera' creando :
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:
~/.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' 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
.
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.
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:
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 <indirizzo server> <porta server> # 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 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 .
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
.
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:
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 .
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
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
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 .