Trabajo de Fin de Máster de los alumnos de la Universidad Europea de Madrid Álvaro Núñez-Romero Casado, Javier José Pecete García, Alejandro Amorín Niño y Juan Antonio Baeza Miralles que describe cómo montar un servicio de VPNs personal sobre una Raspberry Pi usando OpenVPN y Latch.
1. Solución de VPN basada en
Raspberry Pi
Álvaro Núñez - Romero Casado
Javier José Pecete García
Alejandro Amorín Niño
Juan Antonio Baeza Miralles
2. Índice
Instalación del Sistema Operativo 3
Primera configuración e instalación de OpenVPN 4
Generación de claves y certificados 7
Configuración del cliente 13
Conexión con la VPN desde el móvil o PC 19
Posibles ataques 24
Implementación de funcionalidades de seguridad 25
Instalación 25
Configuración 26
Demostración 29
2
3. Instalación del Sistema Operativo
Para empezar se instalará la distribución de Kali Linux para Raspberry Pi, es decir, una
versión adaptada de Kali Linux para arquitectura ARM. La distribución se puede
descargar en el sitio oficial: https://www.offensive-security.com/kali-linux-arm-images/, en
dónde se encuentran las imágenes tanto para la Raspberry original como para la
Raspberry 2/3, así como para muchos otros miniordenadores con arquitectura ARM. Para
nuestro caso descargaremos la imagen para el modelo 2/3.
Para comenzar con la instalación, primero se tiene que descomprimir el archivo que se
ha descargado para obtener el archivo de imagen (.img). Para ello usamos el comando
xzcat en Linux:
xzcat kali-2.1.2-rpi2.img.xz
En Windows se puede utilizar el programa 7-zip para descomprimir este tipo de
extensión.
Ahora ya se puede “quemar” la imagen (.img) que se ha descomprimido en la microSD
que llevará la Raspberry. Para ello se usa el comando dd (en Linux) con la ubicación
dónde tenemos conectada la tarjeta microSD, en nuestro caso se emplea el comando:
dd bs=4M if=kali-2.1.2-rpi2.img of=/dev/sdb
Para Windows se puede usar el programa Win32DiskImager. Este proceso puede llevar
un largo período de tiempo (> 15 min).
Una vez terminada la operación se puede introducir la microSD en la Raspberry y
arrancar el sistema conectándola a corriente.
3
4. Primera configuración e instalación de
OpenVPN
Si se tiene un monitor, un teclado y un ratón se puede hacer uso de ello y manejar la
Raspberry Pi como si fuera un ordenador normal, pero en nuestro caso, que no se
dispone de estos elementos a mano, hacemos uso del protocolo SSH que viene por
defecto instalado en la distribución de Kali Linux para ARM. Se emplea un analizador de
redes para detectar en qué IP se encuentra la Raspberry y nos conectamos por SSH
para configurarla:
ssh root@192.168.1.41
El usuario por defecto es “root” y la contraseña “toor”, por tanto se deberá cambiar
cuanto antes la contraseña del superusuario. Para fortificar el sistema, es aconsejable
crear un nuevo usuario no privilegiado con el que se inicie la sesión SSH y denegar el
login como root directamente. Esto se puede establecer en la configuración de SSH.
Para cambiar la contraseña del superusuario se ejecuta el comando:
passwd
Para crear un nuevo usuario no privilegiado:
useradd vpn
En el comando de ejemplo se crea el usuario “vpn”.
Se configura una IP estática privada editando el fichero /etc/network/interfaces,
quedando de la siguiente forma:
4
5. De esta manera, si se reinicia la Raspberry Pi se podrá acceder siempre mediante SSH
con la IP asignada, en el caso del ejemplo a la IP 192.168.1.90.
Se deben realizar también configuraciones en el router para el correcto funcionamiento.
Se puede fijar la IP para que se asigne siempre la misma a la Raspberry mediante la
asignación estática por MAC como se ve en la figura fijándola en 192.168.1.160.
También se tiene que redireccionar el tráfico al puerto 1194 de la Raspberry ya que este
será el puerto en el que funcione nuestro servicio VPN. Esto lo realizamos declarando
una nueva regla en el Port Forwarding como sigue:
5
6. Por último, en los sistemas actuales domésticos, cuando se instala el router, este tiene
una IP pública y genera una red de IPs privadas para todos los equipos conectados al
mismo. Podemos mediante el DMZ que el router automáticamente asigne como receptor
de las comunicaciones realizadas a esa IP pública la IP de nuestra red que deseamos,
en este caso, la de nuestra Raspberry Pi. Esto se realiza como se muestra a
continuación:
Se actualiza el sistema operativo para aplicar las últimas versiones de las aplicaciones,
resolver vulnerabilidades y problemas conocidos.
sudo apt-get update
sudo apt-get upgrade
Ahora se continua con la instalación del paquete de OpenVPN:
sudo apt-get install openvpn
Pide confirmación para instalar las dependencias que se deben aceptar para continuar
pulsando “S”.
6
7. Generación de claves y certificados
Se deben generar las claves RSA públicas y privadas. Para ejecutar la instrucción se
tiene que ser superusuario:
cp –r /usr/share/easy-rsa /etc/openvpn/easy-rsa
Este comando copia todo el contenido del directorio /usr/share/easy-rsa en /etc/openvpn/
easy-rsa de forma recursiva.
Se cambia de directorio, ahora al directorio dónde se han copiado las claves:
cd /etc/openvpn/easy-rsa
Y se edita el archivo vars:
nano vars
Hay que buscar la variable EASY_RSA y cambiarla por el directorio correcto, el directorio
en el que hemos copiado las claves anteriormente:
export EASY_RSA = “/etc/openvpn/easy-rsa”
Con esto ya se ha indicado el directorio dónde generar los ficheros de claves RSA.
También se debe buscar la variable KEY_SIZE, que tiene un valor de 2048 y cambiar por:
export KEY_SIZE = 1024
Para guardar y salir se pulsa Ctrl+X.
Generamos los certificados CA y root CA. Para ello, estando en el directorio /etc/
openvpn/easy-rsa, se ejecutan los siguientes comandos:
source ./vars
7
8. Este comando carga el archivo vars que se editó anteriormente.
./clean-all
Con este comando se borran todas las claves que pudieran existir previamente.
./build-ca
Por último se genera la entidad certificadora. Tras introducir el comando se mostrarán
unos campos que se deben rellenar para completar la información.
Tras crear los certificados, se da un nombre al servidor para crear su certificado:
./bulid-key-server raspvpn
Vuelven a salir unos campos para rellenar, dónde se tiene que prestar atención a los
campos para poner el nombre que hemos asignado (raspvpn), el resto de campos
dejarles en blanco, confirmación de la firma del certificado (“y”) y confirmar todo (“y”).
Con esto ya se tiene el certificado del servidor configurado.
Ahora se genera la clave para el usuario con el nombre que se quiera, en el ejemplo el
usuario se llamará “user”:
./build-key-pass phone
De la misma manera que cuando se generan las claves del servidor, saldrán campos
que se deben rellenar. En este caso es importante una contraseña de usuario que se
8
9. deberá recordar, el campo (contraseña de reto) dejarlo en blanco, confirmación de la
firma del certificado (“y”) y confirmar todo (“y”).
Se cambia al directorio keys y se ejecuta:
cd keys
openssl rsa –in phone.key –des –out phone.3des.key
De esta manera se está indicando que se quiere utilizar el algoritmo de encriptación
des3. Tras ejecutar el comando pedirá la contraseña que se puso al generar el
certificado del usuario. Se tiene que introducir las veces que lo solicite.
Se vuelve al directorio anterior y se va a generar el intercambio de claves Diffie-Hellman,
el cual permite que dos entidades, sin conocimiento previo una de la otra, intercambien
las claves a través de un servidor público.
cd /etc/openvpn/easy-rsa/
./build-dh
Este proceso lleva un rato, ya que utiliza números aleatorios y busca determinadas
relaciones. Para una generación de 1024 bits se requieren entre 1 y 10 minutos
aproximadamente.
Se va a proteger el servidor VPN contra posibles ataques de denegación de servicios
(DOS):
openvpn --genkey --secret keys/ta.key
Se crea un fichero de configuración con las rutas de las certificaciones, así como las IPs
y puertos debe utilizar, entre otras cosas:
nano /etc/openvpn/server.conf
El fichero está en blanco, por lo que se deberá escribir lo siguiente con la configuración
adecuada:
9
10. # local 192.168.1.90 # SWAP THIS NUMBER WITH YOUR RASPBERRY PI IP
ADDRESS
dev tun
proto udp #Some people prefer to use tcp. Don't change it if you
don't know.
port 1194
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/raspvpn.crt # SWAP WITH YOUR CRT
NAME
key /etc/openvpn/easy-rsa/keys/raspvpn.key # SWAP WITH YOUR KEY
NAME
dh /etc/openvpn/easy-rsa/keys/dh1024.pem # If you changed to 2048,
change that here!
server 10.8.0.0 255.255.255.0
# server and remote endpoints
ifconfig 10.8.0.1 10.8.0.2
# Add route to Client routing table for the OpenVPN Server
push "route 10.8.0.1 255.255.255.255"
# Add route to Client routing table for the OpenVPN Subnet
push "route 10.8.0.0 255.255.255.0"
# your local subnet
push "route 192.168.1.90 255.255.255.0" # SWAP THE IP NUMBER WITH
YOUR RASPBERRY PI IP ADDRESS
# Set primary domain name server address to the SOHO Router
# If your router does not do DNS, you can use Google DNS 8.8.8.8
push "dhcp-option DNS 8.8.8.8" # This should already match your
router address and not need to be changed.
# Override the Client default gateway by using 0.0.0.0/1 and
# 128.0.0.0/1 rather than 0.0.0.0/0. This has the benefit of
# overriding but not wiping out the original default gateway.
push "redirect-gateway def1"
client-to-client
duplicate-cn
keepalive 10 120
tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0
cipher AES-128-CBC
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn-status.log 20
log /var/log/openvpn.log
verb 1
Las líneas comentadas en mayúsculas son las que se deben modificar con la
configuración correcta de la Raspberry Pi.
La Raspberry por defecto no redirige el tráfico de Internet, por tanto hay que editar un
parámetro para permite que el tráfico se redirija. Para ello editamos el archivo:
nano /etc/sysctl.conf
10
11. Descomentamos la línea que pone “Uncomment the next line to enable packet
forwarding for IPv4”
Para aplicar los cambios se ejecuta el comando:
sysctl –p
El comando sysctl configura los parámetros del kernel en tiempo de ejecución, mientras
que el modificador –p indica que se cargue el fichero con los cambios que acabamos de
realizar.
Ya se tiene un servidor en funcionamiento y con acceso a Internet, pero no se puede
utilizar todavía porque hay un firewall integrado que puede bloquear las conexiones
entrantes.
Para arreglar esto, se crea una regla para el firewall que se cargará al inciar la
Raspberry, ya que las reglas del firewall se borran al reiniciar el equipo.
Creamos el archivo con:
nano /etc/firewall-openvpn-rules.sh
El script está en blanco, por lo que se rellena con la configuración correcta:
#!/bin/sh
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --
to-source 192.168.1.90
La IP se corresponde con la IP estática de nuestra Raspberry asignada al principio y
eth0 se corresponde con nuestra tarjeta de red. En el caso de estar conectado a través
de red inalámbrica la tarjeta de red tendrá la forma wlanX.
Como los ficheros que se crean no son ejecutables por defecto se deben asignar los
permisos correctos al archivo /etc/firewall-openvpn-rules.sh:
chmod 700 /etc/firewall-openvpn-rules.sh
11
12. chown root /etc/firewall-openvpn-rules.sh
Se ha creado el script con las reglas para el firewall pero todavía no se ha establecido
para que inicie con cada arranque. Para ello se modifica el archivo interfaces:
nano /etc/network/interfaces
Se añade:
pre-up /etc/firewall-openvpn-rules.sh
Después de la linea:
iface eth0 inet static
Ahora ya se pueden guardar los cambios y salir con Ctrl+X y reiniciar el sistema:
sudo reboot
Hasta aquí ya está listo el servidor. Ahora se debe seguir con la configuración del cliente.
12
13. Configuración del cliente
Anteriormente se ha creado una clave diferente para cada dispositivo que se va a
conectar a la VPN creada con la Raspberry. Ahora hay que generar el fichero de
configuración de cada cliente. Para ello se hará uso de un script desarrollado por Eric
Jodoin, del SANS Institute, que se encarga de generar los ficheros correspondientes
para cada cliente según la configuración de la VPN.
Para empezar se crea un archivo en blanco desde el que se leerán las configuraciones
por defecto:
nano /etc/openvpn/easy-rsa/keys/Default.txt
Se rellenará con lo siguiente:
client
dev tun
proto udp
remote <YOUR PUBLIC IP ADDRESS HERE> 1194
resolv-retry infinite
nobind
persist-key
persist-tun
mute-replay-warnings
ns-cert-type server
key-direction 1
cipher AES-128-CBC
comp-lzo
verb 1
mute 20
Hay que fijarse en donde pone <YOUR PUBLIC IP ADDRESS HERE>, ya que aquí va la
dirección IP pública de la Raspberry. De esta manera, si no se tiene una IP pública
estática, se debe usar un sistema de DNS dinámico en el que se permite configurar un
nombre de dominio y asignarlo a la IP pública, permitiendo acceder a nuestra IP pública
mediante el nombre de dominio y aunque la IP pública cambie.
Se ha elegido el servicio No-IP (https://www.noip.com) ya que es gratuito y permite elegir
el nombre del dominio.
Primero hay que registrarse en No-IP y crear un nuevo nombre de dominio. Para ello
seleccionamos la opción "Hosts / Redirects" y pulsamos en "Add A Host".
13
14. Introducimos los datos de nuestra Raspberry en los campos los datos de la IP pública y
el dominio que queremos crear.
14
15. Después se descarga el DUC (Dynamic Update Client) y se configura. Para ello se
siguen los siguientes comandos:
cd /usr/local/src/
wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz
tar xf noip-duc-linux.tar.gz
cd noip-2.1.9-1/
make install
Si falla el comando make, probablemente no esté instalado el compilador gcc, en ese
caso:
sudo apt-get install build-essential
Así se instalará la colección de paquetes para compilar programas en C/C++ en Linux.
Al realizar la instalación del DUC se solicitarán los datos de la cuenta No-IP, como el
usuario y la contraseña.
Opcionalmente, una vez instalado, se pueden borrar los archivos descargados del DUC:
rm noip-duc-linux.tar.gz
rm -r noip-2.1.9-1/
Para que el servicio No-IP se inicie con la Raspberry en caso de reinicio:
sudo nano /etc/init.d/noip2
El contenido del archivo será:
#! /bin/bash
### BEGIN INIT INFO
### END INIT INFO
sudo /usr/local/bin/noip2
Se asignan permisos de ejecución con:
sudo chmod +x /etc/init.d/noip2
Y finalmente:
sudo update-rc.d noip2 defaults
Ahora ya se puede crear el script de Eric Jodoin:
nano /etc/openvpn/easy-rsa/keys/MakeOVPN.sh
El script automatizará la creación del fichero de configuración del programa cliente y se
encuentra aquí: https://gist.github.com/laurenorsini/10013430
Queda de la siguiente manera:
15
16. #!/bin/bash
# Default Variable Declarations
DEFAULT="Default.txt"
FILEEXT=".ovpn"
CRT=".crt"
KEY=".3des.key"
CA="ca.crt"
TA="ta.key"
#Ask for a Client name
echo "Please enter an existing Client Name:"
read NAME
#1st Verify that client’s Public Key Exists
if [ ! -f $NAME$CRT ]; then
echo "[ERROR]: Client Public Key Certificate not found: $NAME$CRT"
exit
fi
echo "Client’s cert found: $NAME$CR"
#Then, verify that there is a private key for that client
if [ ! -f $NAME$KEY ]; then
echo "[ERROR]: Client 3des Private Key not found: $NAME$KEY"
exit
fi
echo "Client’s Private Key found: $NAME$KEY"
#Confirm the CA public key exists
if [ ! -f $CA ]; then
echo "[ERROR]: CA Public Key not found: $CA"
exit
fi
echo "CA public Key found: $CA"
#Confirm the tls-auth ta key file exists
if [ ! -f $TA ]; then
echo "[ERROR]: tls-auth Key not found: $TA"
exit
fi
echo "tls-auth Private Key found: $TA"
#Ready to make a new .opvn file - Start by populating with the
default file
cat $DEFAULT > $NAME$FILEEXT
#Now, append the CA Public Cert
echo "<ca>" >> $NAME$FILEEXT
cat $CA >> $NAME$FILEEXT
16
17. echo "</ca>" >> $NAME$FILEEXT
#Next append the client Public Cert
echo "<cert>" >> $NAME$FILEEXT
cat $NAME$CRT | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/
p' >> $NAME$FILEEXT
echo "</cert>" >> $NAME$FILEEXT
#Then, append the client Private Key
echo "<key>" >> $NAME$FILEEXT
cat $NAME$KEY >> $NAME$FILEEXT
echo "</key>" >> $NAME$FILEEXT
#Finally, append the TA Private Key
echo "<tls-auth>" >> $NAME$FILEEXT
cat $TA >> $NAME$FILEEXT
echo "</tls-auth>" >> $NAME$FILEEXT
echo "Done! $NAME$FILEEXT Successfully Created."
#Script written by Eric Jodoin
No newline at end of file
Es necesario dar permisos de ejecución al script, ya que por defecto no los tiene:
cd /etc/openvpn/easy-rsa/keys/
chmod 700 MakeOVPN.sh
Finalmente se ejecuta el script con:
./MakeOVPN.sh
Cuando se ejecuta el script se piden los nombres de los certificados que se crearon
anteriormente. Si todo va bien mostrará el mensaje:
Done! Client1.ovpn Successfully Created.
Se debe repetir este paso para todos los clientes creados.
La última cosa que se debe hacer es conectarse a la Raspberry para descargarnos los
ficheros generados con extensión .ovpn. Para ello es necesario usar el protocolo SCP
(Secure Copy Protocol). En Windows se puede usar el programa WinSCP y para Mac
Fugu.
Si no es posible conectarse al directorio de OpenVPN es posible que sea por los
permisos, por lo que es necesario cambiarlos momentáneamente para poder acceder:
chmod 777 -R /etc/openvpn
Una vez copiados los archivos se vuelven a poner los permisos anteriores para que solo
el propietario tenga los permisos y no pueda acceder cualquiera:
17
18. chmod 600 –R /etc/openvpn
Poner los archivos descargados en el programa cliente y ya está todo listo para
conectarse a la VPN.
18
19. Conexión con la VPN desde el móvil o PC
Una vez tenemos la VPN configurada podemos crear múltiples usuarios e instalar
clientes en distintos equipos mediante las aplicaciones propias de cada sistema
operativo.
Lo primero que debemos hacer es repetir algunos de los pasos mostrados anteriormente
para crear el nuevo usuario. Para ello navegamos a /etc/openvpn/easy-rsa y creamos el
usuario mediante el script build-key-pass
Si hemos realizado algún reinicio previo deberemos realizar previamente un "source ./
vars". Recordemos que se debe realizar como usuario con privilegios root.
Ahora nos moveremos al directorio keys y generaremos el fichero 3des y posteriormente
el .ovpn que se usará en el programa cliente.
A continuación debemos crear un fichero .ovpn para cada uno de los perfiles que vamos
a configurar.
19
20. Debemos trasladar cada uno de los archivos de perfil al equipo que nos disponemos a
configurar.
En este caso vamos a realizar 3 instalaciones distintas:
- Macbook Pro Mid 2010 OS X El Capitan 10.11.4: para esta distribución utilizaremos el
software Tunnelbrick. Primero lo instalaremos y una vez instalado pulsamos doble click
en el archivo de perfil ovpn, seleccionamos quien puede usar el certificado e
introducimos la clave del usuario del sistema para instalar el perfil.
20
21. A continuación pulsamos en el acceso directo de tunnelbrick y seleccionamos el perfil
recién instalado. La primera vez que accedamos deberemos poner la clave configurada
en el archivo al crearlo en la raspberry.
Una vez realizados estos pasos nuestra conexión ya está funcionando correctamente.
- Ordenador ASUS Windows 7: utilizaremos el software OPENVPN Connect. Para ello lo
instalaremos e ubicaremos el archivo de perfil ovpn en la carpeta "C:/Archivos de
Programa/Openvpn/config". Seleccionaremos en el acceso directo conectar al perfil
recién instalado e introducimos la contraseña cuando la solicite.
Se realizará la autenticación y la conexión quedará establecida:
- iPhone 5S IOS 9.3.1: Realizaremos la conexión con el software OpenVPN. Una vez
instalado descargamos el fichero de perfil ovpn en el terminal y lo abrimos con la
aplicación. Introducimos la contraseña y se realiza la conexión con el servicio VPN.
21
22. Para probar la conexión a la VPN usaremos nuestro teléfono móvil IOS con el software
OpenVPN Connect.
OpenVPN Connect es la aplicación oficial de OpenVPN, desarrollada por OpenVPN
Technologies, que nos permitirá utilizar todas las prestaciones del programa de código
abierto original en terminales IOS.
Esta herramienta nos permitirá gestionar cualquier red privada virtual desde nuestro
terminal IOS, de la misma forma que lo podríamos hacer desde el ordenador con el
programa de sobremesa. Lo único que necesitaremos hacer será importar el perfil .ovpn
a través de la tarjeta SD, OpenVPN Access Server, un túnel privado o un enlace del
navegador.
Existe un servicio Web alojado en https://www.whatismyip.com/es/ que permite mostrar
cual es la IP pública de nuestra red por la cual salimos a la red por nuestro proveedor de
servicios.
Probaremos el acceso a la VPN desde el trabajo. En nuestro caso, si comprobamos
nuestra IP sin estar conectados a la VPN tenemos que:
22
23. Podemos observar que la IP por la que salimos es la del router al cual estamos
conectado por WIFI.
Para este caso accederemos a la VPN desde nuestro terminal con conexión 4G como
red externa.
La IP es la de la red pública en la cual tenemos nuestra Raspberry con la VPN
configurada. Estamos recibiendo y enviando paquetes desde nuestra IP, en cambio el
paquete origen y destino es el de nuestra VPN, y salimos a internet por dicha red.
Como podemos observar, ya tenemos configurada nuestra VPN en nuestro terminal y
actualmente estamos conectados a ella. Una vez que accedemos a ella, fisicamente no
estaremos en ella, pero lógicamente sí, permitiéndonos así una conexión segura desde
donde esté ubicada la VPN.
Para la conexión se usará el concepto de tunneling, consiste en encapsular un protocolo
de red sobre otro (protocolo de red encapsulador) creando un túnel dentro de una red de
computadoras.
Por lo tanto esto supone importantes ventajas de seguridad que son implementadas por
la red virtual:
• La Confidencialidad de los datos, debido a que van cifrados mediante protocolos de
encriptación en el túnel creado para la conexión con la VPN.
• Integridad de los datos, Por medio de una VPN podemos crear túneles en los cuales
pasan la información encriptada entre los clientes por lo cual existe una integridad
segura de los datos.
• La Autenticación y Autorización, garantiza que los datos están siendo trasmitidos o
recibidos desde dispositivos remotos autorizados. Solo se permiten conectarse a los
23
24. equipos o dispositivos móviles autorizados, por medio de certificados de
autenticación, llaves encriptadas y usuarios/contraseñas.
• Velocidad: Cuando enviamos o solicitamos información por medio de una red VPN es
comprimida y descomprimida entre los 2 clientes de la VPN, esto hace que la VPN
funcione mas veloz en la transferencia de información.
• Costos: Un VPN nos ahorra en costo de los equipos y otros servicios que se estén
ofreciendo dentro de la red local.
• Nos permite conectar redes físicamente separadas sin necesidad de usar una red
dedicada, si no que a través de internet.
• Nos permite asegurar la conexión entre usuarios móviles y nuestra red fija.
• Este tipo de soluciones permite simplificar la administrador de la conexión de
servidores y aplicaciones entre diferentes dominios.
• Una VPN puede crecer para adaptarse a más usuarios y diferentes lugares mucho
más fácil que las líneas dedicadas. De hecho, la escalabilidad es otra de las grandes
ventajas de una VPN sobre las líneas rent
Posibles ataques
Si un atacante quisiera espiar nuestro tráfico, debido a la implementación de la VPN
estamos acotando los vectores de ataque de este. Ya que al estar usando técnicas de
tunneling para acceder a la VPN, todo el tráfico va cifrado hasta que llega al router de la
VPN, el cual sería el encargado de desempaquetar la PDU (Packet Data Unit) y redirigir
el tráfico al servicio que necesitamos.
Por lo tanto, si un atacante usara técnicas de Man in the Middle, tendría que hacerlo en
el router el cual está en la VPN, ya que es el único punto crítico de la conexión punto a
punto. Para solventar esto, podríamos implementar un IDS en nuestro servidor que
detectara peticiones ARP u otro tipo de poisoning en nuestro servidor.
24
25. Implementación de funcionalidades de
seguridad
Se han incluido dos funcionalidades aparentemente diferentes pero bastante
relacionadas entre ellas debido a la implementación de la solución elegida.
La solución elegida ha sido añadir Latch al servicio de VPN y al servicio SSH, para así,
añadir una capa extra de seguridad en la Raspberry.
Latch es una app móvil para proteger tus cuentas y servicios online cuando no estés
conectado 100% gratuita. Además, te da el control para “apagar” tus servicios online
cuando no estás conectado.
Instalación
Para poder integrar Latch se deberá crear una cuenta en https://latch.elevenpaths.com/
Una vez creada, podremos descargar el paquete necesario del repositorio para integrar
esta funcionalidad en la raspberry
• Descarga de Latch para Unix
• Extraer Latch
• Instalar Latch
25
26. Configuración
Cuenta de Latch
Crearemos una nueva aplicación llamada Raspberry Pi sobre la cual crearemos dos
Operaciones, una para el servicio SSH y otra para el servicio de la VPN.
Al crear la aplicación nos proporcionará dos parámetros que serán los que tendremos
que incluir en la configuración de Latch en la Raspberry
• ID de aplicación
• Clave secreta
Las operaciones nos crearán también una clave secreta.
• Creación de una aplicación nueva en Latch
Deberemos apuntar estos datos para luego ponerlos en los archivos de configuración de
la raspberry.
* Se han omitido los datos de acceso generados
Raspberry
Al integrar Latch en la Raspberry, hay que parearlo con un usuario del sistema, que será
sobre el que figuren los servicios protegidos, es decir, tanto para el SSH como para el
servicio OpenVPN, deberá existir un usuario de sistema.
Para emparejarlo, se pide el código de emparejamiento desde la aplicación móvil y se
ejecuta el comando:
latch -p TOKEN_GENERADO_POR_LATCH
• Configuración de Latch
26
27. En los campos app_id, secret_key, sshd-login y openvpn se deberán poner los
datos que nos proporcionaba la aplicación en el apartado anterior.
• Servicios de la Raspberry Pi
Para la implementación de Latch, se hace uso de los módulos PAM (Pluggable
Authentication Modules) de Unix.
Los PAM de Unix, en arquitectura ARM, se encuentran en /lib/arm-linux-*/
security/
Se deberá mover el PAM de Latch a la carpeta de PAM:
mv /usr/lib/pam_latch.so /lib/arm-linux-*/security/
- Servicio SSH
Está disponible en la ruta /etc/pam.d/sshd
Para hacer uso de Latch, se deberá añadir la siguiente línea en el fichero sshd
auth required pam_latch.so config=/etc/latch/latch.conf accounts=/
etc/latch/latch.accounts operation=sshd-login otp=no
En el campo operation aparecerá el alias que le hayamos puesto en el archivo de
configuración latch.conf
27
28. - Servicio OpenVPN
El PAM de autenticación en OpenVPN está en /usr/lib/openvpn/openvpn-plugin-
auth-pam.so
Se deberá crear un servicio en la carpeta /etc/pam.d/ bajo el nombre openvpn y en
él. se deberá incluir la siguiente línea
auth required pam_latch.so config=/etc/latch/latch.conf accounts=/
etc/latch/latch.accounts operation=openvpn otp=no
En el campo operation aparecerá el alias que le hayamos puesto en el archivo de
configuración latch.conf
- Servidor de VPN
Debido a la restricción de este factor de autenticación, se deberá añadir la siguiente
linea en el archivo de configuración de nuestro servidor VPN:
plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so openvpn
- Cliente de VPN
Se deberá añadir la siguiente ruta en el fichero de configuración .ovpn
auth-user-pass
Se deberán reiniciar los servicios para que todo funcione correctamente.
28
29. Demostración
La demostración consta de dos partes, la primera tiene que ver con la cuenta de Latch
en la página de Telefónica, y la segunda, con la aplicación móvil.
Cuenta de Latch
Tendremos un panel de control, donde podremos ver las estadísticas relativas a nuestras
aplicaciones pareadas con Latch, sincronizar nuevos dispositivos, etc.
• Estadísticas para nuestra cuenta de Latch
29
31. • Acceso permitido a SSH, bloqueado a VPN y notificado al usuario en caso de acceso
31
32. • Acceso permitido a VPN, bloqueado a SSH y notificado a usuario en caso de acceso
32
33. • Conexión en cliente OpenVPN con Latch configurado: ahora ha de ser usuario del
sistema, poner su clave del certificado y tener acceso permitido en Latch
33