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/CDA2223 y en Windows en C:/CDA2223.
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/2223/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 11 con herramientas gráficas y un entorno gráfico ligero LXDE (Lighweight X11 Desktop Environment) [LXDE].
login | password |
---|---|
root | purple |
usuario | usuario |
(con permisos para sudo ) |
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
Nota: Para hacer permanente el cambio en la variable del kernel ip_forward
se puede descomentar la línea #net.ipv4.ip_forward=1
en el fichero /etc/sysctl.conf
.
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 asignársele direcciones IP y participando en las reglas de enrutado 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 TLS/SSL 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 ”road warrior”, 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 las 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.
Ver detalles en https://wiki.debian.org/OpenVPN#Init_easy-rsa.
(Opcional) Editar los parámetros de nuestra CA y los metadatos del los certificados a generar (no es imprescindible hacerlo)
firewall3:~# cd /usr/share/easy-rsa firewall3:/usr/share/easy-rsa# cp vars.example vars firewall3:/usr/share/easy-rsa# nano vars ... set_var EASYRSA_REQ_COUNTRY "ES" set_var EASYRSA_REQ_PROVINCE "Ourense" set_var EASYRSA_REQ_CITY "Ourense" set_var EASYRSA_REQ_ORG "ESEI" set_var EASYRSA_REQ_EMAIL "cda@cda.net" set_var EASYRSA_REQ_OU "CDA" ...
Inicializar la CA (en el directorio de configuración de OpenVPN, puede hacerse en cualquier otro lugar)
firewall3:~# cd /etc/openvpn/ firewall3:/etc/openvpn# /usr/share/easy-rsa/easyrsa init-pki
/etc/openvpn/pki
con los subdirectorios issued
(certificados digitales emitidos con las claves públicas generadas) y private
(claves privadas generadas).
Generar el par de claves de la CA
firewall3:/etc/openvpn# /usr/share/easy-rsa/easyrsa build-ca nopass
pki/private/ca.key
) y la clave pública (en pki/ca.crt
, como certificado raíz autofirmado) de la CA.
Common Name
, indicar CA prueba
nopass
se omite proteger la clave privada de la CA con una passphrase.
firewall3:/etc/openvpn# /usr/share/easy-rsa/easyrsa build-server-full firewall3.cda.net nopass
Common Name
que identica al equipo propietario del certificado. El cliente OpenVPN comprueba este valor durante la fase de establecimiento de conexión y debe coincidir con el nombre del equipo al que se conecta para evitar conexiones con servidores falsos.
pki/private/firewall3.cda.net.key
) y la clave pública (en pki/issued/firewall3.cda.net.crt
, como certificado firmado por la CA) del servidor OpenVPN.
nopass
se omite proteger la clave privada del servidor con una passphrase. Dado que OpenVPN se iniciará desde un script de arranque en /etc/init.d/, se omite esta protección para simplificar la configuración y que este script de inicio no se bloquee.
firewall3:/etc/openvpn# /usr/share/easy-rsa/easyrsa build-client-full fuera nopass
pki/private/fuera.key
) y la clave pública (en pki/issued/fuera.crt
, como certificado firmado por la CA) del cliente OpenVPN.
nopass
se omite proteger la clave privada del cliente con una passphrase. Dado que OpenVPN se iniciará desde un script de arranque en /etc/init.d/, se omite esta protección para simplificar la configuración y que este script de inicio no se bloquee.
firewall3:/etc/openvpn# /usr/share/easy-rsa/easyrsa gen-dh
pki/dh.pem
.
firewall3:/etc/openvpn# /usr/share/easy-rsa/easyrsa show-ca firewall3:/etc/openvpn# /usr/share/easy-rsa/easyrsa show-cert firewall3.cda.net firewall3:/etc/openvpn# /usr/share/easy-rsa/easyrsa show-cert fueraMisma información usando directamente el comando
openssl
firewall3:/etc/openvpn# openssl x509 --text --in pki/ca.crt firewall3:/etc/openvpn# openssl x509 --text --in pki/issued/firewall3.cda.net.crt firewall3:/etc/openvpn# openssl x509 --text --in pki/issued/fuera.crt
/etc/openvpn/server
.
firewall3:~# cd /etc/openvpn firewall3:/etc/openvpn# cd server/ firewall3:/etc/openvpn/server# openvpn --genkey secret ta.key
Se usará como base el ejemplo disponible en /usr/share/doc/openvpn/examples/sample-config-files/
firewall3:/etc/openvpn/server# cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf .
Editar los parámetros concretos para nuestros túneles VPN:
firewall3:/etc/openvpn# nano server.conf ó firewall3:/etc/openvpn# mousepad 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/pki/ca.crt ## parametros de cifrado -> cert /etc/openvpn/pki/issued/firewall3.cda.net.crt -> key /etc/openvpn/pki/private/firewall3.cda.net.key ... -> dh /etc/openvpn/pki/dh.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/server/ta.key 0 ...
/etc/openvpn/client
fuera:# cd /etc/openvpn fuera:/etc/openvpn# cd client fuera:/etc/openvpn/client# scp root@firewall3.cda.net:/etc/openvpn/pki/{ca.crt,issued/fuera.crt,private/fuera.key} .
Importante: Es necesario haber habilitado el login como root
en la configuración del servidor SSH (ver PREVIO 1)
fuera:/etc/openvpn/client# scp root@firewall3.cda.net:/etc/openvpn/server/ta.key .
Se usará como base el ejemplo disponible en /usr/share/doc/openvpn/examples/sample-config-files/
fuera:/etc/openvpn/client# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf .
Editar los parámetros concretos para nuestros túneles VPN
fuera:/etc/openvpn/client# 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 firewall3.cda.net 1194 ## dirección IP y puerto de escucha del servidor OpenVPN ## con el que se establecerá el túnel cifrado ... -> ca /etc/openvpn/client/ca.crt ## parametros de cifrado -> cert /etc/openvpn/client/fuera.crt -> key /etc/openvpn/client/fuera.key ... -> tls-auth /etc/openvpn/client/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:/etc/openvpn/server# systemctl restart openvpn-server@server
fuera:/etc/openvpn/client# systemctl restart openvpn-client@client
RESULTADO: 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 address
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# mousepad 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# mousepad 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# mousepad 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# mousepad 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# mousepad tunnels & #TYPE ZONE GATEWAY GATEWAY-ZONE openvpnserver:1194 net 0.0.0.0/0
firewall3~# shorewall start
firewall3:~# systemctl restart openvpn-server@server
fuera:~# systemctl restart openvpn-client@client
fuera~# nmap -T4 10.10.10.11 fuera~# nmap -T4 10.20.20.22
Esquema propuesto
Entrega: MOOVI
Fecha límite: 13/11/2022