User Tools

Site Tools


openvpn:openvpn_con_certificati

This is an old revision of the document!


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) 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>
openvpn/openvpn_con_certificati.1758372660.txt.gz · Last modified: by 127.0.0.1