Ejercicios de Seguridad en Redes. Firewalls y túneles cifrados SSI 2011/12 31 de octubre de 2011 Índice 1. Entorno de prácticas 1 1.1. Software de virtualización VirtualBOX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2. Imágenes a utilizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.3. Establecer el entorno virtualizado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2. Ejercicio 1: Configuración de una DMZ (DeMilitarized Zone) usando el firewall netfilter/iptables 4 2.1. Descripción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.2. Tareas a realizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.2.1. Restriciones de acceso a implementar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2.2. Pasos a seguir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3. Ejercicio 2: Uso de enlaces cifrados OpenVPN y configuración del firewall Shorewall 10 3.1. Parte 1: Creación de un enlace OpenVPN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.1.1. Pasos a seguir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.2. Parte 2: Configuración del firewall con Shorewall (Shoreline Firewall) . . . . . . . . . . . . . . . . . . . 13 3.2.1. Pasos a seguir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.3. Parte 3: Integración del enlace OpenVPN con Shorewall . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.3.1. Pasos a seguir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.4. Anexo 2: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4. Documentación y entrega 1. 1.1. 17 17 Entorno de prácticas Software de virtualización VirtualBOX En estas prácticas se empleará el software de virtualización VirtualBOX para simular pequeñas redes formadas por equipos GNU/Linux. Página principal: http://virtualbox.org Más información: http://es.wikipedia.org/wiki/Virtualbox 1 1.2. Imágenes a utilizar Imágenes de partida (comunes a todas las MVs) [son las mismas de la práctica anterior] Imagen comprimida: base.vdi.gz [740 MB comprimida], base.vdi.zip [740 MB comprimida] Imagen del área de intercambio (SWAP): swap.vdi.gz [156 KB comprimida, swap.vdi.zip [156 KB comprimida] Usuarios configurados: login root usuario1 usuario2 1.3. password purple usuario1 usuario2 Establecer el entorno virtualizado Creación de las redes donde se realizarán los ejercicios: Red interna (10.10.10.0 ... 10.10.10.255): máquina dentro (eth0) + interfaz eth0 de firewall3 Red DMZ (10.20.20.0 ... 10.20.20.255): máquina dmz (eth0) + interfaz eth1 de firewall3 Red externa (193.147.87.0 ... 193.147.87.255): máquina fuera (eth0) + interfaz eth2 de firewall3 1. Se partirá de las imágenes base VirtualBOX utilizadas en el ejercicio anterior Si no se hizo para la práctica anterior, descomprimirlas y registrarlas 2 gunzip base.vdi.gz gunzip swap.vdi.gz 2. Configurar y registrar las máquinas virtuales en VirtualBOX (sólo la primera vez) Script de configuración y arranque: ejercicio-iptables.sh ejercicio-iptables.bat (pendiente) Nota: ejecutar desde el directorio donde se hayan descomprimido las imágenes $ bash ejercicio-iptables.sh 3. Arrancar las instancias VirtualBOX (desde el interfaz gráfico o desde la lı́nea de comandos) VBoxManage VBoxManage VBoxManage VBoxManage startvm startvm startvm startvm FUERA DENTRO DMZ FIREWALL3 Importante: Después de finalizar cada ejercicio terminar la ejecución de cada una de las máquinas virtuales desde lı́nea de comandos con halt o desde el interfaz gráfico LXDE. 4. Comprobar las redes establecidas. Acceder a firewall3 como ”root” (password ”purple”) Comprobar la asignación de direcciones IP con ifconfig -a firewall3:~# ifconfig -a Comprobar las redes haciendo ping a las otras máquinas firewall3:~# ping 193.147.87.33 firewall3:~# ping 10.10.10.11 firewall3:~# ping 10.20.20.22 En caso de error, asegurar que la asignación de direciones IP es la correcta. Nota: En caso de confusión, para identificar el equipo concreto se puede usar ifconfig -a para comprobar las dirección MAC asociadas a cada interfaz de red. Red interna Red externa Red DMZ DENTRO 08:00:27:11:11:11 . . . . . . DMZ . . . 08:00:27:22:22:22 . . . FUERA . . . . . . 08:00:27:33:33:33 FIREWALL3 08:00:27:44:44:44 08:00:27:55:55:55 08:00:27:66:66:66 en dentro en fuera en firewall con MAC 08:00:27:11:11:11 (eth0) con MAC 08:00:27:33:33:33 (eth0) # ifconfig eth0 10.10.10.11 # hostname dentro # route add default gw 10.10.10.1 # ifconfig eth0 193.147.87.33 # hostname fuera # route add default gw 193.147.87.47 con MAC 08:00:27:44:44:44 (eth0) con MAC 08:00:27:55:55:55 (eth1) con MAC 08:00:27:66:66:66 (eth2) en dmz con MAC 08:00:27:22:22:22 (eth0) # ifconfig eth0 10.20.20.22 # hostname dmz # route add default gw 10.20.20.1 # # # # # ifconfig ifconfig ifconfig hostname echo 1 > eth0 10.10.10.1 eth0 10.20.20.1 eth1 193.147.87.47 firewall3 /proc/sys/net/ipv4/ip_forward En el equipo dentro (10.10.10.11) se modifica la tabla de enrutado para establecer como gateway para la ruta por defecto (direcciones fuera de la red 10.10.10.0) al firewall3 (10.10.10.1). 3 En el equipo (10.20.20.22) se modifica la tabla de enrutado para establecer como gateway para la ruta por defecto (direcciones fuera de la red 10.20.20.0) al firewall3 (10.20.20.1). En el equipo firewall3 (10.10.10.1, 10.20.20.1 y 193.147.87.47) se habilita el reenvio de paquetes, para que pueda realizar funciones de encaminamiento (router). Nota 1: El interfaz de red asignado (eth0, eth1, ...) puede variar de unas ejecuciones a otras. Se puede comprobar cúal está activo con el comando ’’ifconfig -a’’ Nota 2: Estas configuraciones son temporales, para que se mantengan al volver a arrancar es necesario configurar una conexión estática en el fichero /etc/network/interfaces. 5. Habilitar la redirección de tráfico en la máquina firewall3 [10.10.10.1, 10.20.20.1, 193.147.87.47] firewall3:~# echo 1 > /proc/sys/net/ipv4/ip_forward 6. Arrancar los servicios a utilizar (el servidor ssh está activado por defecto). dentro:~# /etc/init.d/mysqld start dentro:~# /etc/init.d/openbsd-inetd start dmz:~# /etc/init.d/apache2 start dmz:~# /etc/init.d/postfix start dmz:~# /etc/init.d/dovecot start (servidor web) (servidor smtp) (servidor pop3) fuera:~# /etc/init.d/apache2 start fuera:~# /etc/init.d/openbsd-inetd start 2. 2.1. Ejercicio 1: Configuración de una DMZ (DeMilitarized Zone) usando el firewall netfilter/iptables Descripción Se desarrollarán una serie de ejercicios para comprobar el funcionamiento y la configuración del firewall del kernel de Linux netfilter/iptables. El entorno de trabajo contará con un firewall con 3 interfaces que separa una red externa insegura de dos redes internas que definen 2 zonas de seguridad: la red interna (confiable) y la zona desmilitarizada (DMZ) (no confiable). Sobre este cortafuegos se experimentará con polı́ticas de filtrado y traducción de direcciones. 2.2. Tareas a realizar El primer ejercicio consistirá en la configuración de las reglas de filtrado y NAT de netfilter empleando la herramienta de lı́nea de comandos iptables. Página del proyecto netfilter: http://netfilter.org Manual y opciones detalladas: http://iptables-tutorial.frozentux.net (Versión PDF en español: http://ccia.ei.uvigo.es/docencia/SSI/practicas/iptables-tutorial.es.pdf) Manual y ejemplos de uso de iptables (en español): http://www.pello.info/filez/firewall/iptables La configuración se hará mediante scripts bash que contendrán los comandos iptables necesarios. 4 Nota: En el directorio ”/root/iptables/” se proporciona un esquema para un posible script Bash a utilizar en el ejercicio. Recibe un parámetro (stop y stop) firewall3:~# cd /root/iptables/ firewall3:~# ./firewall-iptables.sh stop firewall3:~# ./firewall-iptables.sh start (recupera la configuración inicial de netfilter) (lanza los comandos iptables que definen las reglas del firewall) Podrı́a utilizarse directamente como un script de arranque (opcional) Para Debian (como root) firewall3:~# cp firewall-iptables.sh /etc/init.d firewall3:~# update-rc.d firewall-iptables.sh defaults firewall3:~# update-rc.d firewall-iptables.sh remove 2.2.1. (copia el script en /etc/init.d) (crea los links desde /etc/rcX.d) (elimina los links desde /etc/rcX.d) Restriciones de acceso a implementar 1. Enmascaramiento (SNAT) de la red interna (10.10.10.0/24) y de la DMZ (10.20.20.0/24) 2. Redireccionamiento (DNAT) de los servicios públicos que ofrecerá la red hacia la máquina dentro (10.20.20.22) de la DMZ a) peticiones WEB (http y https) b) tráfico de correo saliente (smtp) y entrante (pop3) 3. Control de tráfico con polı́tica ”denegar por defecto” (DROP) a) desde la red externa sólo se permiten las conexiones hacia la DMZ contempladas en las redirecciones del punto anterior (http, https, smtp, pop3) b) desde la red interna hacia la red externa sólo se permite tráfico de tipo WEB y SSH c) desde la red interna hacia la DMZ sólo se permite tráfico WEB (http, https), e-mail (smtp, pop3) y SSH d ) desde la máquina dmz (10.20.20.22) se permiten conexiones MySQL hacia la máquina dentro (10.10.10.11) de la red interna e) se permite la salida a la red externa de las consultas DNS originadas en la red interna f ) firewall sólo admite conexiones SSH desde la red interna 4. Registro (log) de intentos de acceso no contemplados desde red externa a firewall3 (193.147.87.47) y a equipos internos con la etiqueta Acceso no autorizado 5. Limitar el tráfico de control ICMP recibido desde la red externa para mitigar posibles ataques DOS (denial of service) Nota: Antes de hacer las pruebas: habilitar acceso exterior a MySQL en la máquina dentro(10.10.10.11) y arrancar el servidor. dentro~# leafpad /etc/mysql/my.cf (comentar la linea donde aparece bind-address 127.0.0.1) ... # bind-address 127.0.0.1 ... dentro~# /etc/init.d/mysql start 5 2.2.2. Pasos a seguir 1. Comprobar la configuración actual de firewall3 firewall3:~# iptables -L firewall3:~# iptables -t nat -L 2. Comprobar el tipo de tráfico admitido inicialmente Probar conexión telnet hacia el exterior y conexión WEB hacia el interior dentro~# telnet 193.147.87.33 fuera:~# lynx 193.147.87.47 fuera:~# lynx 10.20.20.22 Comprobar servicios abiertos fuera:~# nmap -T4 10.10.10.11 10.20.20.22 193.147.87.47 dentro:~# nmap -T4 10.20.20.22 193.147.87.33 dmz:~# nmap -T4 10.10.10.11 193.147.87.33 3. Esquema general del script a emplear - Borrado de la reglas actuales y reinicio de contadores Establecimiento de polı́ticas por defecto Reglas de NAT Reglas de filtrado (red interna, firewall, ...) Importante: En este ejemplo se emplearán polı́ticas de filtrado con comportamiento de denegar por defecto (drop). Se complica ligeramente la definición de la reglas: Hay que habilitar explı́citamente los servicios y redirecciones admitidos Es necesario tener en cuenta el tráfico en ambos sentidos, tenemos 2 opciones: • Opción 1: habilitar explı́citamente el tráfico en ambos sentidos Para cada servicio autorizado definiremos un par de reglas: una para permitir el tráfico de peticiones y otra para el tráfico de sus respectivas respuestas • Opción 2: usar las capacidades de connection tracking (firewall con estado) de netfilter El filtrado de servicios se realizará controlando los paquetes de inicio de tráfico/conexión. El tráfico de respuesta o relacionado con tráfico/conexiones ya inicadad se aceptará todo. En este ejemplo usaremos la aproximación 2. Script de partida (”firewall-iptables.sh”) #!/bin/bash #VARIABLES eth_INT=eth0 eth_DMZ=eth1 eth_EXT=eth2 RED_INTERNA=10.10.10.0/24 RED_DMZ=10.20.20.0/24 case "$1" in start) 6 # Borrar iptables iptables iptables iptables reglas anteriores -F -X -Z -t nat -F y reiniciar las tablas actuales # Establecer politicas por defecto (DESCARTAR) iptables -P INPUT DROP # descartar entradas al firewall iptables -P OUTPUT DROP # descartar salidas del firewall iptables -P FORWARD DROP # descartar reenvios a traves del firewall # Habilitar retransmisión de paquetes echo 1 > /proc/sys/net/ipv4/ip_forward # Permitir todo al interfaz local del firewall (loopback) iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # Permitir el trafico de conexiones ya establecidas (el control de tráfico se hace al inicar las conexiones) iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT # 2.1 Establecer NAT de red interna y DMZ (SNAT, enmascaramiento) # <<< COMPLETAR AQUI # 2.2 Establecer redireccionamientos hacia DMZ (DNAT) # <<< COMPLETAR AQUI # 3 Reglas de filtrado del tráfico # <<< COMPLETAR AQUI ;; stop) # Borrar iptables iptables iptables iptables reglas anteriores -F -X -Z -t nat -F y reiniciar las tablas actuales # Establecer politicas por defecto (ACEPTAR) iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT ;; restart) $0 stop $0 start ;; status) iptables -L ;; *) echo "Uso: ;; firewall-iptables.sh {start|stop}" esac 4. Añadir reglas para establecer NAT y habilitar redirecciones eth0: interfaz conectado a la red interna (10.10.10.0/24) eth1: interfaz conectado a la red DMZ (10.20.20.0/24) eth2: interfaz conectado a la red externa (193.147.87.0/24) # 2.1 Establecer NAT de red interna y DMZ (SNAT, enmascaramiento) 7 # SNAT (enmascaramiento de lo que sale de red interna 10.10.10.0/24) hacia exterior iptables -t nat -A POSTROUTING -s $RED_INTERNA -o $eth_EXT -j MASQUERADE # SNAT (enmascaramiento de lo que sale de red DMZ 10.20.20.0/24) hacia exterior iptables -t nat -A POSTROUTING -s $RED_DMZ -o $eth_EXT -j MASQUERADE # 2.2 Establecer redireccionamientos hacia DMZ (DNAT) # DNAT (redireccionamiento servicio HTTP [puerto 80, 443] a red DMZ) iptables -t nat -A PREROUTING -i $eth_EXT -p tcp --dport 80 -j DNAT --to-destination 10.20.20.22 iptables -t nat -A PREROUTING -i $eth_EXT -p tcp --dport 443 -j DNAT --to-destination 10.20.20.22 # DNAT (redireccionamiento servicio SMTP [puerto 25] y POP3 [puerto 110] a red DMZ) iptables -t nat -A PREROUTING -i $eth_EXT -p tcp --dport 25 -j DNAT --to-destination 10.20.20.22 iptables -t nat -A PREROUTING -i $eth_EXT -p tcp --dport 110 -j DNAT --to-destination 10.20.20.22 ## NOTA: Con el módulo multiport podrı́a hacerse con una sola regla ## iptables -t nat -A PREROUTING -i $eth_EXT -p tcp -m multiport --dports 80,443,25,110 \ ## -j DNAT --to-destination 10.20.20.22 # 3 Reglas de filtrado del tráfico # REGLA TEMPORAL: permite todo el tráfico a través del firewall (sólo para pruebas con NAT) iptables -A FORWARD -j ACCEPT Comprobaciones: a) Lanzar el script del firewalll firewall3:~# /root/iptables/firewall-iptables.sh start b) Comprobar la configuración actual de firewall firewall3:~# iptables -L firewall3:~# iptables -t nat -L c) Realizar conexión telnet desde dentro (10.10.10.11) a fuera (193.147.87.33) dentro:~# telnet 193.147.87.33 Trying 193.147.87.33 ... Connected to fuera. Escape character is ’^]’. Linux 2.6.18-6-686 (193.147.87.33) (pts/18) login: usuario1 Password: usuario1 d ) En fuera (193.147.87.33), verificar las conexiones establecidas actualmente fuera:~# netstat -t ó fuera:~# w e) Realizar conexion web desde el equipo fuera (193.147.87.33) hacia firewall3 (193.147.87.47) fuera:~# lynx 193.147.87.47 5. Script final (”firewall-iptables.sh”) Sobre el script anterior: Quitar la regla temporal (iptables -A FORWARD -j ACCEPT) 8 Añadir las siguientes reglas para filtrado de tráfico: # 3. Reglas de filtrado del tráfico # Limitar tráfico ICMP (permitir hasta un maximo de 5 peticiones/segundo) iptables -A INPUT -p icmp -m limit --limit 5/second -j ACCEPT iptables -A OUTPUT -p icmp -m limit --limit 5/second -j ACCEPT iptables -A FORWARD -p icmp -m limit --limit 5/second -j ACCEPT # FILTRADO ENTRADA RED DMZ # - permitir paso de servicios redireccionados iptables -A FORWARD -i $eth_EXT -d $RED_DMZ -p iptables -A FORWARD -i $eth_EXT -d $RED_DMZ -p iptables -A FORWARD -i $eth_EXT -d $RED_DMZ -p iptables -A FORWARD -i $eth_EXT -d $RED_DMZ -p (solo peticiones, las respuestas tcp --dport 80 -m state --state tcp --dport 443 -m state --state tcp --dport 25 -m state --state tcp --dport 110 -m state --state siempre se autorizan) NEW -j ACCEPT NEW -j ACCEPT NEW -j ACCEPT NEW -j ACCEPT ## NOTA: Con el módulo multiport podrı́a hacerse con una sola regla ## iptables -A FORWARD -i $eth_EXT -d $RED_DMZ -p tcp \ ## -m multiport --dports 80,443,25,110 -m state --state NEW -j ACCEPT \ # - log de otros accesos a red dmz (se denegaran por defecto) iptables -A FORWARD -i $eth_EXT -d $RED_DMZ -j LOG --log-prefix "Acceso red dmz:" # - log de otros accesos a red interna (se denegaran por defecto) iptables -A FORWARD -i $eth_EXT -d $RED_INTERNA -j LOG --log-prefix "Acceso red interna:" # FILTRADO SALIDA RED INTERNA # - permitir conexiones salientes HTTP (solo peticiones, las respuestas siempre se autorizan) iptables -A FORWARD -o $eth_EXT -s $RED_INTERNA -p tcp --dport 80 -m state --state NEW -j ACCEPT iptables -A FORWARD -o $eth_EXT -s $RED_INTERNA -p tcp --dport 443 -m state --state NEW -j ACCEPT # - permitir conexiones salientes SSH (solo peticiones, las respuestas siempre se autorizan) iptables -A FORWARD -o $eth_EXT -s $RED_INTERNA -p tcp --dport 22 -m state --state NEW -j ACCEPT # - permitir consultas DNS salientes (sobre TCP y UDP) iptables -A FORWARD -o $eth_EXT -s $RED_INTERNA -p tcp --dport 53 -m state --state NEW -j ACCEPT iptables -A FORWARD -o $eth_EXT -s $RED_INTERNA -p udp --dport 53 -m state --state NEW -j ACCEPT # - permitir conexiones HTTP hacia la DMZ (solo peticiones, las respuestas siempre se autorizan) iptables -A FORWARD -d $RED_DMZ -s $RED_INTERNA -p tcp --dport 80 -m state --state NEW -j ACCEPT iptables -A FORWARD -d $RED_DMZ -s $RED_INTERNA -p tcp --dport 443 -m state --state NEW -j ACCEPT # - permitir conexiones SMTP y POP3 hacia la DMZ (solo peticiones, las respuestas siempre se autorizan) iptables -A FORWARD -d $RED_DMZ -s $RED_INTERNA -p tcp --dport 25 -m state --state NEW -j ACCEPT iptables -A FORWARD -d $RED_DMZ -s $RED_INTERNA -p tcp --dport 110 -m state --state NEW -j ACCEPT # - rechazar los demás intentos de salida informando con ICMP (por defecto se harı́a simplemente DROP) iptables -A FORWARD -s $RED_INTERNA -m state --state NEW -j REJECT --reject-with icmp-port-unreachable # FILTRADO ACCESO RED INTERNA DESDE DMZ # - permitir tráfico MySQL (puerto 3306) de 10.20.20.22 a 10.10.10.11 iptables -A FORWARD -d 10.10.10.11 -s 10.20.20.22 -p tcp --dport 3306 -m state --state NEW -j ACCEPT # - todos los demás intentos de salida están bloqueados por la polı́tica por defecto DROP # FILTRADO CONEXIONES HACIA EL FIREWALL # - permitir conexione SSH desde red interna, resto bloqueado por politica por defecto iptables -A INPUT -i $eth_INT -s $RED_INTERNA -p tcp --dport 22 -m state --state NEW -j ACCEPT # - log de los intentos de acceso al firewall desde exterior (serán denegados) iptables -A INPUT -i $eth_EXT -j LOG --log-prefix "Acceso firewall:" Comprobaciones: a) Lanzar el script del firewalll firewall3:~# /root/iptables/firewall-iptables.sh start b) Comprobar la configuración actual de firewall firewall:~# iptables -L 9 firewall:~# iptables -t nat -L c) Realizar conexiones ssh a firewall3 desde fuera (193.147.87.33), dentro (10.10.10.11) y dmz (10.20.20.22) dentro:~# ssh usuario1@10.10.10.1 dmz:~# ssh usuario1@10.20.20.1 fuera:~# ssh usuario1@193.147.87.47 Otra posibilidad (más rápida): realizar escaneo nmap al puerto 22. dentro:~# nmap -T4 10.10.10.1 -p 22 dmz:~# nmap -T4 10.20.20.1 -p 22 fuera:~# nmap -T4 193.147.87.47 -p 22 d ) Realizar conexión telnet desde dentro (10.10.10.11) hacia fuera (193.147.87.33). dentro:~# telnet 193.147.87.33 ... e) Realizar conexión web desde dentro (10.10.10.11) hacia fuera (193.147.87.33). interno:~# lynx 193.147.87.33 ... f ) Comprobar el fichero de log (/var/log/syslog) de firewall2 firewall2:~# tail /var/log/syslog ... g) Comprobar servicios abiertos fuera:~# nmap -T4 10.10.10.11 10.20.20.22 193.147.87.47 dentro:~# nmap -T4 10.20.20.22 193.147.87.33 dmz:~# nmap -T4 10.10.10.11 193.147.87.33 Nota: Otra alternativa cómoda para comprobar las reglas de filtrado de un firewall es la herramienta hping3. hping3 emula el funcionamiento de la utilidad ping generalizándolo, al permitir realizar sondeos con la posibilidad de especificar los puertos origen y/o destino, las flags TCP, etc. 3. Ejercicio 2: Uso de enlaces cifrados OpenVPN y configuración del firewall Shorewall Se desarrollará un ejercicio de creación de enlaces OpenVPN y una configuración básica de un firewall con DMZ empleando Shorewall. Se usará un equipo con tres interfaces para hacer el papel de firewall Se creará un enlace cifrado OpenVPN a un equipo de la red externa. 3.1. Parte 1: Creación de un enlace OpenVPN Se creará un enlace cifrado OpenVPN desde la máquina firewall3 (193.147.87.47) a la máquina externa fuera (193.147.87.33). 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. 10 La autentiación se realizará mediante certificados digitales (la otra posibilidad serı́a emplear cifrado simétrico con claves secretas estáticas preacordadas) A las máquinas que se conecten por VPN se les asignarán direcciones IP del rango 10.30.30.0/24, donde la máquina firewall3 (el servidor OpenVPN) tendrá la IP 10.30.30.1 Para simplificar el ejercicio se usarán las claves y certificados de ejemplo que provee OpenVPN. En un entorno real no se podrı́an usar esas claves, sino que deberı́amos generar las nuestras propias. Claves de ejemplo: /usr/share/doc/openvpn/examples/sample-keys/ Certificados y claves necesarias: Para el servidor: • certificado digital de la Autoridad Certificadora (CA) reconocida por ambos participantes: ca.crt • clave privada del servidor: server.key • certificado digital del servidos: server.crt (emitido por la CA) • parámetros para intercambio de clave Diffie-Hellam: dh1024.pem Para cada uno de los clientes que se conecten con OpenVPN: • certificado digital de la Autoridad Certificadora reconocida por ambos participantes: ca.crt • clave privada del servidor: client.key • certificado digital del servidor: client.crt (emitido por la CA) Se incluye en el Anexo 2 ?? las indicaciones para generar nuestra propia autoridad de certificación (CA) con la que crear nuestros propios certificados digitales. 3.1.1. Pasos a seguir Previo: Deshabilitar el firewall del ejercicio1 firewall3:~# /root/iptables/firewall-iptables.sh stop (importante) 1. Configuración del servidor: en la máquina firewall3 Copiar las claves/certificados necesarios al directorio /etc/openvpn : firewall3:~# cd /etc/openvpn firewall3:/etc/openvpn# cp /usr/share/doc/openvpn/examples/sample-keys/ca.crt . firewall3:/etc/openvpn# cp /usr/share/doc/openvpn/examples/sample-keys/server.crt firewall3:/etc/openvpn# cp /usr/share/doc/openvpn/examples/sample-keys/server.key firewall3:/etc/openvpn# cp /usr/share/doc/openvpn/examples/sample-keys/dh1024.pem . . . Crear el fichero de configuración del servidor: 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# leafpad server.conf & Parámetros destacados (con ”→” se señalan los cambios efectuados para nuestro ejemplo): 11 . port 1194 proto udp dev tun → → → → → → → /* puerto por defecto del servidor OpenVPN */ /* protocolo por defecto del servidor OpenVPN */ /* 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/server.crt key /etc/openvpn/server.key ... dh /etc/openvpn/dh1024.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" push "route 10.20.20.0 255.255.255.0" /* configuración de las rutas a establecer ("empujar") en los 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 */ 2. Configuración de los clientes: en la máquina fuera (193.147.87.33) Copiar las claves/certificados necesarios al directorio /etc/openvpn : fuera:~# cd /etc/openvpn fuera:/etc/openvpn# cp /usr/share/doc/openvpn/examples/sample-keys/ca.crt . fuera:/etc/openvpn# cp /usr/share/doc/openvpn/examples/sample-keys/client.crt fuera:/etc/openvpn# cp /usr/share/doc/openvpn/examples/sample-keys/client.key . . Crear el fichero de configuración del cliente 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.conf Parámetros destacados (con ”→” se señalan los cambios efectuados para nuestro ejemplo): client /* indica que es la configuración para un cliente */ dev tun → → → → /* tipo de dispositivo de red virtual (= tarjeta de red "software") a traves 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 establecera el tunel cifrado */ ca /etc/openvpn/ca.crt cert /etc/openvpn/client.crt key /etc/openvpn/client.key ... /* parametros de cifrado */ 3. Crear el túnel OpenVPN Inciar OpenVPN en servidor (firewall3), ejecutar /etc/init.d/openvpn start Inicar OpenVPN en cliente (fuera), ejecutar /etc/init.d/openvpn start 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. Un interfaz tun (también los interfaces tap) simula un dispositivo de red ethernet, pero en lugar de enviar los datagramas Ethernet sobre un cable de red, los encapsula dentro de los paquetes de una conexión TCP/IP establecida. • En nuestro caso se trata de una conexión SSL al puerto 1194 UDP de la máquina firewall3 El enlace OpenVPN definirá la red 10.30.30.0/24 • El servidor tendrá la dir. IP 10.30.30.1 • A los clientes se les asignarán direcciones a partir de 10.30.30.6 • El gateway (puerta de enlace) de los clientes conectado por VPN será 10.30.30.5, que reenvı́a a 10.30.30.1 12 Se puede comprobar la configura en ambos extremos con ifconfig -a En este caso las rutas hacia las dos ”redes internas” (red dmz y red interna) se ”inyectan” en el cliente VPN al crear el tunel • La ruta por defecto de los equipos internos usa como gateway a firewall3 que a su vez conoce la ruta hacia las máquinas clientes VPN • Por ello, en este caso concreto no es necesario indicar rutas adicionales para que los equipos dentro y dmz respondan y se comuniquen con los clientes OpenVPN Para el equipo firewall3 tendremos 4 redes • • • • 10.10.10.0/24: red interna en el interfaz eth0 10.20.20.0/24: red dmz en el interfaz eth1 10.30.30.0/24: equipos externos conectados sobre VPN en el interfaz ”virtual” tun0 red externa en el interfaz eth2 4. Comprobar el tunel creado Comprobar el acceso desde la máquina cliente (fuera) a las 2 redes internas detrás de firewall3. Desde fuera: fuera:~# nmap -T4 10.10.10.11 fuera:~# nmap -T4 10.20.20.22 [escaneo de dentro] [escaneo de dmz] Otra opción: hacer conexión ssh + comprobar con comando who quien está conectado fuera:~# ssh usuario1@10.10.10.11 fuera:~# ssh usuario1@10.20.20.22 {\footnotesize \begin{verbatim} 3.2. Parte 2: Configuración del firewall con Shorewall (Shoreline Firewall) Nota: Por el momento omitiremos en la configuración del firewall el enlace OpenVPN que tenemos configurado. Se usará el esquema three-interfaces incluido en la distribución estándar de Shorewall y descrito en http://www.shorewall.net/thre interface.htm. La plantilla para configurar el firewall está en el directorio /usr/share/doc/shorewall/examples/three-interfaces/ 3.2.1. Pasos a seguir Todas las tareas de configuración de Shorewall se realizarán en la máquina firewall3. 1. Copiamos y descomprimimos los ficheros de configuración en el directorio de configuración de Shorewall (/etc/shorewall/) firewall3:~# cd /etc/shorewall firewall3:/etc/shorewall# cp /usr/share/doc/shorewall/examples/three-interfaces/* . firewall3:/etc/shorewall# gunzip *.gz 2. Configurar las zonas (/etc/shorewall/zones) [lo dejaremos como está] Tendremos 4 zonas: el propio firewall (fw) la red externa (net) [accesible desde eth2] la red interna (loc) [accesible desde eth0] la dmz (dmz) [accesible desde eth1] 13 firewall3:/etc/shorewall# leafpad zones & ############################################################################### #ZONE TYPE OPTIONS IN OUT # OPTIONS OPTIONS fw firewall net ipv4 loc ipv4 dmz ipv4 #LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONE - DO NOT REMOVE 3. Configurar los interfaces (/etc/shorewall/interfaces) Ajustar los interfaces de red de cada zona para que se ajusten a nuestra configuración (en columna INTERFACE) firewall3:/etc/shorewall# leafpad interfaces & ############################################################################### #ZONE INTERFACE BROADCAST OPTIONS net eth2 detect tcpflags,routefilter,norfc1918,nosmurfs,logmartians loc eth0 detect tcpflags,detectnets,nosmurfs dmz eth1 detect tcpflags,detectnets,nosmurfs #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE 4. Definir las polı́ticas (/etc/shorewall/policy) El fichero por defecto incluye todas las combinaciones posibles entre nuestras 3 zonas (loc, dmz, net) indicando una polı́tica ACCEPT para el tráfico de la zona loc y una polı́tica por defecto de rechazar (REJECT) y generando un LOG de los ”rechazo” realizados. Esta polı́tica sólo tiene utilidad para depuración En nuestro caso fijaremos unas polı́ticas restrictivas que en principio sólo permitirán tráfico entre la zona loc y la red externa (net) En el fichero /etc/shorewall/rules se ajustarán las excepciones pertinentes. firewall3:/etc/shorewall# leafpad policy & ############################################################################### #SOURCE DEST POLICY LOG LEVEL LIMIT:BURST loc net ACCEPT net all DROP # THE FOLLOWING POLICY MUST BE LAST all all REJECT info #LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE 5. Definir enmascaramiento (/etc/shorewall/masq) En nuestro ejemplo enmascararemos (SNAT: source NAT ) el tráfico saliente de nuestras 2 redes internas (loc y dmz). firewall3:/etc/shorewall# leafpad masq & ############################################################################## #INTERFACE SOURCE ADDRESS PROTO PORT(S) IPSEC eth2 10.10.10.0/24 eth2 10.20.20.0/24 #LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE MARK Indica que para el tráfico que pretenda salir de la red 10.10.10.0 y 10.20.20.0 a través del interface eth2 (red externa) se ”reescribirá” su dirección origen con la dirección IP del interfaz eth2 (IP publica de firewall3 (193.147.87.47)) 6. Incluir las excepciones y redirecciones en /etc/shorewall/rules Mantendremos las excepciones (reglas) incluidas en el fichero rules de muestra. 14 Definen el comportamiento de servicios básico como DNS, SSH hacia dmz y firewall, mensajes ICMP de PING, etc Nota: hace uso de macros como Ping/DROP, SSH/ACCEPT (abrevian la notación ahorrando el escribir los puertos concretos) Implementaremos parte de las restriciones de tráfico descrita en el ejercicio 1: Se redireccionan todos los servicio públicos (http, https, smtp y pop3) que ofrecerá nuestra red hacia la DMZ (en nuestro caso a la máquina 10.20.20.22) Se permite acceso del servidor web de la DMZ (en 10.20.20.22) al servidor MySQL de la red interna (en 10.10.10.11) Se permite el acceso desde la red interna a los servidores públicos (web y correo) alojados en la DMZ Añadiremos al final del fichero (antes de la lı́nea #LAST LINE ....) las reglas que las implementan. firewall3:/etc/shorewall# leafpad rules & #################################################################################### #ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL ... # PORT PORT(S) DEST # Accept DNS connections from the firewall to the Internet DNS/ACCEPT $FW net # Accept SSH connections from the local network to the firewall and DMZ SSH/ACCEPT loc $FW SSH/ACCEPT loc dmz .... .... ## ## ANADIDOS para implemetar reglas de filtrado ## ## 1: redirec. puertos (servicios publicos: http, https, smtp, pop3) a DMZ DNAT net dmz:10.20.20.22 tcp 80,443 DNAT net dmz:10.20.20.22 tcp 25,110 ## Anadidos 2: acceso del servidor web de DMZ al servidor mysql ACCEPT dmz:10.20.20.22 loc:10.10.10.11 tcp 3306 ## Anadidos 3: acceso desde local a servidores web y correo en DMZ ACCEPT loc dmz tcp 80,443 ACCEPT loc dmz tcp 25,110 #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE 7. Ajustar el fichero de configuración de Shorewall (/etc/shorewall/shorewall.conf) Como mı́nimo debe establecerse la variable STARTUP ENABLED a yes, para que el compilador Shorewall procese los ficheros y genere las reglas iptables. También debe habilitarse el forwarding de paquetes: Asegurar que la variable IP FORWARDING está a on (o Keep si se garantiza que se habilita ip forwarding antes de iniciar el firewall) firewall3:/etc/shorewall# leafpad shorewall.conf & ############################################################################### # S T A R T U P E N A B L E D ############################################################################### STARTUP_ENABLED=yes ... ############################################################################### # F I R E W A L L O P T I O N S ############################################################################### IP_FORWARDING=on 8. Arrancar Shorewall y comprobar las reglas generadas 15 firewall3:~# shorewall start firewall3:~# iptables -L firewall3:~# iptables -t nat -L 9. Pruebas a realizar Antes de hacer las pruebas: habilitar acceso exterior a MySQL en la máquina dentro(10.20.20.22) y arrancar el servidor. dentro~# leafpad /etc/mysql/my.cf (comentar la linea donde aparece bind-address 127.0.0.1) ... # bind-address 127.0.0.1 ... dentro~# /etc/init.d/mysql start Desde fuera (193.147.87.33): fuera~# nmap -T4 193.147.87.47 Estará accesible el puerto http redireccionado a la dmz Desde dmz (10.10.10.11): dmz~# nmap -T4 10.10.10.11 Estará accesible el puerto mysql Desde dentro (10.20.20.22): dentro~# nmap -T4 10.20.20.22 dentro~# nmap -T4 193.147.87.33 3.3. Parte 3: Integración del enlace OpenVPN con Shorewall Shorewall prevee la posibilidad de dar soporte a conexiones VPN. Veremos como integrar nuestro túnel openVPN en Shorewall 3.3.1. Pasos a seguir 1. Crear una nueva zona (road) para los clientes conectado con OpenVPN en el fichero /etc/shorewall/zones 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 De ese modo, todo el tráfico que llegará al forewall mediante los túneles OpenVPN se conciderarı́a como perteneciente a la zona loc (red interna). 2. Asociar el interfaz tun0 a la zona road en el fichero /etc/shorewall/interfaces firewall3:/etc/shorewall# leafpad zones & ############################################################################### #ZONE INTERFACE BROADCAST OPTIONS net eth2 detect tcpflags,dhcp,routefilter,nosmurfs,logmartians loc eth0 detect tcpflags,nosmurfs dmz eth1 detect road tun+ 16 3. Definir las polı́ticas y reglas que afectan a los clientes OpenVPN Haremos que los equipos conectados por openVPN (zona road) tengas las mismas restricciones/privilegios que los de la red interna (zona loc). Fichero /etc/shorewall/policy firewall3:/etc/shorewall# leafpad policy & ############################################################################### #SOURCE DEST POLICY LOG LEVEL LIMIT:BURST loc net ACCEPT net all DROP road loc ACCEPT # THE FOLLOWING POLICY MUST BE LAST all all REJECT info Fichero /etc/shorewall/rules Replicar las entradas correspondientes a la zona loc, cambiando su campo zona de loc a road. firewall3:/etc/shorewall# leafpad rules & ... SSH/ACCEPT SSH/ACCEPT ... ACCEPT ACCEPT road road $FW dmz road road dmz dmz tcp tcp 80,443 25,110 4. Dar de alta el tunel OpenVPN /etc/shorewall/tunnels firewall3:/etc/shorewall# leafpad tunnels & #TYPE openvpnserver:1194 ZONE net GATEWAY 0.0.0.0/0 GATEWAY-ZONE 5. Comprobar la configuración del firewall y el funcionamiento del tunel OpenVPN Reiniciar el servidor OpenVPN en firewall3 firewall3~# /etc/init.d/openvpn restart Arrancar el cliente OpenVPN en fuera fuera~# /etc/init.d/openvpn restart Comprobar que desde el equipo fuera se tiene acceso a las redes interna y DMZ fuera~# nmap -T4 10.10.10.11 fuera~# nmap -T4 10.20.20.22 3.4. Anexo 2: pendiente 4. Documentación y entrega El material entregable de esta práctica constará de una pequeña memoria (máximo 2-3 páginas) documentando los ejercicios realizados y los resultados obtenidos en cada paso realizado, junto con las conclusiones que se deriven de dichos resultados. Descripción breve de acciones realizadas y resultados obtenidos en el ejercicio 1 17 • Detallar el tráfico permitido inicialmente (resultados nmaps), después de habilitar el enmascaramiento y las redicciones y después de añadir las reglas de filtrado finales. • Explicar las reglas iptables responsables del filtrado de tráfico. Descripción breve de acciones realizadas y resultados obtenidos en el ejercicio 2. Documentar las pruebas realizadas sobre el enlace OpenVPN y la configuración de Shorewall. La memoria de estos ejercicios se presentará junto con las del ejercicio anterior en las mismas fechas que el trabajo teórico (23/1/2012). 18