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/CDA1819 y en Windows en C:/CDA1819.
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/1819/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.
firewall3:~# nano /etc/ssh/sshd_config ... PermitRootLogin yes ... firewall3:~# service sshd restart
firewall3:~# shorewall clear
firewall3:~# echo 1 > /proc/sys/net/ipv4/ip_forward
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 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.
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). Se usará un esquema SSL completo
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:
La distribución de OpenVPN incluye un conjunto de scripts para implantar una CA básica
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
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 firewall3:/usr/share/easy-rsa/# source vars firewall3:/usr/share/easy-rsa/# ./clean-all firewall3:/usr/share/easy-rsa/# ./build-ca
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.
Crear parámetros de intercambio de clave (Diffie-Hellmann)
firewall3:/usr/share/easy-rsa/# ./build-dh
Totas 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/
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.
Otra alternativa a los scripts easy-rsa es usar la herramienta gráfica TinyCA que ofrece un interfaz gráfico sobre openSSL para la gestión de autoridades de certificación y la generación de certificados digitales.
firewall3:~# tinyca2 &
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 tunel 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 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} .
fuera:/etc/openvpn# scp root@firewall3.cda.net:/etc/openvpn/ta.key .Importante: Es necesario haber habilitado el login como
root
en la configuración del servidor SSH (ver PREVIO 1)
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 tunel 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 ta.key 1
Importante: antes de iniciar el tunel asegurar que en firewall3 está activado el IP forwading y desactivadas las reglas iptables de Shorewall (ver PREVIO 2)
firewall3:~# systemctl restart openvpn@server.service
fuera:~# systemctl restart openvpn@client.service
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 route
)
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 usuario1@10.10.10.11 fuera:~# ssh usuario1@10.20.20.22
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 habilitar una excepción para el tráfico openVPN (puerto 1194 UDP) en el fichero /etc/shorewall/rules y anadir el interfaz tun0 a la zona loc
firewall3:/etc/shorewall# leafpad interfaces & ############################################################################### ?FORMAT 2 ############################################################################### #ZONE INTERFACE OPTIONS net enp0s9 tcpflags,routefilter,norfc1918,nosmurfs,logmartians loc enp0s3 tcpflags,detectnets,nosmurfs dmz enp0s8 tcpflags,detectnets,nosmurfs 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 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 correspondientes a la zona loc, cambiando su campo zona 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 & ... SSH(ACCEPT) road $FW SSH(ACCEPT) road dmz ... 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 ...
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.service
fuera:~# systemctl restart openvpn@client.service
fuera~# nmap -T4 10.10.10.11 fuera~# nmap -T4 10.20.20.22
Esquema propuesto
Entrega: FAITIC
Fecha límite: 18/11/2018