AlcaLabs

[[projects:openvpn]]

Traccia: » OpenVPN

Ti trovi qui: Alca Labs » projects » OpenVPN

Login

Non sei ancora collegato! Inserisci il tuo nome utente e la tua password per autenticarti. E' necessario che il tuo browser abbia i cookie abilitati.

Entra

Hai dimenticato la password? Richiedine una nuova: Invia nuova password

OpenVPN

Questo articolo descrive le caratteristiche del software OpenVPN. Si parte con un'introduzione alle Virtual Private Networks (VPN) e l'architettura di OpenVPN e si conclude descrivendo i passi necessari all'installazione e la configurazione di questo software.

Introduzione alle VPN

Le VPN (Virtual Private Network) permettono di collegare reti private attraverso una rete pubblica (Internet). I vantaggi offerti da questa tecnologia sono molteplici, ma sono tali dal punto di vista della sicurezza? La crittografia dei dati è alla base del concetto di VPN. Esistono soluzioni proprietarie che utilizzano Server VPN, come Cisco, che è basata su IPSEC. Altre soluzioni IPSEC sono implementate a livello Network e tutto il protocollo è progettato per essere realizzato con una modifica allo stack IP in kernel space.

Alcuni scenari di utilizzo di una VPN sono “road warrior” e “site-to-site”.

Road warrior

Un road warrior è semplicemente un utente mobile che è da qualche parte su internet, che potrebbe [non] avere un indirizzo IP statico, e desidera comunicare con la sede della sua azienda. Questa è la definizione che identifica la connessione fra un utente esterno alla rete aziendale e la rete stessa. L'esempio più comune di questo scenario è rappresentato da un computer “L” collegato in dialup (o xDSL) ad un ISP.

             _______                   |
+---+       /       \      +----+      |      -+
| L |-------| I'net |------| R  |------+   +--+|
+---+       \_______/      +----+      |---|WS|
                                       |   +--+

Subnet to Subnet (site-to-site)

Questa è la definizione che identifica una connessione VPN fra una o più sedi. In pratica si sfrutta questa configurazione per collegare varie subnet per formare un'unica LAN rendendo disponibili i servizi di rete (servers, stampanti, web, applicazioni, ecc.) agli utenti dell'azienda indipendentemente dalla loro locazione. Questo è lo scenario dove si desidera avere una subnet dietro un router di qualche tipo che comunica con la subnet aziendale. E' molto comune anche in situazioni dove si ha un host che fornisce l'accesso alla rete per il resto della subnet casalinga e si desidera che l'intera rete sia accessibile dalla rete aziendale.

+--+  |                  _______                   |
|WS|--|     +---+       /       \      +----+      |      -+
+--+  +-----| R |-------| I'net |------| R  |------+   +--+|
      |     +---+       \_______/      +----+      |---|WS|
      |                                            |   +--+

Architettura

OpenVPN è un software, rilasciato con licenza GPL, che permette di realizzare delle VPN (basate su SSL) che coprono una grande varietà di configurazioni inclusi:

  • l'accesso remoto
  • site-to-site VPN
  • WiFi security
  • soluzioni enterprise per l'accesso remoto con load balancing, failover, ed un'elevata granularità di controllo degli accessi

OpenVPN opera in user space, creando un tunnel point-to-point TCP over UDP/TCP.

Caratteristiche di OpenVPN:

  • implementa connessioni:
    • a livello 2 (bridging) tramite device /dev/tap (Ethernet)
    • a livello 3 (routing) tramite device /dev/tun (IP point-to-point)
  • usa la cifratura SSL/TLS
  • singolo eseguibile binario usato per le connessioni lato server e client
  • demone cross-platform (sshd-like) ⇒ gira in user-space
  • puó usare la libreria LZO per comprimere il flusso di dati
  • metodi di autenticazione e cifratura supportati:
    • basati su chiavi private precondivise aka Static Key mode (Pre-Shared Keys - PSK)
    • basati su certificati aka “SSL/TLS mode” (richiede una RSA Public Key Infrastructure - PKI)
    • basati su smart card
    • username/password (i sorgenti includono uno script perl per verificare le credenziali utente/password per mezzo dei moduli PAM e dei plugin auth-pam)
  • permette di definire policy per il controllo dell'accesso specifiche per utente/gruppo utilizzando regole di firewalling applicate all'interfaccia virtuale della VPN
  • non è una VPN con interfaccia web
  • non è compatibile con IPsec o altri software VPN

