Configurazione per connettere diversi dispositivi portatili a un concentratore Linux con chiavi asimmetriche
Questa dovrebbe essere la configurazione piu` sicura possibile per l'uso con tanti portatili che si connettono individualmente alla rete. Utilizzo certificati e chiavi per l'autenticazione e un pool di indirizzi dinamico. Questa configurazione, cosi` com'e` fatta, accetta fino a 64 client contemporaneamente in quanto usa 4 indirizzi ip (di una subnet privata da 256 indirizzi) per ogni pc linkato. Le chiavi identificano il client, il che significa che è necessario creare una chiave diversa per ogni client, e che se due client che usano la stessa chiave si connettono nello stesso momento, le loro connessioni continueranno a flappare (andare e venire) in quanto si "ammazzano" a vicenda l'una con l'altra. L'uso di una stessa chiave su piu` client è consentito, ma solo se sono connessi uno alla volta. Peraltro siccome la chiave identifica l'utente, non è una buona idea farlo.
Questa configurazione crea un tunnel con routing IP fra subnet diverse (una per la LAN, una dedicata ai clienti in VPN) e non un bridge ethernet.
Per generare i certificati per l'autenticazione uso Easy-RSA, ma potrei usare qualsiasi sistema che mi permetta di mettere in piedi una CA privata.
Impostazione server Linux
- Prima di tutto, installare il pacchetto openvpn
Occorre crearsi una propria CA interna per generare i certificati che useremo per identificare il server e i client. Per fare questo usiamo Easy RSA ../EasyRSA
- Attenzione: la CA va conservata in una macchina sicura. Se qualcuno si impossessa delle chiavi della CA puo` generare certificati validi!
Seguendo quanto indicato qui ../EasyRSA dovrete di fatto fare 4 passi:
- Creare la CA stessa
- Creare una chiave per il vostro server che sia di tipo server
- Creare una chiave per il vostro primo client (che non sia di tipo server)
- Creare il file contenente i parametri DH, per il server. (procedura molto lenta)
Eventualmente (non è obbligatorio) possiamo creare una chiave statica per autenticare i pacchetti TLS, cosi`: openvpn --genkey --secret tls-auth.key (Suggerimento: stando in /etc/openvpn quando si da` il comando, la chiave, con nome tls-auth.key, viene generata gia` nel posto giusto). Questa chiave ha lo scopo di fornire una ulteriore protezione soprattutto contro attacchi di denial of service. Non è necessaria, e certi clienti OpenVPN (per esempio quelli integrati nei telefoni voip Grandstream) non la supportano. In questo caso, sarete costretti a non usarla nemmeno sul server.
Copiare i files "ca.crt", "dh.pem" (o altro nome del file dh, a seconda di come l'avete chiamato), "server.crt" e "server.key" dalla directory delle chiavi della CA (dentro pki/private e pki/issued nel percorso della CA) sul server in /etc/openvpn
- Copiare i files "ca.crt", "tls-auth.key" (se lo volete usare), "client1.crt" e "client1.key" sul client (la posizione di questi files dipende dal client, in ogni caso tenete conto che servono questi files sul client)
Creare un file di configurazione in /etc/openvpn con un nome tipo "server.conf", cosi` fatto:
# configurazione per openvpn 2.5 # per gestire un server per molti client # interfaccia pubblica, porta e protocollo # Non è obbligatorio specificare l' ip della interfaccia. Se lo si omette # openvpn ascolta su tutte le interfacce. In quel caso omettete totalmente la riga # "local x.x.x.x" local 62.123.161.1 port 1194 proto udp # se voglio usare piu` interfacce pubbliche, devo: # togliere la definizione "local" # aggiungere la voce "multihome" # usare "nobind" sui client e piu` righe di "remote" sui client. # Management via telnet solo in locale management localhost 7505 # device usato dalla vpn (univoco per ogni istanza di openvpn) dev tun0 # io sono il server TLS (sempre vero per una conf a un server e molti client) tls-server # il file con dentro il numero primo per l'algoritmo Diffie Helman # (serve solo per il server tls). # il nome deve essere ovviamente uguale a quello del file che avete generato prima. dh dh.pem # il file con la chiave pubblica # della CA che ha firmato i certificati per tutti gli endpoint. ca ca.crt # il file con la chiave pubblica del mio endpoint (il server) cert server.crt # il file con la chiave privata del mio endpoint (il server) key server.key # certificate revocation list. Questo file viene generato dalla CA # quando si revoca un certificato, e va passato a openvpn perche` la revoca # abbia effetto. # essendo che fino a che non revocate il primo cert questo file non esiste, # ho commentato la riga. # crl-verify /etc/openvpn/crl.pem # il file con la shared key per l'autenticazione dei pacchetti # di handshake. A seconda se volete o meno usarlo, questa riga # può essere omessa. tls-auth tls-auth.key 0 # rete per l'interfaccia privata. il server si prende il .1 e # i clienti gli altri indirizzi di questa subnet. # Qui si usa una rete che non sia quella locale del server. server 192.168.99.0 255.255.255.0 # nuova logica di assegnazione degli ip e subnet ai client: # funziona SOLO con openvpn 2.5 in avanti topology subnet # tengo traccia degli indirizzi assegnati ai server e riassegno sempre # quelli usando questo file. (facoltativo) ifconfig-pool-persist server-pool-cache.txt # configurazioni di routing da insegnare ai client che si collegano. # in pratica questo comando dice al client che 192.168.0.0/24 (la mia LAN) va mandato alla vpn # posso ripetere piu` righe con piu` reti/host, e verranno tutti impostati nel routing del client # nel momento in cui questo si collega. push "route 192.168.0.0 255.255.255.0" # configurazioni varie da insegnare ai client. Anche in questo caso, insegno al client # che deve usare il mio DNS mentre è connesso alla VPN, che il dominio interno è "pippo.locale" # e che c'e` un server WINS. Ovviamente il WINS e` facoltativo, così come anche gli altri parametri, # però se vogliamo che il client risolva i nomi interni, sarà il caso di metterli. push "dhcp-option DNS 192.168.0.1" push "dhcp-option WINS 192.168.0.2" push "dhcp-option DOMAIN pippo.locale" # workaround per i provider stronzi che rispondono con un loro ip interno alle richieste dns # che dovrebbero dare nxdomain. Inoltre, evita anche il leak di richieste DNS. # si applica SOLO a client da windows da 7 in poi. Non dovrebbe rompere comunque i client diversi. push "block-outside-dns" # consento ai clients di vedersi fra di loro (se non volete, togliete la riga) client-to-client # keepalive e timeout: ping ogni 30 secondi e timeout di 120 secondi. keepalive 30 120 # downgrade dei privilegi dopo l'avvio del server: user nobody group nogroup # in caso di reload, tieni in memoria i dati che non potresti piu` rileggere a causa del privilegio insufficiente persist-key persist-tun # file che indica lo stato delle connessioni, ad uso di chi lo vuole leggere status server-status.log # log verboso per debug verb 3
Lanciare /etc/init.d/openvpn start sul server.
Configurazione per i client Windows
La configurazione per i client windows e linux e` praticamente identica. Qui descrivo quella per windows, ma per Linux basta prendere i files di configurazione e metterli in /etc/openvpn (in linux il file di confiugurazione non ha estensione .ovpn ma .conf).
Installare il client openvpn per windows, scaricandolo da http://www.openvpn.net, nella sezione "Community software / downloads". Il link diretto, che non e` detto che funzioni sempre, e` questo: https://openvpn.net/community-downloads/
- Raccogliere tutti i files necessari per il client, che sono "ca.crt", "tls-auth.key" (se lo volete usare), "client1.crt" e "client1.key"
Creare il file di configurazione con il nome che volete voi, purche` abbia estensione "ovpn". Ad esempio, il file potrebbe essere ufficio.ovpn. Il contenuto sarà questo:
client dev tun proto udp nobind float remote <hostname o ip pubblico del server> # file con le chiavi che abbiamo copiato prima dalla directory di easy-rsa: ca ca.crt cert client1.crt key client1.key # il certificato del server deve essere di tipo "server" # questo evita che chi possiede un certificato client possa spacciarsi per server remote-cert-tls server # il file con la shared key per l'autenticazione dei pacchetti # di handshake. Se sul server l'abbiamo usato, dobbiamo usarlo sul client, # altrimenti non dobbiamo. tls-auth tls-auth.key 1 #loglevel 3 verb 3
Tutti i files che abbiamo messo assieme vanno quindi messi nella directory delle configurazioni del client VPN, che è (alla versione attuale del client) c:\Program Files\OpenVPN\config oppure c:\Users\$USERNAME\OpenVPN\config
Configurazione "monolitica" con i certificati entrocontenuti
Volendo, è possibile creare un unico file di configurazione, che contiene anche i vari certificati, chiavi, e files "accessori". Questo file può essere usato da tutti i client a me noti ad oggi (windows, android, ios, linux) ed è più comodo da gestire rispetto al gruppo di files che abbiamo visto in precedenza.
Per farlo, in pratica si copia e incolla il contenuto dei vari files di certificato (ca.crt, client.crt, client.key, tls-auth.key) dentro al file di configurazione, all'interno dei vari blocchi <xxx> </xxx>. E` sufficiente seguire lo schema qui sotto. Notare il comando key-direction 1 che sostituisce il parametro 1 della voce tls-auth tls-auth.key 1 dell'esempio precedente.
In fondo alla pagina c'è uno script per convertire configurazioni standard in monolitiche (lo script gira su linux, ma ovviamente genera config per qualsiasi client)
Tutte le voci di configurazione che non fanno riferimento a dei files vanno lasciate esattamente come prima.
Nota bene: se la chiave e` crittata, anziche` la voce -----BEGIN RSA PRIVATE KEY----- e relativo end, occorre usare la voce -----BEGIN ENCRYPTED PRIVATE KEY----- e relativo end.
# qui vanno tutte le voci di config # che non fanno riferimento a dei files key-direction 1 <ca> -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- </ca> <cert> -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- </cert> <key> -----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY----- </key> <tls-auth> -----BEGIN OpenVPN Static key V1----- ... -----END OpenVPN Static key V1----- </tls-auth>