Ejemplo de uso del software de VPN (Virtual Private Network) openVPN.
Recursos complementarios
En estas prácticas se empleará el software de virtualización VIRTUALBOX para simular los equipos GNU/Linux sobre los que se realizarán las pruebas.
alumno@pc: $ sh ejercicio-dmz-openvpn.sh
Powershell.exe -executionpolicy bypass -file ejercicio-dmz-openvpn.ps1
Notas:
$DIR_BASE
especifica donde se descargarán las imágenes y se crearán las MVs.
Por defecto en GNU/Linux será en $HOME/CDA2122 y en Windows en C:/CDA2122.
Puede modificarse antes de lanzar los scripts para hacer la instalación en otro directorio más conveniente (disco externo, etc)
.vdi.zip
de http://ccia.esei.uvigo.es/docencia/CDA/2122/practicas/ y copiarlos en el directorio anterior ($DIR_BASE
) para que el script haga el resto.
VBoxManage startvm <nombre MV>_<id>
Contiene un sistema Debian 9 con herramientas gráficas y un entorno gráfico ligero LXDE (Lighweight X11 Desktop Environment) [LXDE].
login | password |
---|---|
root | purple |
usuario | usuario |
root@datos:~# startx
Dispositivos -> Portapapeles compartido -> bidireccional
de la ventana de la máquina virtual.
Se desarrollará un ejercicio de creación de enlaces OpenVPN, donde se creará un enlace cifrado OpenVPN desde un equipo de la red externa y se revisará su integración en el firewall con DMZ configurado con Shorewall.
firewall3:~# nano /etc/ssh/sshd_config ... PermitRootLogin yes ... firewall3:~# systemctl restart sshd
firewall3:~# shorewall clear
firewall3:~# echo 1 > /proc/sys/net/ipv4/ip_forward
firewall3:~# iptables -F firewall3:~# iptables -t nat -F firewall3:~# iptables -P INPUT ACCEPT firewall3:~# iptables -P OUTPUT ACCEPT firewall3:~# iptables -P FORWARD ACCEPT
firewall3:~# echo 1 > /proc/sys/net/ipv4/ip_forward
fuera:~# nmap -T4 10.10.10.11 fuera:~# nmap -T4 10.20.20.22 fuera:~# nmap -T4 193.147.87.47
Se creará un enlace cifrado OpenVPN desde la máquina externa fuera (193.147.87.33) a la máquina firewall3 (193.147.87.47).
tun
o tap
), que desde el punto de vista del sistema operativo funciona como una tarjeta de red convencional, pudiendo asigársele direcciones IP y participando en las reglas de entrutado y filtrado definidas en cada extremo del tunel.
tun
, tramas Ethernet en dispositivos tap
) se encapsula dentro de paquetes TLS/SSL que atraviesan la red pública cifrados y autenticados saliendo por el disposivo (tun
o tap
) del otro extremo, donde el tráfico se extrae y continúa su camino
En este ejemplo se usará un esquema SSL/TLS completo que negocia un conjunto de claves secretas de cifrado y autenticación cada vez que se establece un tunel. Una alternativa más sencilla hubiera sido usar claves secretas preacordadas manualmente.
Usaremos el modo de funcionamiento de OpenVPN ”roadwarrior”, donde un servidor OpenVPN crea enlaces cifrados para equipos autorizados situados en redes externas.
Certificados y claves necesarias:
Los certificados digitales necesarios para configurar las conexiones TLS/SSL pueden obtenerse de Autoridades Certificadoras externas, tanto de pago como gratuitas (como Let's Encrypt, https://letsencrypt.org/es/), y reconocidos por defecto en diferentes aplicaciones (navegadores, etc).
En nuestro ejemplo crearemos nuestra propia Autoridad Certificadora (CA) de uso interno (cuyos certificados serán reconocidos únicamente en las aplicaciones y servicios de nuestra organización).
La distribución de OpenVPN incluye un conjunto de scripts para implantar una CA básica. Estos scripts usan internamente el comando openssl
para las operaciones de creación de pares de claves (pública y privada) y firma de certificados.
Ir al directorio easy-rsa donde residen los scripts y las claves de la CA
firewall3:~# cd /usr/share/easy-rsa/
Editar datos generales de nuestra red (opcional)
firewall3:/usr/share/easy-rsa/# nano vars ... export KEY_COUNTRY=es export KEY_PROVINCE=ourense export KEY_CITY=ourense export KEY_ORG=cda export KEY_EMAIL=cda@cda.net ...
Inicializar la CA y generar su par de claves
firewall3:/usr/share/easy-rsa/# cp openssl-1.0.0.cnf openssl.cnf # renombra el fichero de configuración de openssl firewall3:/usr/share/easy-rsa/# source vars # carga las variables definidas en vars firewall3:/usr/share/easy-rsa/# ./clean-all # inicializa el directorio keys donde se ubicarán los certificados y claves firewall3:/usr/share/easy-rsa/# ./build-ca # crea las claves pública y privada de la CA y su certificado raíz autofirmado
Cuando se nos pregunte por ”COMMON_NAME:” poner CA_pruebas
firewall3:/usr/share/easy-rsa/# ./build-key-server firewall3
Cuando se nos pregunte por ”COMMON_NAME:” poner el nombre de dominio completo del servidor OpenVPN (en este caso, firewall3.cda.net)
Se solicitará una contraseña para proteger el fichero con la clave privada. Dado que OpenVPN se iniciará como un script de arranque en /etc/init.d/ se dejará en blanco para que no se bloquee el inicio del servidor.
firewall3:/usr/share/easy-rsa/# ./build-dh
Este script crea un fichero (dh2028
) con los parémetros que necesita el algoritmo de intercambio de claves Diffie-Hellman utilizado durante la fase de establecimiento de conexión del protocolo TLS/SSL para acordar las claves secretas con las que se cifrarán y autenticarán los pauqtes TLS/SSL intercambiados.
firewall3:/usr/share/easy-rsa/# ./build-key fuera
Cuando se nos pregunte por ”COMMON_NAME:” poner un nombre identificativo del cliente OpenVPN (en este caso, fuera)
Se solicitará una contraseña para proteger el fichero con la clave privada. Dado que OpenVPN se iniciará como un script de arranque en /etc/init.d/ se dejará en blanco para que no se bloquee el inicio del cliente.
Todas las claves generadas (fichero con el certificado digital firmado por la CA [extensión .crt] + fichero con la respectiva clave privada [extensión .key]) se
crean en el directorio /usr/share/easy-rsa/keys/. Puede verse el contenido de los certificados digitales creados con el comando openssl
firewall3:/usr/share/easy-rsa/# openssl x509 -text -in keys/ca.crt firewall3:/usr/share/easy-rsa/# openssl x509 -text -in keys/firewall3.crt firewall3:/usr/share/easy-rsa/# openssl X509 -text -in keys/fuera.crt
firewall3:~# cd /etc/openvpn firewall3:/etc/openvpn# cp /usr/share/easy-rsa/keys/ca.crt . firewall3:/etc/openvpn# cp /usr/share/easy-rsa/keys/firewall3.crt . firewall3:/etc/openvpn# cp /usr/share/easy-rsa/keys/firewall3.key . firewall3:/etc/openvpn# cp /usr/share/easy-rsa/keys/dh2048.pem .
firewall3:~# openvpn --genkey --secret ta.key
Se usará como base el ejemplo disponible en /usr/share/doc/openvpn/examples/sample-config-files/
firewall3:/etc/openvpn# cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz . firewall3:/etc/openvpn# gunzip server.conf.gz
Editar los parámetros concretos para nuestros túneles VPN:
firewall3:/etc/openvpn# nano server.conf ó firewall3:/etc/openvpn# leafpad server.conf &Parámetros destacados (con ”
port 1194 ## puerto por defecto del servidor OpenVPN proto udp ## protocolo por defecto del servidor OpenVPN dev tun ## tipo de dispositivo de red virtual (= tarjeta de red "software") a través ## del cual se accederá al túnel cifrado establecido ... -> ca /etc/openvpn/ca.crt ## parametros de cifrado -> cert /etc/openvpn/firewall3.crt -> key /etc/openvpn/firewall3.key ... -> dh /etc/openvpn/dh2048.pem ... -> server 10.30.30.0 255.255.255.0 ## rango de direcciones a asignar a los clientes ## OpenVPN que se vayan conectando ... -> push "route 10.10.10.0 255.255.255.0" ## configuración de las rutas a establecer (”empujar”) en los -> push "route 10.20.20.0 255.255.255.0" ## clientes para las conexiones cifradas que se vayan creando ## en nuestro caso son las rutas hacia las 2 redes (interna ## y dmz) gestionadas por firewall3 ... -> tls-auth /etc/openvpn/ta.key 0 ...
fuera:# cd /etc/openvpn fuera:/etc/openvpn# scp root@firewall3.cda.net:/usr/share/easy-rsa/keys/{ca.crt,fuera.crt,fuera.key} .Importante: Es necesario haber habilitado el login como
root
en la configuración del servidor SSH (ver PREVIO 1)
fuera:/etc/openvpn# scp root@firewall3.cda.net:/etc/openvpn/ta.key .
Se usará como base el ejemplo disponible en /usr/share/doc/openvpn/examples/sample-config-files/
fuera:/etc/openvpn# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf .
Editar los parámetros concretos para nuestros túneles VPN
fuera:/etc/openvpn# nano client.confParámetros destacados (con ”
client ## indica que es la configuración para un cliente dev tun ## tipo de dispositivo de red virtual (= tarjeta de red "software") a través ## del cual se accederá al túnel cifrado establecido con el servidor -> remote 193.147.87.47 1194 ## dirección IP y puerto de escucha del servidor OpenVPN ## con el que se establecerá el túnel cifrado ... -> ca /etc/openvpn/ca.crt ## parametros de cifrado -> cert /etc/openvpn/fuera.crt -> key /etc/openvpn/fuera.key ... -> tls-auth /etc/openvpn/ta.key 1
Importante: antes de iniciar el túnel asegurar que en firewall3 está activado el IP forwading y desactivadas las reglas iptables de Shorewall (ver PREVIO 2)
firewall3:~# systemctl restart openvpn@server
fuera:~# systemctl restart openvpn@client
En ambos extremos del túnel cifrado se crea un interfaz de red ”virtual” /dev/tun0 por el que se accede al enlace cifrado que conforma la red privada virtual.
ip addr
)
ip addr
ip route
en la máquina fuera)
Comprobar el acceso desde la máquina (fuera) a las 2 redes internas detrás de firewall3, que inicialmente no eran accesibles.
fuera:~# nmap -T4 10.10.10.11 [escaneo de dentro] fuera:~# nmap -T4 10.20.20.22 [escaneo de dmz]
fuera:~# ssh usuario@10.10.10.11 [con contraseña usuario] fuera:~# ssh usuario@10.20.20.22 [con contraseña usuario]
firewall3:/etc/shorewall# leafpad zones & ############################################################################### #ZONE TYPE OPTIONS IN OUT # OPTIONS OPTIONS fw firewall net ipv4 loc ipv4 dmz ipv4 road ipv4
Nota: otra opción más directa sería vincular en el fichero interfaces
la tarjeta de red tun0 a la zona loc
firewall3:/etc/shorewall# leafpad interfaces & ############################################################################### ?FORMAT 2 ############################################################################### #ZONE INTERFACE OPTIONS net enp0s9 loc enp0s3 dmz enp0s8 road tun+
Haremos que los equipos conectados por openVPN (zona road) tengas las mismas restricciones/privilegios que los de la red interna (zona loc).
Habilitar el acceso sin restricciones a la zona interna (loc) desde los equipos que lleguen a través del túnel OpenVPN (zona road)
firewall3:/etc/shorewall# leafpad policy & ############################################################################### #SOURCE DEST POLICY LOG LEVEL LIMIT:BURST loc all DROP net all DROP dmz all DROP road loc ACCEPT # THE FOLLOWING POLICY MUST BE LAST all all REJECT info
Replicar las entradas con origen en la zona loc, cambiando su campo origen de loc a road.
Nota: esto es una simplificación para acelerar el desarrollo del ejemplo. En un entorno real, puede no ser necesario/razonable que los equipos de los usuarios ”itinerantes” se equiparen en cuanto a restricciones de acceso con los equipos internos (especialmente si el único mecanismo de autenticación es el uso exclusivo de certificados digitales de clientes).
firewall3:/etc/shorewall# leafpad rules & ACCEPT road net tcp 80,443 ACCEPT road net tcp 22 ACCEPT road dmz:10.20.20.22 tcp 80,443 ACCEPT road dmz:10.20.20.22 tcp 25,110 ACCEPT road dmz tcp 22 DNS(ACCEPT) road net ACCEPT road fw tcp 22
firewall3:/etc/shorewall# leafpad tunnels & #TYPE ZONE GATEWAY GATEWAY-ZONE openvpnserver:1194 net 0.0.0.0/0
firewall3~# shorewall start
firewall3:~# systemctl restart openvpn@server
fuera:~# systemctl restart openvpn@client
fuera~# nmap -T4 10.10.10.11 fuera~# nmap -T4 10.20.20.22
Esquema propuesto
Entrega: MOOVI
Fecha límite: 31/10/2021