OpenVPN
Contenuti
- Introduzione
1.1 Cosa è openvpn?
1.2 Che cosa è una vpn?
1.3 Come si presenta openvpn all’utente?
1.4 Come funziona sulla rete “reale” la vpn?
1.5 Che sistemi di autenticazione e cifratura posso usare. - Preparazione
2.1 Certificati
2.2 File del servizio
2.3 File di configurazione
2.3.1 Server
2.3.2 Client
Introduzione
Cosa è openvpn?
Openvpn è un software open-source per costruire una rete vpn.
Cosa troverete in questo wiki? Questo wiki nasce come sunto delle mie conoscenze di vpn e di openvpn, quindi vuole essere una guida il più possibile ampia sulle gradi capacità di questo software, lasciando al lettore di trovare soluzioni migliori per le proprie esigenze e la libertà di suggerirle nella pagina delle discussioni.
Che cosa è una vpn?
Acronimo di Virtual Private Network, serve a creare una sottorete virtuale, privata e sicura in una rete condivisa(es. internet).
- Virtuale perché i dati viaggiano su un’altra rete (es. intenet).
- Privata perché il traffico rimane occultato a terzi da una cifratura.
- Sicura perché nessuno può entrare senza autorizzazione.
Ad esempio, le aziende possono collegare tra di loro le proprie sedi tramite una VPN su internet. Oppure, sempre tramite VPN, un dipendente potrà tramite lavorare da casa (o qualunque parte del mondo) e accedere alla rete aziendale come se fosse in sede.
Per raggiungere questi scopi una vpn deve utilizzare la cifratura dei dati e l’autenticazione dei client ed eventualmente anche del server. Inoltre la vpn ha anche altri sistemi di protezione per evitari altri modi di violazione.
Come si presenta openvpn all’utente?
La VPN si presenta sia lato server che client come un’interfaccia di rete virtuale e indipendente. Ciò significa che tutti i pacchetti che usciranno da quell’interfaccia saranno cifrati e poi inviati tramite il tunnel vpn. Con tunnel vpn intendiamo la trasmissione protetta dei dati su connessione vpn. Ogni soggetto nella vpn dispone quindi di un proprio indirizzo ip di una determinata sottorete: esattamente come su una rete privata.
Come funziona sulla rete “reale” la vpn?
Ogni client si connette al server openvpn su una porta prestabilita (default 1194). Può funzionare in 3 modi principalmente:
- un solo client si collega ad un solo server,
- più client si collegano al server ma dialogano solo con lui,
- più client si collegano solo al server e dialogano anche tra di loro.
Che sistemi di autenticazione e cifratura posso usare.
Principalmente 2:
- chiave simmetrica precondivisa (o condivisa su rete sicura. Es: ssh)
- Utilizzo di certificati ssl a chiave pubblica-privata.
In questo wiki discuteremo di entrambi.
Preparazione
Certificati
Concettualmente esistono 3 tipi di soggetti nella generazione e uso delle chiavi - Certification Autority (CA) - server - client
questi sono i file in gioco per 1 server e 3 client
| NOME-FILE | NECESSARIO A | COSA È | SEGRETO |
|---|---|---|---|
| ca.crt | server + tutti client | CA certificato | NO |
| ca.key | CA | CA chiave segreta | SI |
| dh{n}.pem | solo server | Diffie Hellman parametri | NO |
| server.crt | solo server | Server Certificato | NO |
| server.key | solo server | Server chiave segreta | SI |
| client1.crt | solo client1 | Client1 Certificate | NO |
| client1.key | solo client1 | vClient1 chiave segreta | SI |
| client2.crt | solo client2 | Client2 Certificate | NO |
| client2.key | solo client2 | Client2 chiave segreta | SI |
CA: la CA possiede i file ca.crt e ca.key. Il suo compito e’ quello di firmare i certificati di tutti per convalidarli. per firmare serve il file ca.key (SEGRETO) mentre a tutti gli altri servira’ il ca.crt per verificare la firma
Il server possiede:
- ca.crt per verificare le firme
- server.crt
- server.key
il client possiede:
- ca.crt per verificare le firme
- server.crt
- server.key
Nel nostro caso pur tenendo separati i concetti di CA e quello di server, li faremo coesistere per comodita’ sulla stessa macchina.
Creiamo l’ambiente
$ . ./vars
facciamo pulizia dalle vecchie chiavi(ATTENZIONE! usare con discrezione)
$ clean all
Creiamo la coppia .key e .crt della CA
$ ./build-ca
coppia per il server
$ ./build-key-sever nome_server
Creiamo una chiave per ogni client
$ ./build-key nome_client
Sul server creiamo i parametri di Diffie Hellman
$ ./build-dh
Ora possiamo distribuire i file come suddetto a chi li necessitate tenendo ben presente che i file segreti dovrebbero stare solo da chi li necessitate.
nel qual caso non avessimo un canale sicuro su cui trasferire ai client (ammesso che tutte le generazione avvengano sul server) possiamo usare un altra strategia
Creiamo sul client la chiave .key e il Certificate Signing Request (CSR) ovvero una sorta di chiave pubblica che dovra’ essere firmata dalla Certification Autority (CA) (ovvero chi possiede il file ca.key)
$ ./build-req nome_client
verrano creati i file nome_client.key (FILE SEGRETO) che rimmarra’ sul client e il file nome_client.csr (non segreto) che verra’ inviato alla nostra CA messo nella cartella ./keys e con il comando
$ sign-req nome_client
//senza il .csr!
in questo modo verra firmato e creato in ./keys il nome_client.crt
Come avrete notato i file *.csr non sono usati da openvpn direttamente, questo proprio perche’ sono da firmare per ottenere i *.crt .
IN SOSTANZA per creare una chiave i passaggi sono:
- creare .key e .csr (una sorta di chiave segreta e pubblica)
- firmare il .csr con ca.key e quindi creare il .crt
./build-key e’ esegue entrambi i passaggi (1) e (2) dato che e’ disponibile il file ca.key localmente . Quando non abbiamo un canale sicuro usiamo ./build-req sulla CA (1) e ./sign-req sul client (2).
LINK: http://openvpn.net/howto.html#mitm
File del servizio
Openvpn e’ attivabile spesso come servizio: lo trovate nella cartella /etc/init.d/ e di solito si chiama openvpn, ma ATTENZIONE che ogni distro lo fa funzionare “a modo suo” Per esempio su gentoo se nella cartella /etc/openvpn avete il file di configurazione che si chiama server1.conf dovete creare nella cartella /etc/init.d/ un symlink con il comando
ln -s /etc/init.d/openvpn /etc/init.d/openvpn.server1
in questo modo digitando
/etc/init.d/openvpn.server1 start
si avviera’ il server vpn. Su debian e derivati ho visto che invece in questo stesso caso bisogna scrivere
/etc/init.d/openvpn start server1
altrimenti con un
/etc/init.d/openvpn start
si avviano tutte le vostre vpn
Ma tutto questo puo’ essere meglio compreso se avete un po di dimestichezza con gli script dei servizi e vi leggete il file /etc/init.d/openvpn
File di configurazione
Server
#################################################
# Sample OpenVPN 2.0 config file for #
# multi-client server. #
# #
# This file is for the server side #
# of a many-clients <-> one-server #
# OpenVPN configuration. #
# #
# OpenVPN also supports #
# single-machine <-> single-machine #
# configurations (See the Examples page #
# on the web site for more info). #
# #
# This config should work on Windows #
# or Linux/BSD systems. Remember on #
# Windows to quote pathnames and use #
# double backslashes, e.g.: #
# "C:\\Program Files\\OpenVPN\\config\\foo.key" #
# #
# Comments are preceded with '#' or ';' #
#################################################
# Questa opzione stabilisce su quale subnet il server vpn deve stare in ascolto. Omettetela per farlo stare in
# ascolto su tutte (Opzionale)
;local a.b.c.d
# Stabilisce su quale porta TCP/UDP il server OpenVPN stara' in ascolto.
# Quella di default e' la 1194
# Questa opzione e' utile se volete diverse istanze di openvpn:
# mettetele in ascolto su porte diverse
port 1194
# TCP o UDP server? Se non sapete cosa scegliere, scegliete UDP
;proto tcp
proto udp
# Definite quale tipo di interfaccia usare
# Per esempio tap e il SO (non-windows) si
# occupera' di usare la prima interfaccia di
# quel tipo libera:
# tap0 o tap1 o tap2
# oppure definire l'interfaccia precisa es. tap0
# Scegliete una delle seguenti tipologie di interfaccia
;dev tap #decidete di usare un interfaccia tap il SO si occupera' di crearne una tap0 , tap1 o tap2 .. ecc
dev tap0 #decidete di creare(se non c'e') e usare l'interfaccia tap0
;dev tun
;dev tun3
# SSL/TLS
ca /etc/openvpn/server/keys/ca.crt
cert /etc/openvpn/server/keys/server.crt
key /etc/openvpn/server/keys/server.key # Chiave segreta
# Diffie hellman parameters.
dh /etc/openvpn/server/keys/dh1024.pem
# Il server si occupera' di dare un ip per ogni client(riconosciuto dal certificato)
# e di riservarglielo per le connessioni future(vedi oltre)
server 192.168.10.0 255.255.255.0
;server 10.6.0.0 255.255.255.0
# Mantiene un registro degli ip virtuali assegnati
ifconfig-pool-persist server/ipp.txt
# Questa opzione fa in modo che i client utilizzino automaticamente
# il server vpn come gateway di dafault (per il default route)
push "redirect-gateway def1"
push "dhcp-option DNS 192.168.1.1"
;push "dhcp-option WINS 10.8.0.1"
# Con questa opzione scommentata i client di
# questa vpn si potranno "vedere" tra di loro
client-to-client
keepalive 10 120
;tls-auth ta.key 0 # This file is secret
comp-lzo
;max-clients 100
;user nobody
;group nobody
persist-key
persist-tun
status openvpn-status.log
verb 3
;mute 20
;crl-verify /etc/openvpn/server/keys/crl.pem
Client
##############################################
# Sample client-side OpenVPN 2.0 config file #
# for connecting to multi-client server. #
##############################################
client
dev tap0
;dev tun
;proto tcp
proto udp
# l'hostname/IP e la porta del server.
remote dns-o-ip_server1 1194
remote dns-o-ip_server2 1194
;remote my-server-2 1194
;remote-random
resolv-retry infinite
nobind
;user nobody
;group nobody
persist-key
persist-tun
;http-proxy-retry
;http-proxy [proxy server] [proxy port #]
;mute-replay-warnings
# SSL/TLS
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/client.crt
key /etc/openvpn/server/client.key
;ns-cert-type server
;tls-auth ta.key 1
comp-lzo
verb 3
;mute 20