Strumenti Utente

Strumenti Sito


Barra laterale

rete:openvpn

Openvpn

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.

Note introduttive sul funzionamento

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 :

  1. chiave segreta condivisa;
  2. certificati digitali;
  3. 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 <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 .

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 “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 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


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' 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.

[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:

  1. Coppia chiave pubblica/privata;
  2. 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 <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

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:

  1. via variabili di sistema (via-env);
  2. 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 .


rete/openvpn.txt · Ultima modifica: 28/08/2019 - 11:32 da Fabio Di Matteo