OpenVPN Installazione e configurazione Premessa Una VPN (Virtual Private Network) e un modo per collegare in modo sicuro due entità (host, lan) tramite una rete non dedicata pubblica e quindi non sicura (tipicamente Internet), abbattendo quindi i costi delle linee. Lo scopo delle reti VPN è quindi quello di offrire le stesse caratteristiche, in termini di sicurezza, delle linee private ad un costo inferiore sfruttando le reti condivise pubbliche. La sicurezza della tramissione dei dati è ottenuta crittografando gli stessi (tunnel) ed attuando un meccanismi di reciproca autenticazione fra le entità della VPN. Cosa è OpenVPN OpenVPN è un programma per attivare VPN. È usato per creare tunnel crittografati punto-punto fra computer/lan. I suoi punti di forza, oltre ad essere open source, sono il fatto che si appoggia per il proprio funzionamento al pacchetto OpenSSL e pertanto, demandando a quest ultimo tutta la parte di cifratura, può fruttare gli innumerevoli algoritmi offerti da OpenSSL. I metodi di autenticazione sono: mediante chiave condivisa segreta, mediante certificato X509, inoltre è possibile aumentare la sicurezza di ciascuno dei precedenti metodi di autenticazione mediante l uso di username e password. Prerequisiti per OpenVPN L installazione del demone OpenVPN ha bisogno dei seguenti requisiti: OpenSSL (versione la più possibile aggiornata) Compilatore C/C++ (ad esempio Gcc) libreria lzo Installazione libreria LZO (lato server) sito http://www.oberhumer.com/opensource/lzo/download tar xfz lzo-x.y.tar.gz cd lzo-x.y./configure make make check make install Download di OpenVPN (lato server) Per procurarsi OpenVPN occorre scaricarlo dal sito ufficiale http://www.openvpn.net/index.php/downloads.html prelevando la versione stabile più aggiornata (quando questo documento è stato scritto la versione corrente era la 2.0.9). Scaricare e spacchettare quindi il file tar.gz dei sorgenti salvandolo in una cartella locale (ad esempio /usr/local/src), cioè: cd /usr/local/src ; cambiare /usr/local/src con il nome del posto dove si vuole scaricare il software nel caso sia diverso wget http://www.openvpn.net/release/openvpn-x.y.z.tar.gz; sostituire x.y.z con la versione corrente del software tar xfz bind-x.y.z.tar.gz Il risultato dei precedenti comandi sarà la creazione di una nuova cartellina dal nome openvpnx.y.z; entrarvi dentro con il comando: Autore: Gian Piero Borello (gianpiero.borello@infm.it) - Ultima revisione: 26/02/2009 - Pagina 1/7
cd openvpn-x.y.z Compilazione di OpenVPN (lato server) Dopo lo scaricamento si deve effettuare la compilazione e la installazione del software con i seguenti comandi:./configure \ --prefix=/usr/local/openvpn \ --sysconfdir=/etc/openvpn \ --mandir=/usr/local/man make make install NB: lo switch --prefix definisce il percorso dove sarà installato il pacchetto OpenVPN, gli switch -- sysconfig e --mandir definiscono rispettivamente i percorsi dove saranno presenti i file della configurazione ed i manuali del pacchetto. Una volta finita l installazione si può verificare la buona riuscita dell operazione controllando la presenza del file binario openvpn nella directory /usr/local/openvpn/sbin mediante il comando: ls /usr/local/openvpn/sbin/openvpn creiamo infine la directory che conterrà i file di configurazione mkdir /etc/openvpn Generazione del device (lato server) controllare se esiste il device /dev/net/tun, nel caso non esista occorre crearlo usando i seguenti comandi: mknod /dev/net/tun c 10 200 modprobe tun Generazione delle chiavi (lato server) andare nella directory easy-rsa presente nella directory dei sorgenti di openvpn (per noi /usr/local/src/openvpn-x.y.z/easy-rsa) cd easy-rsa editare il file vars assegnando alle direttive KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, KEY_EMAIL i corretti valori corrispondenti all organizzazione a cui si appartiene N.B. nello stesso file (vars) è presente anche la direttiva KEY_SIZE (di default settata a 1024) la quale definisce la dimensione in bit della chiave RSA usata da OpenVPN. Per rendere maggiore la sicurezza della VPN si può aumentare tale valore a 2048. eseguire i seguenti comandi per ottenere i file di CA: Autore: Gian Piero Borello (gianpiero.borello@infm.it) - Ultima revisione: 26/02/2009 - Pagina 2/7
../vars./clean-all./build-ca # il comando cancellerà TUTTO il contenuto della sottodir keys generare il certificato e la relativa chiave del server:./build-key-server server rispondere alle domande e scegliere una password di challenge generare i certificati e le relative chiavi per i client1, client2,, clientn # usare./build-key-pass al posto di./build-key se si vuole che il certificato dei client sia protetto da passphrase./build-key client1./build-key client2./build-key clientn generare i parametri Diffie-Hellman delle chiavi generate./build-dh entrare nella directory keys e generare il file per la autenticazione TLS cd keys /usr/local/openvpn/sbin/openvpn --genkey --secret ta.key Copiare nella directory del server (/etc/openvpn) i seguenti file (i file sono presenti nella sottodirectory keys) ca.crt server.crt server.key dh1024.pem ta.key Copiare sulla macchina client i seguenti file (i file sono presenti nella sottodirectory keys) ca.crt clientx.crt (dove X è 1,2,...,N nell esempio) clientx.key (dove X è 1,2,,N nell esempio) ta.key Script di controllo username/password (lato server) Se si vuole che l utente, che si connette via VPN, sia autorizzato non solo presentando un certificato ma anche tramite una coppia username/password è necessario generare uno script bash che restituisca 0 (username/password corretta) o 1 (errore) confrontando la username/password inviata appunto dall utente stesso con una lista di username/password autorizzate. creare un il file /etc/openvpn/verify.sh con il seguente contenuto: #!/bin/bash username_password[0]="user0:pass0" # sostituire le coppie username/password Autore: Gian Piero Borello (gianpiero.borello@infm.it) - Ultima revisione: 26/02/2009 - Pagina 3/7
username_password[1]="user1:pass1" username_password[2]="user2:pass2" username_password[3]="user3:pass3" log_file="/var/log/openvpn.log" if [[! $username ]] [[! $password ]]; then echo "No username or password: $*" exit 1 fi for (( i = 0 ; i < ${#username_password[@]} ; i++ )) do if [[ "$username:$password" == ${username_password[$i]} ]]; then echo `date` User $username logged in >> $log_file exit 0 fi done echo `date` $username/$password are unknown >> $log_file exit 1 File di configurazione (lato server) creare un il file /etc/openvpn/server.conf con il seguente contenuto: local IP_SERVER port 1194 proto udp dev tun ca /etc/openvpn/ca.crt cert /etc/openvpn/server.crt key /etc/openvpn/server.key dh /etc/openvpn/dh1024.pem server 10.20.30.0 255.255.255.0 # IP server - utile se si ha più di una scheda eth sul server # porta openvpn # protocollo openvpn # device openvpn # certificato CA # certificato server # chiave server # Diffie hellman file # rete VPN (il server è 10.20.30.1, i client da 2 in poi) ifconfig-pool-persist /etc/openvpn/ipp.txt # i client avranno ogni volta lo stesso IP ;push "route 192.168.10.0 255.255.255.0" # rotta verso lan dietro al server VPN (NECESSARIA se si vuole raggiungere un servizio NON presente non nel server VPN) ;push "route 192.168.10.5 255.255.255.255" # rotta verso host dietro al server VPN (NECESSARIA se si vuole raggiungere un servizio NON presente non nel server VPN) auth-user-pass-verify /etc/openvpn/verify.sh via-env # obbligo check username/password keepalive 10 120 tls-server tls-auth /etc/openvpn/ta.key 0 cipher BF-CBC ;cipher AES-128-CBC ;cipher AES-256-CBC ;cipher DES-EDE3-CBC comp-lzo # heartbeat in secondi fra server e client # lato server criptazione TLS # autenticazione HMAC sul layer TLS # crittazione traffico - Blowfish (default) # crittazione traffico AES 128 (più sicuro) # crittazione traffico AES 256 (più sicuro) # crittazione traffico - Triple-DES (più sicuro) # traffico trasmesso in modo compresso Autore: Gian Piero Borello (gianpiero.borello@infm.it) - Ultima revisione: 26/02/2009 - Pagina 4/7
max-clients 5 user nobody group nobody/nogroup persist-key persist-tun # numero client contemporanei # user del demone # gruppo del demone # controlli di sicurezza per evitare accessi non autorizzati a risorse # che saranno isolate quando il demone farà il downgrade uid/gid log-append /var/log/openvpn.log verb 3 # file di log # verbosità del log touch /var/log/openvpn.log chmod 666 /var/log/openvpn.log Creazione del file di log (lato server) Attivazione dell IP forwarding (lato server) Tale operazione serve solo se vogliamo permettere ai client VPN di accedere a servizi presenti su macchine poste dietro al VPN server. Se si vuole solo far raggiungere il server VPN non accorre. echo 1 > /proc/sys/net/ipv4/ip_forward Avvio della VPN (lato server) /usr/local/openvpn/sbin/openvpn --config /etc/openvpn/server.conf & tale comando può essere messo in esecuzione automatica all avvio mediante /etc/rc.local Regole di firewall (lato server) la VPN generata da OpenVPN gira usando le schede di rete virtuali di tipo tun (che a loro volta si appoggiano ad una scheda fisica di tipo eth su protocollo UDP e porta 1194 a meno di scegliere altri protocolli/porte). Di conseguenza è necessario: Abilitare in ingresso il traffico proveniente dall interfaccia ethx, protocollo UDP, porta 1194 iptables -A INPUT -i ethx -m udp -p udp --dport 1194 -j ACCEPT Abilitare in uscita il traffico destinato alla precedente interfaccia (solo se il firewall NON è stateful) iptables -A OUTPUT -o ethx -m udp -p udp --dport 1194 -j ACCEPT Se il servizio da raggiungere (per esempio HTTP) è presente nello STESSO server su cui gira il servizio di VPN occorre allora: Abilitare in ingresso i tipi di traffico che si vogliono fare passare provenienti dall interfaccia tunx (nell esempio di regola attiviamo il servizio HTTP) iptables -A INPUT -i tunx dport 80 -j ACCEPT Abilitare in uscita i tipi di traffico destinato alla precedente interfaccia (solo se il firewall NON è stateful) Autore: Gian Piero Borello (gianpiero.borello@infm.it) - Ultima revisione: 26/02/2009 - Pagina 5/7
iptables -A OUTPUT -o tunx sport 80 -j ACCEPT Se invece si vuole fare raggiungere un servizio presente (per esempio IMAP) su un server (per esempio 192.168.0.4) della lan DIVERSO dal quello su cui gira il servizio di VPN raggiungibile tramite la scheda ethx (per esempio eth1) del server VPN occorre allora: Attivare una regola di forward del traffico proveniente dall interfaccia tunx da/per la scheda di rete eth1. iptables -A FORWARD i tun0 o eth1 j ACCEPT iptables -A FORWARD i eth0 o tun1 j ACCEPT per ulteriore sicurezza si potrebbe far transitare solo il traffico da/per il server 192.168.0.4 da/per porta 143 iptables -A FORWARD i tun0 o eth1 d 192.168.0.4 dport 143 j ACCEPT iptables -A FORWARD i eth0 o tun1 s 192.168.0.4 sport 143 j ACCEPT Abilitare una regola di mascheramento del traffico proveniente dalla rete gestita dall interfaccia tunx (cioè 10.20.30.0/24) verso la scheda di rete ethx (nell esempio eth1). iptables -A POSTROUTING -s 10.20.30.0/24 -o eth1 -j MASQUERADE Installare OpenVPN GUI for Windows Download di OpenVPN (lato client) wget http://openvpn.se/files/install_packages/openvpn-x.y.z-gui-k.w.j-install.exe controllare che il servizio dhcp sia funzionate (importante) nella directory c:\programmi\openvpn\config dovrebbero essere presenti i seguenti file: ca.crt clientx.crt (dove X è 1,2,,N nell esempio) clientx.key (dove X è 1,2,,N nell esempio) ta.key File di configurazione (lato client) creare un file dal nome nome_del_server.ovpn (per esempio server.ovpn) con il seguente contenuto: local IP_CLIENT port 1194 proto udp dev tun ;dev-node MyTap ;route-method exe ;route-delay 2 ca ca.crt cert client1.crt key client1.key # IP client - utile se si ha più di una scheda eth sul client # porta openvpn # protocollo openvpn # device openvpn # se la macchina è XP potrebbe servire # se la macchina è VISTA potrebbe servire # se la macchina è VISTA potrebbe servire # certificato CA # certificato server # chiave server Autore: Gian Piero Borello (gianpiero.borello@infm.it) - Ultima revisione: 26/02/2009 - Pagina 6/7
client remote server.fqn auth-user-pass ns-cert-type server tls-client tls-auth ta.key 1 tls-remote server.fqn cipher BF-CBC ;cipher AES-128-CBC ;cipher AES-256-CBC ;cipher DES-EDE3-CBC comp-lzo persist-key persist-tun verb 3 # client della VPN # IP/nome fqn server della VPN # richiesto invio username/password # controllo che il certificato offerto dal server di tipo "server" # lato client criptazione TLS # autenticazione HMAC sul layer TLS # il CN del server VPN nel certificato SSL deve essere server.fqn # crittazione traffico - Blowfish (default) # crittazione traffico AES 128 (più sicuro) # crittazione traffico AES 256 (più sicuro) # crittazione traffico - Triple-DES (più sicuro) # traffico trasmesso in modo compresso # controlli di sicurezza per evitare accessi non autorizzati a risorse # che saranno isolate quando il demone farà il downgrade uid/gid # verbosità del log Autore: Gian Piero Borello (gianpiero.borello@infm.it) - Ultima revisione: 26/02/2009 - Pagina 7/7