OpenVPN

De WikiCat IT
Dreceres ràpides: navegació, cerca

Per començar, de que es tracta quan parlem de VPN? Doncs, no és més que una xarxa virtual privada (Virtual Private Network). Això vol dir que podem connectar-nos a la xarxa LAN de l'empresa, per exemple, des de qualsevol lloc i tenir accés a tots els servidors que tindríem si estiguéssim en la oficina presencialment.

Tot això, ho podrem fer només amb un connector de xarxa, ja que el programa que passarem a explicar més endavant, tindrà que virtualitzar una xarxa nova. Cal assegurar-se que la Raspberry te IP fixa, per tal que quan finalitzem el procés, puguem obrir els ports necessaris al router.

Com hem vist anteriorment, caldrà posar seguretat a la nostra Raspberry Pi, ja sigui pel SSH (canvi d'usuari i password). Penseu que al donar accés a la Raspberry a Internet tots els robots de buscadors o persones amb finalitats malintencionades poden comprometre la nostra VPN.

Instal·lació

A continuació passem a instal·lar el servidor de OpenVPN en una distribució de RaspBian.

sudo apt-get install openvpn openssl

Un cop fet això ja tenim instal·lat el servidor, ara només caldrà fer la configuració que passo a detallar tot seguit.

Configuració

Generar una autoritat de certificació

Per poder generar els certificats de seguretat i que la nostra transmissió sigui segura, caldrà seguir els següents passos:

cd /etc/openvpn
mkdir easy-rsa
cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/* easy-rsa

A continuació una imatge amb totes aquestes instruccions, per a que puguem veure que surt:

4-Ejemplos-copiados-300x195.png

Si per algun motiu teniu un error en quan intenteu copiar la versió "easy-rsa/2.0", significa que la vostra distribució funciona amb la versió 3.0. Per solucionar aquest problema haurem de fer el següent:

apt-get install easy-rsa
rm -R /etc/openvpn/easy-rsa
make-cadir /etc/openvpn/easy-rsa

Per poder executar els scripts que acabem de guardar, haurem d'anar:

cd /etc/openvpn/easy-rsa

Abans de continuar, haurem de modificar una serie de paràmetres del fitxer "vars"

nano vars
Mida de claus
S'ha de localitzar la frase:
export_KEY_SIZE=1024
Un cop localitzada substitueix, si fos el cas, per a què quedi com està a continuació:
export_KEY_SIZE=2048
Dades de l'entitat emissora de certificat

Has de trobar les següents línies, dins del mateix arxiu:

export KEY_COUNTRY=”US”
export KEY_PROVINCE=”CA”
export KEY_CITY=”SanFrancisco”
export KEY_ORG=”Fort-Funston”
export KEY_EMAIL=”me@myhost.mydomain”
export KEY_EMAIL=mail@host.domain
export KEY_CN=Changeme
export KEY_CN=Changeme
export KEY_OU=Changeme

Un cop les tingueu localitzades haureu de canviar les dades per aquelles que us interessen a vosaltres, tal i com es mostra a continuació:

export KEY_COUNTRY=”ES” “Poner las 2 iniciales de tu país”
export KEY_PROVINCE=”CA” “Poner las 2 iniciales de tu provincia”
export KEY_CITY=”s*******a” “Poner el nombre de tu ciudad”
export KEY_ORG=”geekland” “Poner el nombre de la organización”
export KEY_EMAIL=”xxxxxxx@gmail.com” “Usar vuestra dirección de email”
export KEY_EMAIL=xxxxxxx@gmail.com “Usar vuestra dirección de email”
export KEY_CN= wheezy “Usar el nombre del host del servidor”
export KEY_NAME=vpnkey “Designa el nombre de la entidad certificadora que se creará”
export KEY_OI=IT “Departamento de la empresa”

Dins d'aquest fitxer també es pot configurar quan de temps seran vàlids els certificats que es facin.

Un cop modificat el fitxer, desem i tanquem. Ara només caldrà exportar les variables al sistema i ho farem tal i com es mostra a continuació:

source ./vars
Seguidament executem l'script "clean-all". Aquest script eliminarà la totalitat de claus que poden existir en la ubicació: "/etc/openvpn/easy-rsa/keys". Per executat l'script ho fem des del terminal de la forma següent:
./clean-all
Ara ens toca generar els paràmetres Diffie Hellman. Aquests paràmetres s'utilitzen per poder intercanviar les claus entre client i servidor de forma segura. Per fer això cal posar la següent comanda:
./build-dh

Quan finalitzi el procés, podreu observar en la ubicació "/etc/openvpn/easy-rsa/keys" que s'ha generat un fitxer anomenat "dh2048.pem" que conte els paràmetres Diffie Hellman.

Tot seguit podem veure una captura d'imatge on es veu el procés.

5-Creando-buildi-heaffy-300x195.png

Ara ja estem en disposició de fer les claus de la nostra entitat certificadora. Per generar-les només cal executar la següent ordre:
./build-ca

Durant el procés ens farà una serie de consultes però com hem omplert les dades anteriorment, en aquest moment només cal acceptar els valors que hi surten.

Un cop finalitzat, si anem a la carpeta "/etc/openvpn/easy-rsa/keys" podrem observar que tenim un parell d'arxius, que es diuen així:

ca.crt: Es el certificado raíz público de la autoridad de certificación (CA)
ca.key: Este fichero contiene la clave privada de la autoridad de certificación (CA).

Aquests arxius han d'estar protegits i mai han de caure en mans de tercers.

Un cop fet tot això hauríem de tenir la següent pantalla:

6-Entidad-certificadora-creada-300x195.png

Generar els certificats i la clau del servidor OpenVPN

Ara ja estem en disposició de generar el certificat i les claus del nostre servidor. Per fer això, cal introduir la següent comanda:
./build-key-server YourServerName_VPN

Un cop més, ens farà una serie de preguntes que només caldrà acceptar les dades prèviament introduïdes.

Finalment, haurem de ser capaços els següents arxius en la direcció següent:
/etc/openvpn/easy-rsa/keys

YourServerName_VPN.key: aquest fitxer conté la clau privada del server. Cap persona aliena al server ha de tenir accés.

YourServerName_VPN.crt: aquest fitxer correspon al certificat públic del server.

YourServerName_VPN.csr: aquest arxiu és la petició de certificació que envia l'autoritat de certificació. Mitjançant la informació continguda en l'arxiu, l'autoritat pot realitzar el certificat del server una vegada hagi realitzat les comprovacions de seguretat pertinents.

Una vegada tot realitzat, en la pantalla hauries de poder veure una cosa semblant:

7-Certificador-y-clave-servidor-creado-300x195.png

Generar els certificats i les claus del clients

A continuació s'han de generar els certificats i les claus pels nostres clients. Ho farem tot posant la comanda següent:
./build-key user_vpn

Com anteriorment hem citat, ens farà una serie de preguntes que podem contestar amb el mateix valor per defecte o posant les dades de l'usuari en concret.

Una vegada acabat el procés, en la carpeta "/etc/openvpn/easy-rsa/keys" hauriem de veure els següents arxius:

user_vpn.key: aquest fitxer conte la clau privada del client. Com abans, aquest fitxer no ha de tenir accés ningú alie al server. user_vpn.crt: aquest fitxer correspon al certificat públic del server. user_vpn.csr: aquest fitxer és la petició de certificació que s'envia a la autoritat de certificació. Mitjançant aquesta informació, l'autoritat de certificació podrà realitzar el certificat del client una vegada s'hagin realitzat les comprovacions de seguretat pertinents.

NOTA: cal fer aquest procediment, tants cops com a clients hagin de connectar-se al server.

Una vegada fet això, en la pantalla hauria de sortir una cosa semblant això:

8-Certificados-y-claves-clientes-creados-300x195.png

Fortificar la seguretat amb TLS-AUTH

Ara hem de generar una altra clau. Aquesta nova clau ens servira per donar servei TLS i d'aquesta forma fortificar la seguretat del nostre server VPN. Per generar-la caldrà executar la comanda:
cd /etc/openvpn/easy-rsa/keys
Un cop estem dins de la carpeta, cal executar la comanda:
openvpn --genkey --secret ta.key

Hauríeu de ser capaços de veure una cosa semblant en la vostra pantalla:

9-Autentificaci%C3%B3n-TLS-300x195.png

La clau creada ens serveix per introduir una signatura digital HMAC en totes les transaccions del protocol handshake de SSL/TLS entre el client i el server. D'aquesta forma podrem verificar la integritat dels paquets intercanviats entre el client i el server VPN, i en el cas que un client intenti connectar-se al server VPN sense posseir la clau per signar els paquets la connexió no es realitzarà automàticament. A més amb l'ús de autentificació TLS tambè aconseguim preveure els següents atacs:

  • Atacs de denegació de servei DoS.
  • Atacs de denegació de servei per inundació UDP al port del VPN.
  • Escaneig de ports al nostre server per intentar esbrinar les vulnerabilitats.

Resum de claus generades

En aquests moments hem generat un munt de certificats i claus per poder realitzar la connexió. Totes aquestes les podrem trobar en la carpeta següent: "/etc/openvpn/easy-rsa/keys"

A continuació, un quadre resum de quines son les claus i certificats que tenim i en quina carpeta haurien d'estar per poder establir la connexió:

ArxiuDescripcióUbicacióSecret
dh2048.pemParàmetres Diffie HellmanServidor (/etc/openvpn)Si
ca.crtCertificat arrel de la entitat certificadoraServidor (/etc/openvpn) i clientNo
ca.keyClau de l'entitat certificadoraServidor (/etc/openvpn)Si
server_VPN.keyClave del servidor VPNServidor (/etc/openvpn)Si
server_VPN.crtCertificat del servidor VPNServidor (/etc/openvpn) i clientNo
server_VPN.csrArxiu de petició de certificatServidor (/etc/openvpn)No
user_vpn.keyClau privada del client VPNClientSi
user_vpn.crtCertificat del client VPNClienteNo
user_vpn.csrArxiu de petició de certificatServidor (/etc/openvpn)No
ta.keyClau para la Autentificació TLSServidor (/etc/openvpn) i clientSi

NOTA: heu de copiar totes les claus a la ubicació que es mostra en el quadre. No cal dir que per passar les claus al client, s'ha d'utilitzar un canal segur.

Configuració del servidor

Per sort, tenim a la nostra disposició fitxers de configuració standard i d'aquesta forma podrem donar la configuració que nosaltres vulguem. Aquests fitxers es troben comprimits en la següent direcció:
/usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz
El nostre fitxer de configuració del server l'haurem de situar en la carpeta "/etc/openvpn". En aquí, executem en el terminal la següent comanda i editem el fitxer:
nano server.conf

Tot seguit es posa una configuració en mode exemple:

dev tun	-- dispositiu virtual en el qual generem el tunel
proto udp -- protocol de connexió VPN. També es possible utilitzar el TCP
port 1194 -- port que escolta el servei. Aquest port potser qualsevol altre.
ca ca.crt -- certificat de l'autoritat certificadora que es va crear anteriorment.
cert server_VPN.crt -- certificat del server que hem generat prèviament.
key server_VPN.key -- clau privada del server que hem generat prèviament.
dh dh2048.pem -- fitxer dels paràmetres Diffie Hellman.
Server 10.8.0.0 255.255.255.0 -- indiquem quina IP se'ls assignarà als clients de VPN -- tipus 10.8.0.0/24
ifconfig-pool-persist ipp.txt -- creem el fitxer "ipp.txt" on desem quina IP tenen els clients que es connecten al server VPN.
push “route 192.168.1.0 255.255.255.0” -- amb aquesta línia fem que els PCs connectats a la xarxa 192.168.0.1 puguin comunicar-se amb el client VPN i viceversa.
keepalive 10 120 -- el server VPN enviarà un ping cada 10 segons i esperarà la resposta durant com a màxim 120 segons.
tls-aut ta.key 0 -- activació de l'autentificació TLS en el server.
comp-lzo -- activació de la compressió LZO per la transmissió de dades.
max-clients 10 -- numero màxim de clients que es poden connectar al server de forma simultani.
user nobody -- limitem els privilegis del dimoni de VPN i fem que funcioni amb l'usuari "nobody".
group nogroup -- limitem els privilegis del dimoni de VPN i fem que funcioni amb l'usuari "nogroup".
push “redirect-gateway def1” -- marquem que la totalitat del trafic circuli pel nostre VPN.
push “dhcp-option DNS 10.8.0.1” -- definim que les peticions DNS dels clients es facin per mitjà del server VPN ubicat en 10.8.0.1
cipher AES-256-CBC -- algoritme de xifratge que fem servir per la connexió. Per poder conèixer tots els algoritmes disponibles teclejar en el terminal la següent comanda: "openvpn –show-ciphers".
persist-key -- en cas que el server deixi de funcionar no caldrà analitzar de nou les claus.
persist-tun -- dispositiu "tun0" no haurà de ser reobert ni tancat en cas que tinguem que reiniciar el server.
status openvpn-status-log -- fitxer on desarem la informació respecte al tunel generat.
plugin /usr/lib/openvpn/openvpn-auth-pam.so /etc/pam.d/login -- activació de l'script encarregat de realitzar l'autentificació de l'usuari i del client.
verb 3 -- grau de detall de l'estat del tunel en els fitxers "log".

Un cop tots els canvis realitzats, ho desem i tanquem l'editor.

Configuració del client OpenVPN

Tot seguit hem de passar a configurar el client per tal que poguí connectar-se al server. En la carpeta "/etc/openvpn" escriurem la següent comanda en el terminal:
nano client.conf

Com abans, podrem configurar el servei pel client a traves d'algun exemple que ja venen en el programa. Per tal que la connexió sigui un èxit caldrà fer la següent configuració per tal que el client i el server anterior es puguin comunicar. Per tant tot seguit pots veure com hauria de quedar el fitxer pel client:

dev tun	-- dispositiu virtual on es genera el tunel.
proto udp -- protocol de transmissió de paquets que farem servir. També podem utilitzar TCP.
remote vpn.didacticat.com 1194 -- direcció IP publica del host DNS i port on escolta el server VPN. El port es pot canviar, però s'haurà d'adaptar la resta de configuracions al nou port.
resolv-retry infinite -- el client intentarà de forma indefinida resoldre la direcció o nom del host.
nobind -- assignarem ports dinàmics als clients quan hagi retorn de paquets del server al client.
user nobody -- per limitar els privilegis dels clients a VPN les assignem l'usuari "nobody", això no es necessari en Windows.
group nogroup -- per limitar els privilegis dels clients a VPN les assignem al grup "nogroup", això no es necessari en Windows.
persist-key -- en cas de reinici del server no es tindran que tornar a llegir les claus.
persist-tun -- no s'haurà de reobrir ni tancar el dispositiu "tun0" en cas que tinguem reiniciar el client VPN.
ca ca.crt -- certificat de l'autoritat certificadora que hem generat
cert user_vpn.crt -- certificat del client.
key user_vpn.key -- clau privada del client.
ns-cert-type server -- per prevenir atacs "Man-in-the-middle". Els clients només poden acceptar un certificat de server. En aquest camp es poden posar altres alternatives com per exemple "remote-cert-tls server“.
tls-auth ta.key 1 -- activació de l'autentificació TLS en el client.
cipher AES-256-CBC -- algoritme de xifratge entre el client i el server.
auth-user-pass -- per indicar que el client ha d'introduir un nom d'usuari i un password.
auth-nocache -- evitem que els passwords quedin emmagatzemats en la memòria cache del client.
comp-lzo -- activar compressió LZO per la transmissió de dades.
verb 3 -- grau de detall de l'estat del tunel.

Autentificació de l'usuari per mitja de login

Amb tot el que hem realitzat, la connexió ja és una realitat però hi hauria un petit problema. Que passaria si perdéssim el dispositiu amb la connexió VPN???? La resposta és simple, qualsevol persona podria entrar dins de la nostra xarxa privada. Per evitar això cal que es demani un usuari i password al client que es vol connectar, d'aquesta forma ho podríem evitar.

Per evitar-ho cal generar un usuari en el nostre server VPN, tal com fem a continuació:

useradd usuariovpn2 -M -s /bin/false -- generem l'usuari
passwd usuariovpn2 -- canviem o establim un password
deluser usuariovpn2 -- esborrem l'usuari

NOTA: per fer l'autentificació del client d'aquesta forma cal que la configuració del server i client, així ho estableixi.

Configurar les peticions per mitja d'IPTables

Primer de tot, cal posar el bit de "forward" a 1. Per fer això només caldrà executar la següent comanda en el terminal:
nano /etc/sysctl.conf

Busquem la línia "#net.ipv4.ip_forward=1" i la deixem d'aquesta forma "net.ipv4.ip_forward=1".

Un cop fet això cal obrir els ports i fer els enroutaments en el server. Que no serà més que generar unes IPTables, si tenim la mateixa configuració que hi ha en tot el document, ho haurem de fer d'aquesta forma. Obrim el terminal i executem la següent comanda:

nano /etc/rc.local

Un cop obert l'arxiu caldrà escriure les següents regles:

iptables -A FORWARD -i eth0 -o tun0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

Assegurem que les peticions DNS es realitzen pel VPN

Tot seguit s'ha d'establir la seguretat pels DNS, d'aquesta forma cap persona podrà saber on ens estem connectant. Això ho farem canalitzant totes les connexions a traves del tunel del servidor OpenVPN. Així les peticiones DNS també s'enviaran de forma xifrada i el server OpenVPN serà l'encarregat de resoldre-les. Per poder fer això cal instal·lar el programa "dnsmasq" des del terminal, tal com es mostra tot seguit:
apt-get install dnsmasq
Ara ens tocarà obrir l'editor el fitxer de configuració per tal que el programa escolti les peticions DNS. Ho fem aplicant la comanda següent:
nano /etc/dnsmasq.conf

Introduïm les comandes següents al fitxer de configuració:

listen-address=127.0.0.1,10.8.0.1
bind-interfaces

10-configuraci%C3%B3n-dnsmasq-300x195.png

Tot seguit desem els canvis i reiniciem el programes com es mostra a continuació:

/etc/init.d/openvpn restart
/etc/init.d/dnsmasq restart
Es molt probable que aparegui un error, ja que el "dnsmasq" s'executa més ràpid que el servidor. Per solucionar l'error només cal executar la comanda que hi ha a continuació:
nano /etc/rc.local
Haurem de posar en l'ultima línia, la sentencia següent:
/etc/init.d/dnsmasq restart

12-fichero-rc.local_-300x195.png

Obrir ports al router

Si volem donar accés a la xarxa LAN a traves d'internet per mitjà de VPN, cal obrir els ports en el router.

No es objectiu d'aquest manual entrar a explicar com s'ha de fer per cada router.

Com connectar-nos al server

Actualment, ens podem connectar per mitja de múltiples plataformes al nostre server VPN. Ja sigui per Linux, Windows, iOs i Android.

No es objectiu d'aquest manual entrar a explicar cada plataforma per realitzar la connexió.

Seguretat que ens aporta el server VPN

La seguretat que aporta el server OpenVPN que s'acaba de configurar consta de tres capes:

  1. Capa 1 "Autentificació TLS": introduim una signatura digital HMAC als paquest abans de començar l'autentificació reciproca entre client i server. Si no superem aquest test, no iniciem el procès d'autentificació entre client i server.
  1. Capa 2 "SSL/TLS": mitjançant les eines de seguretat proporcionades SSL/TLS es realitza el procés d'autentificació bidireccional entre el client i el server OpenVPN mitjançant claus criptogràfiques.
  1. Capa 2 "Xifratge": dispossa de diverses formes de xifratge disponibles en la transmissió de dades entre el client i el server. A més podem aplicar mesures pels privilegis del dimoni d'OpenVPN siguin els mínims per poder realitzar la funció que tingui encomanda.

Referencia

Tundra - OpenVPN

Geekland - OpenVPN

Pequeños bits sin importancia - OpenVPN

Eines de l'usuari
Espais de noms

Variants
Navegació
Eines