Installazione di una Virtual Private Network con OpenVPN e usando un X509 PKI (public key infrastruction using certificates and private keys)
Come riferimento verra' utilizzata una distribuzione debian Sarge (al momento la stable) e una Fedora Core 6
Il consiglio e' di installare il binario disponibile con la distribuzione Linux utlizzata. Nel nostro caso:
Debian apt-get install openvpn openssl lzo pam FC6 yum install install openvpn openssl lzo pam
Se non c'e' necessita' di usare IPX, risolvere i nomi con Windows senza installare un server Wins o avere necessariamente i pacchetti in broadcasts e' consigliato usare la modalita' routed, essendo piu' efficiente, scalabile e utilizza meno banda (cosa da non sottovalutare).
Per informazioni dettagliate su bridging vs routing si rimanda alle [http://openvpn.net/faq.html#bridge1 FAQ del sito ufficiale]
Gli indirizzi IP sui quali funzionera' il nostro servizio di VPN dovranno essere scelti tra quelli disponibili per reti private definiti nella [http://www.ietf.org/rfc/rfc1918.txt RFC 1918]
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)
facendo attenzione a non utilizzare reti che possono andare in conflitto con le reti gia' esistenti nei sistemi con i quali interagira' la VPN
Il prossimo passo e' la generazione dei certificati da utilizzare sul server e sui clients.
Per fare cio' e semplificarci la vita ci avvaliamo degli script messi a disposizione di OpenVPN e residenti nella directory easy-rsa. Questa directory puo' trovarsi in varie locazioni in base al tipo di pacchetto, rpm, deb, tgz ecc. o se l'installazione e' avvenuta manualmente. Nell'ultimo caso la directory sara' dove e' stato scompattato il tarpalla.
Nel caso di pacchetti si trova in /usr/share/dov/openvpn/example/easy-rsa o giu' di li'.
Copiamo tutta la directory in /etc/openvpn/easy-rsa cosi' da evitare eventuali sovrascritture da upgrade.
cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn/
Ora editiamo il file vars stanto attenti a riempire i vari parametri KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG e KEY_EMAIL
cd /etc/openvpn/easy-rsa/ vi vars
Inizializziamo la PKI
Attenzione: Su Debian ricordarsi di unzippare openssl.cnf.gz
. ./vars ./clean-all ./build-ca
con build-ca parte la generazione interattiva della certification authority, i parametri impostati su vars saranno presentati come valori di default.
Il campo piu' importante e' il Common Name che in questo caso impostiamo a "vacmf-OpenVPN-CA"
Ora generiamo la chiave per il server
./build-key-server server
Come prima alcuni parametri hanno valori di default e alla richiesta del <strong>Common Name</strong> specificare "server".
Durante la generazione della key verra' chiesto di inserire una password, se non la si inserisce non vierra' chiesta, altrimenti si. Rispondere "y" alle domande:
Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y
A questo punto per il server siamo a posto.
Andiamo ora a generare i certificati e le chiavi per i client. Usiamo ./build-key o build-key-pass (senza o con password)
./build-key client1 ./build-key client2 ... ./build-key clientn
Alla solita richiesta del Common Name specificheremo "client1", "client12", ..., "clientn".
Ora generiamo il Diffie Hellman
./build-dh
Generiamo la chiave direttamente con openvpn da configurare sia sui client che sul server con tls-auth che ci permette di ridurre i problemi dovuti a attacchi DOS e UDP flloding
openvpn --genkey --secret ta.key
Nella directory keys abbiamo ora i seguenti dati:
Filename Needed By Purpose Secret
-----------------------------------------------------------------------------
ca.crt server + all clients Root CA certificate NO
ca.key key signing machine only Root CA key YES
dh{n}.pem server only Diffie Hellman parameters NO
server.crt server only Server Certificate NO
server.key server only Server Key YES
client1.crt client1 only Client1 Certificate NO
client1.key client1 only Client1 Key YES
client2.crt client2 only Client2 Certificate NO
client2.key client2 only Client2 Key YES
client3.crt client3 only Client3 Certificate NO
client3.key client3 only Client3 Key YES
clientn.crt clientN only Clientn Certificate NO
clientn.key clientn only Clientn Key YES
-----------------------------------------------------------------------------
Per la configurazione possiamo partire dai files di esempio allegati a OpenVPN e che si trovano nel tarpalla del sorgente o, per i pacchetto Debian in /usr/share/doc/openvpn/examples/sample-config-files/ o per FC6 in /usr/share/doc/openvpn-x.y/sample-config-files/. Prendiamo i files server.conf e client.conf. Il primo lo copiamo in /etc/openvpn e il secondo lo teniamo da parte per la configurazione del client. Una classica situazione:
# cat server.conf local 192.168.0.1 port 1194 proto udp dev tun ca /etc/openvpn/easy-rsa/keys/ca.crt cert /etc/openvpn/easy-rsa/keys/server.crt key /etc/openvpn/easy-rsa/keys/server.key # This file should be kept secret dh /etc/openvpn/easy-rsa/keys/dh1024.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt push route "192.168.0.0 255.255.255.0" keepalive 10 120 tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0 # This file is secret comp-lzo user nobody group nogroup persist-key persist-tun log openvpn.log verb 3 management 127.0.0.1 1234
Per quanto riguarda i client, gli si devono trasferire le chiavi in totale sicurezza, se si inviano per email, cifrare il messaggio con PGP.
# cat clientn.conf client dev tun proto udp remote ip.de.ser.ver 1194 # se si omette la porta, nella riga precedente, usare "rport 1194" resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert clientn.crt key clientn.key tls-auth ta.key 1 comp-lzo verb 3 mute 20
[http://openvpn.net OpenVPN]
[http://openvpn.net/howto.html OpenVPN 2.0 HOWTO]