OpenVPN lavora esclusivamente in user space con l'ausilio dei device TUN/TAP, permettendo la creazione di interfacce virtuali che consentono di instaurare connessioni point-to-point. OpenVPN concentra tutto il traffico dati e di controllo su una singola porta IP. Puó usare una porta UDP (default) oppure TCP. Puó funzionare attraverso la maggior parte dei server proxy (HTTP incluso) e non ha problemi ad integrarsi col NAT. Il server puó inviare alcune opzioni di configurazione di rete ai client (indirizzo IP, rotte e alcune opzioni di connessione) tramite la direttiva push.

A ===============(TCP/UDP tunnel)============== B
 ^^/dev/[tun,tap]               /dev/[tun,tap]^^

A, B: hosts
/dev/tun: IP point-to-point virtual device
/dev/tap: Ethernet virtual device

default: UDP port 1194

/dev/tun e /dev/tap sono gestiti dal modulo tun.ko (kernel/drivers/net/tun.ko in linux 2.6)

$ ls -l /dev/net/tun
crw-rw-rw- 1 root root 10, 200 2008-10-19 20:53 /dev/net/tun
      host A                               host B
   -------------                        -------------
5 | application |                      | application | 5
4 |   TCP/UDP   |       /dev/tun       |   TCP/UDP   | 4
3 |     IP      |<====================>|     IP      | 3
2 |  Ethernet   |<====================>|  Ethernet   | 2
1 |     phy     |       /dev/tap       |     phy     | 1
   -------------                        -------------

<==(TCP/UDP tunnel)==>: tunnel OpenVPN

Bisogna utilizzare o interfacce tun su entrambi gli host A e B o interfacce tap su entrambi gli end-point. Non si possono mixare le interfacce, poiché trattano differenti protocolli:

  • l'interfaccia tun incapsula pacchetti IPv4
  • l'interfaccia tap incapsula frame ethernet 802.3

Le interfacce virtuali tun e tap possono essere trattate allo stesso modo delle intefacce fisiche, quindi gli si possono assegnare indirizzi IP o regole di firewalling.

