Páginas

martes, 21 de abril de 2015

Openvpn raspberry pi 2

Nivel avanzado.

Fuente:

Eric Jodoin (Sans) http://www.sans.org/
Eric Jodoin tutorial (formato pdf) http://www.sans.org/reading-room/whitepapers/hsoffice/soho-remote-access-vpn-easy-pie-raspberry-pi-34427
How to Lauren Orsini Parte una y Parte dos:
http://readwrite.com/2014/04/10/raspberry-pi-vpn-tutorial-server-secure-web-browsing
http://readwrite.com/2014/04/11/building-a-raspberry-pi-vpn-part-two-creating-an-encrypted-client-side

Construir un servidor que cifra sus datos web de miradas indiscretas.

Portátil Dell Inspiron 1525 OpenBSD KDE 3.5 Intel SSD 40GB sata II. Me encanta!


VPN en Raspberry Pi 2 con Openvpn.

Wifi gratis y sin cifrar se encuentran en todas partes, aunque no es buena idea comprobar su cuenta bancaria a menos que no le importe que alguien esté husmeando. Como evitarlo ? una VPN (red privada virtual). Extiende su propia red privada en lugares públicos, de manera que si utiliza la conexión Wifi del establecimiento en que está, su navegación permanece encriptada y segura.

Lo más económico para mantener sus datos seguros es abstenerse de utilizar acceso Wifi, poco prático, aunque sí podemos construir nuestro propia VPN en casa, ejecutarla en un dispositivo del tamaño de un teléfono móvil, de muy bajo costo y consumo, Raspberry Pi 2.

Que necesita:
Tener instalado Raspbian
Una IP estática para la Raspberry Pi o un servicio DDNS (yo utilizo freedns.afraid.org). Utiliza su propia configuración, por tanto no necesita la utilidad ddclient. Es gratis, funciona perfecto desde 2007 y en la actualidad cuenta con mas de 2,500,000 de miembros.

Nota: Para mantener nuestro subdominio activo en freedns.afraid.org, debemos autentificarnos por lo menos una vez en 6 meses. Aunque es posible reactivarlo pasado este período de tiempo.

Configurar ddns freedns.afraid:
Es un DDNS gratis basado en servidores FreeBSD.
Primero se realiza el registro y a continuacion desde la entrada Subdomains, se crea un subdominio.
Ahora, desde la pestaña Dynamic DNS,  podrá actualizar automáticamente cada 5 minutos utilizando cron :
2 dynamic update candidates! (A and AAAA records).

Al clicar sobre quick cron example ver
á algo como esto:

