Se state realizzando una VPN per consentire a sedi distaccate della vostra azienda di comunicare in sicurezza, oppure se avete dei collaboratori fidati ai quali volete consentire l’accesso sicuro alle risorse della vostra rete senza esporne i servizi su Internet, OpenVPN è la soluzione più economica, sicura e flessibile che io conosca. Si tratta di un software che, utilizzando le librerie SSL, è in grado di stabilire un tunnel criptato tra due o più host attraverso il quale far transitare qualunque protocollo di rete di livello 3 (e superiori). Difatti, OpenVPN può essere usata per realizzare VPN layer 2 e layer 3 con estrema facilità. In questo post, tuttavia, non parlerò dei vari modi di configurare OpenVPN, ma piuttosto di come realizzare una propria Certification Authority da utilizzare per generare e firmare i certificati SSL da distribuire agli host che parteciperanno alla VPN. Il tutto avviene con l’ausilio del pacchetto easy-rsa, incluso nelle distribuzioni di OpenVPN. Supponendo che abbiate già installato il pacchetto OpenVPN, i semplici passi da eseguire sono i seguenti:
- fate una copia di easy-rsa in una directory di vostro gradimento, in modo da lasciare inalterati i file installati dal pacchetto. I file originali si trovano, solitamente, in /usr/share/doc/openvpn/examples/easy-rsa/2.0
- spostatevi nella directory prescelta e modificate il file vars introducendo i valori pertinenti con la vostra organizzazione
- scompattate il file openssl-0.9.8.cnf.gz col comando gunzip
- eseguite il comando source vars
- create la directory keys
- all’interno della directory keys, create i file di testo index.txt e serial; il primo deve essere vuoto, mentre il secondo deve contenere soltanto una riga con 00 (due zeri). Questi due file costituiranno il database dei certificati prodotti
- generate i parametri Diffie-Hellman col comando ./build-dh
- generate il certificato della vostra Certification Authority (root certificate) col comando ./build-ca; verrà generato il certificato (pubblico) e la relativa chiave, da custodire accuratamente e non condividere con nessuno
- generate e firmate il certificato per il server OpenVPN con il comando ./build-key-server <nome-certificato-server>
- generate i certificati per i vostri client con il comando ./build-key <nome-certificato-client>; cercate di utilizzare una nomenclatura consistente e significativa per i certificati, tipicamente usando il nome host del dispositivo cui verranno assegnati.
Se uscite dalla shell o dall’emulatore di terminale, nel momento in cui avrete necessità di generare altri certificati client e/o server, ricordatevi di entrare nella directory di easy-rsa, eseguire nuovamente il punto 4 e poi i punti 8 e/o 9. Non rigenerate il Diffie-Hellman né tantomeno il root certificate!
A questo punto avete tutto ciò che occorre per configurare un server OpenVPN ed i relativi client, a cui distribuirete certificati e chiavi corrispondenti. Un’osservazione importante: la Certification Authority è quel sistema che vi consente di gestire la vostra infrastruttura di chiavi pubbliche (PKI), pertanto sarebbe meglio tenerla sempre al sicuro, lontana da personale non fidato e, soprattutto, non connessa alla rete pubblica (Internet). Se qualcuno dovesse venire in possesso del vostro certificato root e della relativa chiave, potrebbe generare e firmare certificati che verrebbero riconosciuti come vostri, con seri danni per la vostra attività e la vostra sicurezza!
Un’ultima considerazione riguarda la possibilità di revocare un certificato precedentemente emesso; questo non vuol dire “riprendersi” il certificato copiato su un host, ma renderlo inutilizzabile da parte di chi lo detiene. A tal fine si usa una CRL – Certificate Revocation List, che il server deve conoscere in modo da poter discriminare tra certificati validi e non. Per revocare il certificato bisogna innanzitutto disporre di una sua copia, motivo per il quale è sempre consigliabile avere un backup sicuro di tutti i certificati emessi. La revoca avviene utilizzando lo script revoke-full presente nella directory di easy-rsa; ricordate sempre di eseguire source vars prima di questa operazione. Supponendo di voler revocare il certificato denominato client01, dunque, è sufficiente eseguire il comando:
[cc lang=’bash’ line_numbers=’false’]./revoke-full client01[/cc]
Se non esiste già una CRL, essa verrà prodotta nel file keys/crl.pem; per vedere i numeri seriali dei certificati revocati potete usare lo script list-crl. Se aprite il file index.txt potrete osservare che la riga corrispondente al certificato revocato inizierà con una lettera R, mentre le righe corrispondenti ai certificati validi inizieranno con la lettera ‘V’.
In un prossimo articolo descriverò alcuni esempi di configurazione di OpenVPN, in modo da mostrare in che modo si usano le chiavi e i certificati che abbiamo imparato a manipolare. In realtà ho già accennato al tema in un vecchio post, ma cercherò di essere più chiaro e di riportare maggiori esempi.