OpenVPN puó incapsulare pacchetti IP (che contengono al loro interno i protocolli TCP o UDP), utilizzando una porta TCP ed SSL/TLS per rendere sicura la connessione TCP con l'altro host. L'incapsulamento del protocollo TCP dentro TCP (TCP-over-TCP) genera problemi di efficienza e di minor robustezza in condizioni di rete congestionata, dato che si stanno utilizzando contemporaneamente 2 protocolli affidabili (TCP). La soluzione consiste nell'utilizzare un incapsulamento IP-over-UDP dato che l'UDP non è un protocollo affidabile e dato che questa mancanza è colmata dalla presenza del TCP (all'interno del pacchetto IP).

Bridging e Routing sono le due modalità di funzionamento di OpenVPN.

Bridging

Il bridging ethernet consiste nel combinare insieme un'interfaccia ethernet con una o più interfacce virtuali TAP in una singola interfaccia bridge. Questo metodo rappresenta l'analogo di uno switch ethernet reale. Il bidge ethernet puó essere pensato come un tipo di switch software e viene utilizzato per collegare interfacce ethernet multiple (fisiche o virtuali) su di un host condividendo una singola subnet IP.

Effettuando il bridging di un'interfaccia ethernet fisica con un'interfaccia TAP gestita da OpenVPN da due luoghi separati, è possibile unire entrambi le reti ethernet come se fossero una singola subnet ethernet, in maniera tale da creare LAN ethernet virtuali molto estese.

Questa modalità viene utilizzata quando si ha bisogno di far girare protocolli diversi da IPv4 (es. IPX, IPv6) o protocolli di livello 2 (es. NETBIOS) o quando le applicazioni utilizzano il broadcasting. In questa modalità, infatti, viene instradato anche il traffico broadcast. Questa modalità di funzionamento è anche abbastanza facile da configurare per i road warriors.

Questa tecnica, comunque, risulta meno efficiente del routing e non è molto scalabile.

Routing

La tecnica del routing permette di risolvere i problemi di una VPN molto estesa facendo uso di subnet separate e impostando le rotte tra di queste. Tra i vantaggi rispetto alla soluzione bridging:

  • maggiore scalabilità
  • maggiore efficienza (tramite l'impostazione di una MTU ottimale)

Tra gli svantaggi:

  • essendo una soluzione a livello 3 non viene instradato il traffico di livello 2 per cui non vi è la possibilità di far girare protocolli diversi da IPv4 (solo in casi speciali IPv6) o protocolli di livello 2 (no broadcasting).
  • devono essere impostate delle rotte ogni volta che si collega una subnet

Sicurezza

Una VPN dovrebbe proteggere da:

  • attacchi passivi
  • attacchi attivi

Un attaccante passivo (eavesdropper) cattura il flusso di dati tra due host e non è in grado di modificarli. La cifratura protegge efficacemente da questo tipo di attacchi.
Un attaccante attivo, invece, è in grado di inserirsi nella comunicazione in corso e aggiungere, modificare, cancellare pacchetti di dati da entrambi le parti della comunicazione (attacchi man-in-the-middle). Quest'ultimo tipo di attacchi vengono contrastati mediante l'autenticazione: ogni pacchetto viene firmato con un hash in modo che la destinazione sia in grado di verificare se il mittente è legittimo. Per autenticare i pacchetti OpenVPN usa la tecnica HMAC - keyed-hash message authentication code (tramite HMAC è infatti possibile garantire sia l'integrità che l'autenticità di un messaggio). HMAC non è legata a nessuna funzione di hash particolare, ma le più utilizzate sono MD5 e SHA-1 (OpenVPN utilizza quest'ultima). Per evitare possibili attacchi Man-in-the-Middle, dove un client autorizzato tenta di connettersi ad un altro client fingendosi server, è necessario forzare la verifica del certificato del server da parte dei client. Per far ció, basterà generare il certificato del server tramite lo script build-key-server presente nella directory easy-rsa ed aggiungere nel file di configurazione dei client la seguente opzione:

ns-cert-type server       # dalla versione 2.0 in giu'
;remote-cert-tls server   # dalla versione 2.1 in su'

In questo modo verrà bloccata la connesione, da parte di un client, ad un server che non include la direttiva nsCertType=server nel suo certificato, perfino se il certificato è stato firmato dal file CA nel file di configurazione di OpenVPN.

Anche utilizzando HMAC, si è ancora vulnerabili a due tipi di attacchi:

  • replay attacks
  • known plaintext attacks

La soluzione per quanto riguarda i replay attack consiste nell'includere nel pacchetto in ID univoco o un timestamp, diverso per ogni pacchetto (OpenVPN implementa una protezione dai replay attack attraverso lo Sliding Window Algorithm).

In OpenVPN, la protezione dai precedenti attacchi viene, quindi, realizzata attraverso l'uso della cifratura, l'autenticazione (HMAC), IV randomizzati e la protezione dai replay attack. Ovviamente, tutte queste tecniche non proteggono in alcun modo da attacchi di analisi del traffico, ma, per le esigenze tipiche degli utenti di una VPN, le suddette tecniche sono più che sufficienti dal punto di vista della sicurezza.

Modello di sicurezza a strati di OpenVPN:

  1. utilizzo di HMAC abbinato all'opzione –tls-auth per impedire ad un attacker di fare injection di pacchetti nel sottosistema SSL/TLS
  2. utilizzo di SSL/TLS per l'autenticazione bidirezionale client/server
  3. possibilità di un downgrade dei privilegi con cui viene avviato il demone openvpn tramite le opzioni –user, –group (per contenere exploit di code injection)

Riguardo il primo punto (utilizzo dell'opzione –tls-auth), per garantire maggiore sicurezza (oltre a quella fornita da SSL/TLS), è possibile utilizzare un'ulteriore chiave simmetrica per realizzare una sorta di “firewall HMAC” che protegga da attacchi DoS e flooding su UDP: se un pacchetto del canale di controllo TLS contiene una firma HMAC errata viene scartato immediatamente senza alcuna risposta.

Installazione

Versioni

  • 1.x (non piu' sviluppata — 2001/2004)
    • limitazioni: un solo tunnel per server
  • 2.x (versione attuale — 2004/oggi)
    • multi-client server (il server accetta più connessioni sulla stessa porta UDP o TCP e puó utilizzare diverse configurazioni per ogni singola connesione - fino a 128 tunnel sulla stessa porta).
    • 2.0.9 – rilasciata il 2006.10.01 (stable, production)
    • 2.1rc13 – rilasciata il 2008.10.09 (beta, testing)

Installazione da pacchetto

Dipendenze:

  • openssl - libssl
  • lzo - liblzo

Per distro debian-based (ver 2.0.9):

# apt-get install openvpn

Installazione dai sorgenti

Dipendenze:

  • libssl-dev
  • liblzo-dev
$ tar xvf openvpn-2.0.9.tar.gz
$ cd openvpn-2.0.9
$ ./configure
$ make
# make install

Configurazione

Il file di configurazione di OpenVPN (presente in /etc/openvpn/) contiene, riga per riga, le opzioni passate a openvpn (le stesse che, se passate sulla riga di comando, devono essere anteposte da un doppio trattino).

I commenti sono preceduti da un # o un ;

Static key

Il metodo di autenticazione e cifratura più semplice consiste nell'utilizzare nel server e nel client una chiave simmetrica precondivisa.

Vantaggi:

  • configurazione semplice
  • non è necessario mantenere una PKI (Public Key Infrastructure)

Svantaggi:

  • scalabilità molto limitata: un client, un server
  • se la chiave viene compromessa, lo sono anche le sessioni precedenti
  • la chiave segreta deve essere scambiata utilizzando un canale sicuro preesistente

Scenario di esempio

                                                         _______
  /-----\               +--------+                      /       \              +--------+
  | LAN |---------------| server |----------------------| I'net |--------------| client |
  \-----/      10.8.4.1 +--------+ myremote.mydomain    \_______/     10.8.4.2 +--------+
10.8.4.0/24      (tun0)                                                 (tun0)

Generazione della chiave

$ openvpn --genkey --secret static.key

Configurazione del server

# Use a dynamic tun device.
dev tun
;proto udp   # default setting
;port 1194   # default setting

# 10.8.4.1 (server)
# 10.8.4.2 (client)
ifconfig 10.8.4.1 10.8.4.2

# Pre-shared static key
secret static.key

Configurazione del client

dev tun
;proto udp   # default setting
;port 1194   # default setting

# Indirizzo pubblico server openvpn
remote myremote.mydomain

# 10.8.4.2 (client)
# 10.8.4.1 (server)
ifconfig 10.8.4.2 10.8.4.1

secret static.key

Opzioni aggiuntive

  • Compressione dei dati sul link VPN.

Aggiungere nel file di configurazione del server e del client:

comp-lzo
  • Rendere il link VPN più resistente agli errori di connessioni.

Aggiungere nel file di configurazione del server e del client:

keepalive 10 120
ping-timer-rem
persist-tun
persist-key

L'opzione keepalive 10 120 genera l'invio di messaggi ping-like lungo il link della VPN. Il primo parametro (10) indica che verrà inviato un ping ogni 10 secondi, mentre il secondo parametro (120) indica per quanto tempo (in secondi) il server attenderà una risposta da un client prima di considerare chiusa la connessione.

L'opzione ping-timer-rem viene utilizzata dal server quando avvia openvpn come daemon in listen mode: avvia i timer dei ping periodici solo quando avviene una connessione da parte di un client.

Le opzioni persist-tun e persist-key servono a preservare l'accesso ad alcune risorse (il dispositivo tun o tap e la chiave simmetrica) che potrebbero non essere più accessibili a causa di un downgrade dei privilegi.

  • Downgrade dei privilegi con cui gira il demone openvpn (solo per Linux/BSD/Solaris/MacOSX).

ATTENZIONE! Assicurarsi che il nome utente ed il gruppo siano già presenti nella distribuzione che si sta utilizzando (ad es. per Ubuntu: user “nobody”, group “nogroup”).
Aggiungere nel file di configurazione del server e del client:

user nobody
group nogroup
  • Consentire al client di connettersi all'intera subnet.

Aggiungere nel file di configurazione del client:

route 10.8.4.0 255.255.255.0
  • Regolare la “verbosità” generata dal programma.

Aggiungere nel file di configurazione del server e del client:

verb 3
mute 20
verb 3
valore descrizione
silent, tranne per gli errori gravi
4 va bene per un uso generale
5 o 6 per debug di problemi di connessione
9 estremamente verboso

L'opzione mute 20 serve a terminare il logging dei messaggi ripetuti (in questo caso, il logging sarà terminato dopo 20 messaggi ripetuti).

Configurazione del firewall

  • assicurarsi che la porta UDP 1194 (default) sia aperta sul server
  • l'interfaccia tun utilizzata da OpenVPN non deve essere bloccata nè sul server, nè sul client

Test della VPN

Per verificare il corretto funzionamento della VPN, si dovrebbe essere in grado di pingare l'IP 10.8.4.2 dal server ed il 10.8.4.1 dal client.

Public Key Infrastructure

Il primo passo consiste nel costruire un'infrastruttura a chiave pubblica (PKI), che consiste di:

  • un certificato della master Certificate Authority (CA) e relativa chiave che verrà utilizzata per firmare i certificati del server e di tutti i client
  • un certificato (chiave pubblica) ed una chiave privata per il server e per ciascun client

Notare che:

  • il server necessita solo del suo certificato/chiave – non ha bisogno di conoscere i certificati individuali di ciascun client
  • il server accetta connessioni solo dai client i cui certificati sono firmati dalla CA e siccome il server è in grado di verificare la firma senza accedere alla chiave privata della CA (la parte più sensibile dell'intera PKI), quest'ultima puó essere conservata su un host completamente diverso, anche non connesso alla rete.
  • se una chiave privata viene compromessa, questa puó essere disabilitata aggiungendo il suo certificato alla lista dei certificati revocati (CRL). Questa lista permette ai certificati compromessi di essere selettivamente rigettati senza ricostruire l'intera PKI.
  • il server puó forzare diritti di accesso specifici per client, basandosi su alcuni campi del certificato stesso, come ad es. il “Common Name”

Generazione della PKI

Per generare il certificato della CA ed il certificato/chiave per il server ed i client della VPN si possono utilizzare gli script automatici forniti insieme al pacchetto openvpn (build-ca, build-dh, build-key-server, build-key, clean-all).

Inizializzazione dell'ambiente sul server

Per distro debian-based:

# cp -r /usr/share/doc/openvpn/examples/easy-rsa /etc/openvpn/
# cd /etc/openvpn/easy-rsa/2.0/

Per OpenWRT questi script si trovano già nel PATH e la directory di configurazione è /etc/easy-rsa/

# cd /etc/easy-rsa/

Modificare il file vars inserendo i dati necessari alla generazione delle chiavi/certificati; in particolare occorre modificare le seguenti variabili:

export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"

Settiamo le variabili d'ambiente nella shell corrente:

# source ./vars

Generazione certificato/chiavi per il server

Prima di creare il nuovo certificato e le chiavi occorre eliminare quelli precedentemente creati:

# clean-all

Attenzione! Il precedente comando rimuove la directory keys, quindi assicurarsi di fare un backup delle chiavi o dei certificati precedentemente creati.

Per generare la Certification Autority (CA):

# build-ca

Vengono generati i file keys/ca.[crt,key].

Per generare un certificato e la chiave private del server:

# build-key-server server

Assicurarsi di inserire “server” come Commmon Name e rispondere “y” (yes) due volte: una per firmare il certificato ed un'altra per effettuare il commit. Non è necessario inserire una password o il company name.
Vengono generati i file keys/server.[crt,csr,key].

L'ultimo file da generare è la chiave Diffie Hellman (attenzione! Questocomando potrebbe richiedere molto tempo):

# build-dh

Viene generato il file keys/dh1024.pem.

Opzionalmente è possibile generare un'ulteriore chiave (simmetrica) per proteggersi da attacchi DoS:

# openvpn --genkey --secret ta.key

Viene generato il file ta.key.

Generazione certificato/chiavi per i client

Per ogni client bisogna generare un certificato ed una chiave unica:

# build-key client1

dove client1 deve essere sostituito dal nome del client (Common Name) e deve essere univoco. Per completare l'operazione occorre rispondere “y” (yes) due volte, una per firmare il certificato ed un'altra per effettuare il commit. Non è necessario inserire una password o il company name.
Vengono generati i file keys/client1.[crt,csr,key].

Revocare un certificato

La revoca/invalidazione di un certificato puó essere utile nei seguenti casi:

  • la chiave privata associata al certificato è stata compromessa o persa;
  • si vuole terminare l'accesso di un utente della VPN.

Dopo aver inizializzato l'ambiente sul server eseguire:

# revoke-full client2

dove client2 è il Common Name del client di cui si vuole revocare il certificato.
Nella directory keys viene generato/aggiornato il file crl.pem (Certificate Revocation List – CRL).

Successivamente, per permettere la verifica dei certificati revocati da parte del server, occorre inserire nel suo file di configurazione:

crl-verify crl.pem

Da questo momento in poi, i certificati dei client che si connettono vengono verificati con la CRL, e per ogni match positivo la connessione verrà terminata.

NOTA: è possibile revocare alcuni certificati anche se openvpn è in esecuzione, dato che il file crl.pem viene riletto ad ogni nuova connessione o ad ogni rinegoziazione della connessione SSL/TLS (per default una volta ogni ora).

Riepilogo dei file del certificato e delle chiavi

file posizione descrizione segreto
ca.crt server + tutti i client certificato della Root CA no
ca.key solo la macchina che firma le chiavi chiave privata della Root CA SI
ta.key server + tutti i client chiave simmetrica per TLS SI
dh{n}.pem solo il server parametri Diffie Hellman no
server.crt solo il server certificato del server no
server.key solo il server chiave privata del server SI
client{n}.crt solo il client{n} certificato del client{n} no
client{n}.key solo il client{n} chiave privata del client{n} SI

:!: ATTENZIONE! Il file ca.key è quello più importante di tutta la PKI e conviene memorizzarlo su un'altra macchina anche non connessa in rete, ed utilizzata solo per firmare le chiavi.

Configurazione del server

Oltre alle opzioni comuni, bisogna utilizzare opzioni diverse a seconda della modalità di accesso di openvpn (bridging o routing).

Bridging

dev tap
server-bridge 10.8.4.1 255.255.255.0 10.8.4.160 10.8.4.200

Per la configurazione bridging bisogna usare il dispositivo tap.

:!: ATTENZIONE! Se la macchina che farà da server openvpn ha un'interfaccia di bridge già attivata, occorre modificare lo script bridge-start prima di avviarlo (conseguentemente occorre modificare anche lo script bridge-stop).

NOTA: se si vuole riutilizzare un device già “aperto” tramite il comando openvpn –dev tap –mktun o tramite bridge-start, si deve specificare il device aperto (ad es. dev tap0) invece di dev tap in modo che openvpn non apra un altro device (ad es. tap1).

server-bridge
param. valore descrizione
10.8.4.1 IP del server openvpn
255.255.255.0 netmask
10.8.4.160 10.8.4.200 pool di indirizzi IP da assegnare ai client openvpn

Routing

dev tun
server 10.8.4.0 255.255.255.0
server
param. valore descrizione
10.8.4.0 network
255.255.255.0 netmask

Per la configurazione routing bisogna usare il dispositivo tun.

Al server viene automaticamente assegnato l'IP ”.1” (ad es. 10.8.4.1).
Ai client vengono assegnati indirizzi IP che appartengono alla rete specificata ed è possibile assegnare un pool di indirizzi da utilizzare tramite l'opzione ifconfig-pool firstIP lastIP (ad es. ifconfig-pool 10.8.4.160 10.8.4.200).

Opzioni aggiuntive (server)

# protocol and port
;proto udp  # default setting
;port 1194  # default setting

# client directives
max-client n
ifconfig-pool-persist ipp.txt 0
client-to-client

# CA cert. and keys
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
tls-auth ta.key 0

# management console
management IP port

# logging
daemon
;log-append openvpn.log

# privileges
;user nobody
;group nogroup

# additional options
persist-key
persist-tun
comp-lzo
keepalive 10 120
verb 3
mute 20
  • max-client n indica il numero massimo di client (n) che si possono connettere al server (ad es. 40).
  • ifconfig-pool-persist file seconds fornisce un'associazione tra client (individuati dal Common Name) e indirizzi IP virtuali assegnati dal server.

Il file specificato è un file di testo (ASCII) che contiene i valori secondo la seguente sintassi: ,.

ifconfig-pool-persist file seconds
param. valore descrizione
file ipp.txt file/cache degli indirizzi IP assegnati ai client
seconds num. > 0 Il file viene aggiornato a intervalli regolari (in secondi) e viene utilizzato come cache.
seconds Il file viene trattato in sola-lettura. In questo modo è possibile utilizzarlo come file di configurazione.
  • client-to-client permette ai client di “vedersi” a vicenda.
  • tls-auth ta.key 0: per una descrizione completa di quest'opzione si rimanda alla sez. Sicurezza
tls-auth ta.key 0
param. valore descrizione
key-file ta.key chiave simmetrica per TLS
direction 0 per il server, 1 per i client
  • management IP port [pw-file] abilita un server TCP su IP:port (accesso tramite telnet) per utilizzare delle funzioni di management del demone openvpn. In genere, è consigliato impostare il parametro IP a localhost, per ragioni di sicurezza.
management IP port [pw-file]
param. valore descrizione
IP indirizzo IP IP della console di management
IP “tunnel” la console di management diventa accessibile tramite il tunnel VPN
port numero porta porta della console di management
pw-file nomefile (opzionale) nome del file contenente la password di accesso alla console di management (in chiaro nella prima riga o “stdin” per richiederla via prompt)
  • log-append openvpn.log permette di specificare il file di log che verrà utilizzato (in alternativa a log-append, utilizzare l'opzione log se si vuole che il file sia ricreato ad ogni avvio del demone openvpn)

Operazioni avanzate

  • Aggiungere delle rotte ai client per farli accedere a reti private dietro il server
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"

NOTA: è necessario che siano state inserite anche le rotte “di ritorno” dalle reti private al server openvpn.

  • Assegnare degli IP prefissati ai client
    • si puó utilizzare l'opzione ifconfig-pool-persist ipp.txt 0 precedentemente descritta;
    • se bisogna assicurare l'accesso alla VPN anche alla rete privata dietro al client, o come alternativa al metodo precedente, si puó usare la sottodirectory ccd dedicata alle configurazioni specifiche per client.

Se, ad esempio, il client con Common Name “Okane” ha una rete privata 192.168.40.128/255.255.255.248, occorre inserire le seguenti opzioni nel file di configurazione del server:

;client-config-dir ccd
;route 192.168.40.128 255.255.255.248

E successivamente, creare un file ccd/Okane contenente:

iroute 192.168.40.128 255.255.255.248

Questo permetterà alla rete privata di “Okane” di accedere alla VPN.
ATTENZIONE! Questo esempio vale solo per la modalità routing e non per il bridging.

Altro esempio: se si vuole assegnare al client “Okane” l'IP 10.9.0.1 basterà inserire nel file di configurazione del server:

;client-config-dir ccd
;route 10.9.0.0 255.255.255.252

E successivamente aggiungere la seguente opzione in ccd/Okane:

ifconfig-push 10.9.0.1 10.9.0.2
  • Impostare differenti politiche di accesso (firewall) per differenti gruppi di client. Vi sono 2 metodi disponibili:
    1. eseguire più istanze di openvpn, una per ogni gruppo, e configurare appropriatamente le regole di firewalling delle interfacce TUN/TAP per ogni gruppo/demone;
    2. (avanzato) creare uno script che modifica dinamicamente le regole del firewall in base all'accesso dei diversi client (tramite l'opzione learn-address ./script).
  • Redirigere tutto il traffico diretto dai client al default gateway verso la VPN
;push "redirect-gateway"

ATTENZIONE! Per il corretto funzionamento, la macchina che esegue il server openvpn deve nattare le interfacce TUN/TAP.
:!: PROBLEMA: la configurazione di rete dei client puó essere compromessa se i pacchetti del server DHCP locale vengono instradati attraverso il tunnel. Una possibile soluzione consiste nell'assicurarsi che il server DHCP locale sia raggiungibile attraverso una rotta più specifica della default route (0.0.0.0/0.0.0.0).

  • Impostare i metodi di cifratura accettati
;cipher BF-CBC        # Blowfish 128 bit (default)
;cipher AES-128-CBC   # AES 128 bit
;cipher AES-256-CBC   # AES 256 bit
;cipher DES-EDE3-CBC  # Triple-DES

:!: ATTENZIONE! Se quest'opzione viene utilizzata sul server, è necessario inserirla anche nel file di configurazione dei client.

Configurazione dei client

Come al solito, bisogna distinguere le modalità di accesso alla VPN: bridging o routing.

Bridging

dev tap

Routing

dev tun

Opzioni aggiuntive (client)

client
;proto udp   # default setting

# Indirizzo/i pubblico/i del/dei server openvpn
remote myremote1.mydomain 1194
;remote myremote2.mydomain 1194

# load-balancing
;remote-random

Con le opzioni remote e remote-random è possibile inserire il nome di più server openvpn ed abilitare il load-balancing.
:!: ATTENZIONE! Se il server openvpn è dietro un gateway occorre inserire l'indirizzo pubblico di quest'ultimo come parametro di remote.

resolv-retry infinite
;mute-replay-warnings

Le opzioni resolv-retry e mute-replay-warnings sono utili in caso di connesioni tramite notebook e wireless: la prima tenta di risolvere il nome del server openvpn all'infinito ed è utile per host non sempre connessi ad internet (ad es. i noteboook) e la seconda elimina i messaggi di warning relativi alla ricezione di pacchetti duplicati, tipici delle reti wirelss.

nobind

L'opzione nobind non forza l'uso di particolari porte locali.

;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]

Le precedenti opzioni sono utili in caso di connessione di un client tramite proxy.

;cipher BF-CBC        # Blowfish 128 bit (default)
;cipher AES-128-CBC   # AES 128 bit
;cipher AES-256-CBC   # AES 256 bit
;cipher DES-EDE3-CBC  # Triple-DES

L'opzione cipher permette di impostare l'uso dei metodi di cifratura specificati e deve essere utilizzata nel file di configurazione dei client se è presente anche in quella del server.

Altre opzioni:

# SSL/TLS parms.
ca ca.crt
cert client.crt
key client.key
tls-auth ta.key 1

ns-cert-type server       # dalla versione 2.0 in giu'
;remote-cert-tls server   # dalla versione 2.1 in su'

# Downgrade dei privilegi
;user nobody
;group nogroup

# additional options
persist-key
persist-tun
comp-lzo
keepalive 10 120
verb 3
mute 20

Avvio del servizio

Per utilizzare openvpn, bisogna aver caricato il modulo tun del kernel. In genere questo è già caricato all'avvio del sistema, ma, in caso non lo fosse, basta eseguire:

# modprobe tun

Se il dispositivo /dev/net/tun non viene creato automaticamente, bisogna crearlo a mano e assicurare la lettura/scrittura del dispositivo a tutti gli utenti (comandi necessari per Netkit: una rete virtuale):

# mkdir /dev/net
# mknod /dev/net/tun c 10 200
# chmod 666 /dev/net/tun

Se si utilizza la modalità bridging

# bridge-start

E successivamente:

# openvpn --config

dove config.ovpn è il file di configurazione di OpenVPN.

NOTA: in sistemi debian-like, prima utilizzare lo script di init fornito con il pacchetto di openvpn, occorre configurare il file /etc/default/openvpn.

Terminazione del servizio

# killall openvpn

oppure

# /etc/init.d/openvpn stop

E se si è utilizzata la modalita bridging:

# bridge-stop

Vulnerabilità conosciute

  • 07-Ago-2008: OpenVPN “lladdr” and “iproute” Directives Code Execution Vulnerability http://www.frsirt.com/english/advisories/2008/2316
    • Versioni affette: dalla 2.1-beta14 alla 2.1-rc8 (l'attuale versione stabile 2.0.9 non è affetta da questo bug)
    • FIX: aggiornare alla versione 2.1_rc9 o maggiore
  • 13-Mag-2008: Problema di sicurezza legato alla debolezza del meccanismo di generazione dei numeri casuali nelle distro debian-based (Ubuntu 7.04, 7.10 e 8.04 LTS) http://www.ubuntu.com/usn/usn-612-3
    • FIX: usare openvpn-vulnkey /path/to/secretkey per verificare la chiave generata con openvpn –genkey –secret /path/to/secretkey. (Attenzione! openvpn-vulnkey testa solo chiavi private RSA di dimensione 1024 o 2048 bit).

Appendice

Configurazione di default di OpenVPN

  • Protocollo: UDP
  • Porta: 1194

NOTA: se si desidera utilizzare entrambi i protocolli TCP e UDP, si devono avviare 2 istanze del demone openvpn.

Indirizzamento reti private

10.0.0.0 10.255.255.255 (10/8 prefix)
172.16.0.0 172.31.255.255 (172.16/12 prefix)
192.168.0.0 192.168.255.255 (192.168/16 prefix)

Riferimenti