alumno@pc:~$ bash 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.
$HOME/CDA1516
y en Windows en C:\\CDA1516
.vdi.zip
de http://ccia.ei.uvigo.es/docencia/CDA/1516/practicas
y copiarlos en el directorio anterior ($DIR_BASE
) para que el script haga el resto.
DIR_BASE
($HOME/CDA1516
ó C:\\CDA1516
)
base_cda.vdi
(0,8 GB comprimida, 2,8 GB descomprimida):
Imagen genérica (común a todas las MVs) que contiene las herramientas a utilizar
login | password |
---|---|
root | purple |
usuario1 | usuario1 |
swap1024.vdi
: Disco de 1 GB formateado como espacio de intercambio (SWAP)
VBoxManage startvm DMZ_<id> VBoxManage startvm DENTRO_<id> VBoxManage startvm FUERA_<id> VBoxManage startvm FIREWALL3_<id>
Una vez ejecutado el script se habrán definido las redes y los equipos virtualizados donde se realizarán los ejercicios:
root/purple
para
realizar directamente a las tareas de administración
usuario1/usuario1
para realizar las tareas de administración mediante comandos sudo
Nota 1: en los casos que sea necesario/conveniente, puede arrancarse el entorno gráfico con startx
firewall3:~# startx
Nota 2: Para permitir ''copiar y pegar'' desde entre anfitrión y máquina virtual, además
de acceder al entorno gráfico del huésped, es preciso
habilitar la opción Dispositivos->Portapapeles Compartido->Bidireccional
desde el menú de la ventana de VirtualBOX.
firewall3:~# echo 1 > /proc/sys/net/ipv4/ip_forward
dentro:~# /etc/init.d/mysql start dentro:~# /etc/init.d/openbsd-inetd start dmz:~# /etc/init.d/apache2 start (servidor web [80]) dmz:~# /etc/init.d/postfix start (servidor smtp [25]) dmz:~# /etc/init.d/dovecot start (servidor pop3 [110]) fuera:~# /etc/init.d/apache2 start fuera:~# /etc/init.d/openbsd-inetd start fuera:~# /etc/init.d/postfix start
Nota: En la imagen común a todas las máquinas virtuales fue habilitado el acceso exterior al servidor MySQL (en principio sólo será relevante para la máquina dentro(10.10.10.11))
dentro~# nano /etc/mysql/my.cnf (comentar la linea donde aparece bind-address 127.0.0.1) ... # bind-address 127.0.0.1 ...
fuera
:
fuera:~# nmap -T4 193.147.87.47 [escaneo de firewall3 (unica máquina visible desde fuera)] fuera:~# nmap -T4 10.10.10.11 [escaneo de dentro (fallará)] fuera:~# nmap -T4 10.20.20.22 [escaneo de dmz (fallará)]
dentro
:
dentro:~# nmap -T4 193.147.87.33 [escaneo de fuera] dentro:~# nmap -T4 10.20.20.22 [escaneo de dmz] dentro:~# nmap -T4 10.10.10.1 [escaneo de firewall3]
dmz
:
dmz:~# nmap -T4 193.147.87.33 [escaneo de fuera] dmz:~# nmap -T4 10.10.10.11 [escaneo de dentro] dmz:~# nmap -T4 10.20.20.1 [escaneo de firewall3]
firewall3
:
firewall3:~# nmap -T4 193.147.87.33 [escaneo de fuera] firewall3:~# nmap -T4 10.10.10.11 [escaneo de dentro] firewall3:~# nmap -T4 10.20.20.22 [escaneo de dmz]
Se desarrollará un ejercicio de configuración básica de un firewall con DMZ empleando el generador de reglas iptables Shorewall. Se usará un equipo con tres interfaces para hacer el papel de firewall.
Se usará el esquema three-interfaces incluido en la distribución estándar de Shorewall y descrito en http://www.shorewall.net/three-interface.htm.
La plantilla para configurar el firewall está en el directorio /usr/share/doc/shorewall/examples/three-interfaces/
Todas las tareas de configuración de Shorewall se realizarán en la máquina firewall3.
firewall3:~# cd /etc/shorewall firewall3:/etc/shorewall# cp /usr/share/doc/shorewall/examples/three-interfaces/* . firewall3:/etc/shorewall# gunzip *.gz
Tendremos 4 zonas:
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
Ajustar los interfaces de red de cada zona para que se ajusten a nuestra configuración (en columna INTERFACE)
firewall3:/etc/shorewall# leafpad interfaces & ############################################################################### FORMAT 2 ############################################################################### #ZONE INTERFACE OPTIONS net eth2 tcpflags,routefilter,norfc1918,nosmurfs,logmartians loc eth0 tcpflags,detectnets,nosmurfs dmz eth1 tcpflags,detectnets,nosmurfs #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
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.
firewall3:/etc/shorewall# leafpad policy & ############################################################################### #SOURCE DEST POLICY LOG LEVEL LIMIT:BURST loc all DROP info net all DROP info dmz all DROP info # THE FOLLOWING POLICY MUST BE LAST all all REJECT info #LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE
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 MARK eth2 10.10.10.0/24 eth2 10.20.20.0/24 #LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVEIndica 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))
Nota: hace uso de macros como Ping(DROP), SSH(ACCEPT) (abrevian la notación ahorrando el escribir los puertos concretos)
Implementaremos parte de las restricciones de tráfico descrita en el ejercicio 1:
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 ############### COMENTAR (no nos interesa) ################# # DNS(ACCEPT) $FW net ############################################################ # Accept SSH connections from the local network to the firewall and DMZ SSH(ACCEPT) loc $FW # Cubre parte de las restricciones 3c SSH(ACCEPT) loc dmz # Cubre parte de las restricciones 3c .... .... ## ## ANADIDOS para implementar reglas de filtrado ## ## Anadidos para 2a, 2b: 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 para 3b: acceso desde local a red externa (solo WEB y SSH) ACCEPT loc net tcp 80,443 ACCEPT loc net tcp 22 ## Anadidos para 3c: acceso desde local a servidores web y correo de DMZ y ssh a equipos DMZ ACCEPT loc dmz:10.20.20.22 tcp 80,443 ACCEPT loc dmz:10.20.20.22 tcp 25,110 ACCEPT loc dmz tcp 22 # No sería necesario, cubierto por una regla anterior ## Anadidos para 3d: acceso del servidor SMTP de DMZ a servidores SMTP externos para (re)envío de e-mails ACCEPT dmz:10.20.20.22 net tcp 25 ## Anadidos para 3e: acceso del servidor web de DMZ al servidor mysql ACCEPT dmz:10.20.20.22 loc:10.10.10.11 tcp 3306 ## Anadidos para 3f: acceso al exterior para consultas DNS desde red interna y dmz DNS(ACCEPT) loc net DNS(ACCEPT) dmz net ######## NOTA: Reglas 3f equivalen a: #ACCEPT loc net tcp 53 #ACCEPT loc net udp 53 #ACCEPT dmz net tcp 53 #ACCEPT dmz net udp 53 #################################### #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
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=Yes
firewall3:~# shorewall start
firewall3:~# iptables -L -v firewall3:~# iptables -t nat -L -v ó firewall3:~# iptables-save > /tmp/volcado.txt
telnet
, nc
ó socat
,
o conexiones directas empleando clientes de los propios protocolos implicados.
fuera:~# nmap -T4 193.147.87.47 10.10.10.11 10.20.20.22 dentro:~# nmap -T4 193.147.87.33 10.20.20.22 10.10.10.1 dmz:~# nmap -T4 193.147.87.33 10.10.10.11 10.20.20.1 firewall3:~# nmap -T4 193.147.87.33 10.10.10.11 10.20.20.22
tcptraceroute
.
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
Crear un directorio easy-rsa donde residirán los scripts y las claves de la CA
firewall3:~# cd /etc/openvpn firewall3:/etc/openvpn/# cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 easy-rsa firewall3:/etc/openvpn/# cd easy-rsa
Editar datos generales de nuestra red
firewall3:/etc/openvpn/easy-rsa/# nano vars ... export KEY_COUNTRY=es export KEY_PROVINCE=ourense export KEY_CITY=ourense export KEY_ORG=cda export KEY_EMAIL=cda@esei.net ...
Inicializar la CA y generar su par de claves
firewall3:/etc/openvpn/easy-rsa/# source vars firewall3:/etc/openvpn/easy-rsa/# ./clean-all firewall3:/etc/openvpn/easy-rsa/# ./build-ca
Cuando se nos pregunte por ''COMMON_NAME:'' poner en nombre de dominio completo del equipo (firewall3.esei.net)
firewall3:/etc/openvpn/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.esei.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:/etc/openvpn/easy-rsa/# ./build-dh
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 /etc/openvpn/easy-rsa/keys/
firewall3:/etc/openvpn/easy-rsa/# ./build-key fuera
Cuando se nos pregunte por ''COMMON_NAME:'' poner el nombre de dominio completo 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 gestion de autoridades de certificación y la generación de certificados digitales.
firewall3:~# tinyca2 &
firewall3:~# cd /etc/openvpn firewall3:/etc/openvpn# cp easy-rsa/keys/ca.crt . firewall3:/etc/openvpn# cp easy-rsa/keys/firewall3.crt . firewall3:/etc/openvpn# cp easy-rsa/keys/firewall3.key . firewall3:/etc/openvpn# cp easy-rsa/keys/dh1024.pem .
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 ''
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/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 */ |
fuera:~# cd /etc/openvpn fuera:/etc/openvpn# scp root@firewall3.esei.net:/etc/openvpn/easy-rsa/keys/ca.crt . fuera:/etc/openvpn# scp root@firewall3.esei.net:/etc/openvpn/easy-rsa/keys/fuera.crt . fuera:/etc/openvpn# scp root@firewall3.esei.net:/etc/openvpn/easy-rsa/keys/fuera.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 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 /* parametros de cifrado */ |
![]() |
cert /etc/openvpn/fuera.crt |
![]() |
key /etc/openvpn/fuera.key |
... |
Importante: antes de iniciar el tunel asegurar que en firewall3 está activado el IP forwading y desactivadas las reglas iptables de Shorewall.
Si es necesario:
firewall3:~# echo 1 > /proc/sys/net/ipv4/ip_forward OPCION 1: deshabilitar el firewall shorewall firewall3:~# shorewall stop firewall3:~# shorewall clear ó OPCION 2: reestablecer la configuración por defecto de NETFILTER/iptables (politica ACCEPT) firewall3:~# iptables -F firewall3:~# iptables -X firewall3:~# iptables -Z firewall3:~# iptables -t nat -F firewall3:~# iptables -P INPUT ACCEPT firewall3:~# iptables -P OUTPUT ACCEPT firewall3:~# iptables -P FORWARD ACCEPT
/etc/init.d/openvpn start
/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.
Comprobar el acceso desde la máquina cliente (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 {\footnotesize \begin{verbatim}
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 eth2 tcpflags,dhcp,routefilter,nosmurfs,logmartians loc eth0 tcpflags,nosmurfs dmz eth1 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 dmz tcp 80,443 ACCEPT road dmz tcp 25,110 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~# /etc/init.d/openvpn restart
fuera~# /etc/init.d/openvpn restart
fuera~# nmap -T4 10.10.10.11 fuera~# nmap -T4 10.20.20.22
Esquema propuesto (hasta un máximo de 5-6 páginas)
PREVIO 4
)
Entrega: FAITIC
Fecha límite: <pendiente>