El texto que aparece seleccionado (al final de la página), lo pegaremos llamando la tabla de tareas crontab, revisada por cron (un administrador regular de procesos en segundo plano (demonio) que ejecuta guiones a intervalos regulares (por ejemplo, cada minuto, día, semana o mes):
pi@server $ sudo /etc/crontab -e


Guardar y cerrar.

Consideraciones si utiliza no-ip: 
1. Abrir puerto 8245 en la Raspberry Pi (iptables)
2. no-ip no necesita de ddclient. Utiliza un tar.gz descargable desde su cuenta de usuario - noip-duc-linux.tar.gz. Las instrucciones de Instalación se encuentra en el archivo README.FIRST

Necesita tener habilitado SSH para conectar a la Raspberry Pi desde otro ordenador.
Redirigir puerto 1194 (UDP) a la IP interna de la Raspberry Pi (NAT en su router, port mapping).
Configurar servicio DDNS en el router de acceso a Internet.
Redirigir puerto 22 a la IP de su Raspberry Pi, para realizar conexión remota a la Raspberry Pi.

Si precisa de ddclient:
ddclient asume que está conectado directamente a Internet. Como su Raspberry Pi está dentro de su red interna, tiene que editar el archivo ddclient manualmente y reemplazar use=if, if=eth0 por use=web, if=myip.dnsdynamic.org

# cat /etc/ddclient.conf
##############
daemon=300
protocol=dyndns2
use=web, if=myip.dnsdynamic.org
server=freedns.afraid.org
login=username@gmail.com
password=' '
MyPiVPN.dnsdynamic.com
##############

Re-ejecutar ddclient:
# sudo pkg-reconfigure ddclient

Conectar con la Raspberry Pi via SSH desde otro pc y cambie su contraseña y/o nombre de usuario


Vamos a actualizar la Raspberry Pi con estos comandos:

pi@server ~ $ sudo apt-get update && sudo apt-get upgrade


Instalar OpenVPN

pi@server ~ $ sudo apt-get install openvpn

No quiere que cualquiera que encuentre la direccion del servidor VPN se pueda conectar. Vamos a crear una llave para el servidor utilizando Easy RSA, metodo de cifrado incluido en OpenVPN.

Obtener permisos de superusuario
pi@server ~ $ sudo -s
root@server:/home/pi#

Copiar el directorio 2.0 a /etc/openvpn/easy-rsa de manera recursiva

# cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa

Editar el archivo vars:
# cd /etc/openvpn/easy-rsa
# nano vars



Es el momento de construir el certificado CA y Root CA certificado, autofirmado:

En criptográfica, una autoridad de certificación (CA) es una entidad que emite certificados digitales. El certificado digital certifica la posesión de una clave pública.

# source ./vars

# ./clean-all

# ./build-ca

El nombre del servidor es server:
root@server:/etc/openvpn/easy-rsa# ./build-key-server server

Una vez tecleado Intro aparecen algunas lineas y sus valores por defecto, preste atencion a:

Common Name server (o el que usted tecleo con anterioridad)

A challenge password? debe dejarlo en blanco

Sign the certificate? y

1 out of 1 certificate requests certified, commint? y

...
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/usr/local/etc/openvpn/easy-ra/pki/ca.crt
...

Acabada la contruccion del servidor, es el momento de crear las claves para los clientes, una por cada dispositivo:

# ./build-key-pass NombreUsuario

Donde NombreUsuario es:
client1, client2, client3, client4, client5, client6, client7, client8, client9

De nuevo más intrucciones

Enter PEM pass phrase Ingrese una contrasena que recuerde

A challenge password? Deje en blanco

Sign the certificate? y

# cd keys

El cifrado des3, un algoritmo de cifrado complejo que se aplica tres veces para cada bloque de datos. OpenSSl un metodo estandar para la crreacion de una conexion segura. Es necesario realizar este paso para cada cliente que configure:

# openssl rsa -in client1.key -des3 -out client1.3des.key

He utilizado el mismo password anterior y las dos veces siguientes.

Enter pass phrase for cliente1.key:
writing RSA key
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

Ahora vamos a generar el intercambio de claves Diffie-Hellman. Un intercambio que permite a dos entidades sin conocimiento previo de una, claves secretas a la otra. El cifrado es de 1024-bit que es el valor por defecto, (este valor se establece en el archivo vars, se puede cambiar a 2048-bit).

# cd /etc/openvpn/easy-rsa/
# ./build-dh

Finalmente, vamos a implementar OpenVPN build-in para la proteccion de ataques DoS (Denegacion de Servicio), generando la llave estatica HMAC con el comando siguiente:

# openvpn --genkey --secret keys/ta.key

Falta generar el archivo de configuracion de OpenVPN donde le diremos a OpenVPN, que direccion IP y puerto utilice, donde va a estar conectado, tipo de conexion, etc., utilizando el archivo de configuración de Lauren Orsini y que puede descargar del enlace siguiente. Copie y guárdelo en su servidor local, no tiene formato y funciona perfectamente:

https://gist.github.com/laurenorsini/9925434

Archivo server.conf

# nano /etc/openvpn/server.conf

Hay que activar el reenvio de paquetes IPv4 en el archivo /etc/sysctl.conf descomentando la linea:

net.ipv4.ip_forward=1

Aplicar los cambios sin reiniciar:

# sysctl -p

Raspbian integra un firewall que bloquea las conexiones entrantes de fuentes desconocidas e inesperadas. Queremos seguir protegidos pero necesitamos una regla que permita el tráfico que genera OpenVPN y que recuerde (después de un reinicio) que la conexión OpenVPN siempre esta permitida utilizando un script que se ejecuta en el arranque:

# nano /etc/firewall-openvpn-rules.sh
#!/bin/sh
ipt=/sbin/iptables
#La RPi proporcionará NAT entre OpenVPN cliente subred (10.8.0.0/24) y la soho (small office
#home office) subnet 192.168.1.0/24.
$ipt -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source 192.168.1.130
#utilizado por no-ip (ver README.FIRST)
$ipt -A INPUT -p tcp --dport 8245 -j ACCEPT
#permitir conexiones remotas via SSH.
$ipt -A INPUT -p tcp --dport 22 -j ACCEPT
$ipt -A INPUT -p udp --dport 22 -j ACCEPT
#################

# chmod root /etc/firewall-openvpn-rules.sh
# chmod 0700 /etc/firewall-openvpn-rules.sh
# cd /etc
# sh ./firewall-openvpn-rules.sh
$ sudo iptables -L -n -v


o lo que es lo mismo:



/sbin/iptables -L -n -v

La direccion 10.8.0.0 es la predeterminada de Raspberry Pi para los clientes conectados a la VPN. eth0 es el puerto Ethernet. El archivo creado no tiene permisos de ejecucion y por seguridad solo sera ejecutado por su propietario root.


IP fija y pre-up script firewall:
# cat /etc/network/interfaces
auto lo

iface lo inet loopback
iface eth0 inet static
address 192.168.1.130
netmask 255.255.255.0
gateway 192.168.1.1
pre-up /etc/firewall-openvpn-rules.sh
allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

Ya tiene un servidor VPN (OpenVPN) completamente funcional que puede utilizar para conectarse de una manera segura a su red domestica y acceder a archivos compartidos almacenados en su red.

Falta decir a los clientes donde encontrar el servidor, como conectar, etc. Hemos creado diferentes claves de cliente para cada uno de los dispositivos que desea conceder acceso VPN. Para no generar un nuevo archivo de configuracion para cada cliente a partir de cero, vamos a utilizar un ingenioso guion escrito por ERIC JDOIN del instituto SANS. Lo que hara este script, es generar un archivo para cada cliente por nosotros.

Lo primero es crear un archivo de texto en el que los ajustes por defecto se pueden leer, se llamará default.txt y está localizado dentro de keys:

No se confunda yo siempre utilizo minúsculas, por tanto el nombre del archivo al que se hace refencia en el script MakeOpenVPN.sh "default.txt" deberá cambiarlo:

DEFAULT="Default.txt" por
DEFAULT="default.txt"

# nano /etc/openvpn/easy-rsa/keys/default.txt
##########
client
dev tun
proto udp
remote IPPUBLICA 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
#############

su ip pública es información privada que no debería compartir. Si usted no tiene IP pública debera utilizar un servicio de sistema dinámico de nombres de dominio (DDNS) y ejecutar dhclient, (si utilza no-ip no necesita ddclient), en raspberry pi para actualizar su registro DDNS de forma automática.

Un script escrito por Eric Jodoin corriendo desde un archivo shell ejecutable, automatiza las tareas incluidas en este caso. Puede descargarlo desde este enlace proporcionado por Lauren Orsini:

https://gist.github.com/laurenorsini/10013430

# nano /etc/openvpn/easy-rsa/keys/MakeOVPN.sh
copiar, pegar y guardar

Haciendo el script ejecutable solo para root:
# cd /etc/openvpn/easy-rsa/keys/
# chmod 700 MakeOVPN.sh

Por último, ejecute el script:
# ./MakeOVPN.sh

A medida que el script se ejecuta le preguntará el nombre de los clientes existentes para los que generó claves con anterioridad. Si todo ha ido bien debería aparecer una línea como esta:

Done! client1.ovpn Successfully Created.

Repita este paso para cada cliente existente.

Ahora conecte a la raspberry pi, copie los archivos clientes al directorio /home/pi/ y luego transfiera estos archivos a su ordenador vía scp.

# cd /etc/openvpn/easy-rsa/keys
# mkdir /home/pi/openvpn-keys
# cp *.ovpn /home/pi/openvpn-keys/
# ls /home/pi/openvpn-keys/
client1.ovpn  client2.ovpn  client3.ovpn  client4.ovpn



Finalmente envíe un archivo *.ovpn a cada cliente para conectarse a la VPN (OpenVPN).

Android utiliza OpenVPN Connect, los binarios se instalan a traves de OpenVPN Installer:





Un cliente Ipad se conecta utlizando OpenVPNConnect

Conectar remota SSH desde Android con la app ConnectBot:

Unix es genial!.