Jun 22, 2009

Protección del sistema con iptables

Una vez configuradas todas las características del Sistema de Alta Disponibilidad y Balanceo de Carga que hemos venido desarrollando durante los últimos meses, vamos a ver la forma de proteger correctamente todas las máquinas del cluster a través de la herramienta iptables.

Iptables es una aplicación firewall vinculada al kernel de Linux, que se ocupa entre otras cosas de filtrar (a nivel de enlace y red) aquellos paquetes que llegan al sistema en base a unas determinadas reglas.

Lo que vamos a hacer es crear un script en cada uno de los nodos, iptables.sh, que sea el encargado de establecer las reglas necesarias durante el arranque de la máquina. Este script lo ubicaremos dentro del directorio /etc/init.d/ para que sea automáticamente ejecutado por el demonio init al iniciar el equipo. Para ello, crearemos un enlace dentro del directorio /etc/rc[nivel].d/.

A continuación se muestra el fichero de configuración de iptables para el primer nodo (HA1). Lo primero que hace este script es vaciar las reglas ya existentes de las tablas de filtrado (FILTER) y nat (NAT). Después abre todos los servicios permitidos hacia la máquina: ICMP, SSH, HTTP, MySQL, y FTP. Todos estos servicios estarán disponibles para cualquier usuario que los solicite a través de Internet.

También será necesario abrir aquellos puertos por los que se reciba tráfico a través del resto de nodos del cluster. Por ejemplo, el nodo HA1 recogerá los latidos del nodo HA2 (192.168.1.11) a través del puerto 694 UDP. El nodo HA1 gestionará los demonios de almacenamiento del cluster de MySQL, los cuales enviarán información a través del puerto 1186 TCP proveniente de los dos nodos traseros (10.0.0.12 y 10.0.0.13). Y el mismo procedimiento para los puertos utilizados por Zabbix.

Lo que tiene que quedar claro es que los servicios brindados por el sistema se han dejado abiertos a cualquier dirección IP, y los servicios internos utilizados por los nodos del cluster se han delimitado exclusivamente a las direcciones IP origen correspondientes.

Para que los nodos traseros puedan acceder a Internet, también será necesario habilitar una regla SNAT en los dos nodos frontales que lo habilite.

Una vez establecidas todas las reglas que serán permitidas, pondremos al final del script una regla que loguee en el fichero /var/log/messages todos los accesos no permitidos y una última regla que rechace todas esas conexiones no aceptadas.
root@ha1:~# cat /etc/init.d/iptables.sh
#!/bin/sh

# Borrar todas las reglas de la tabla de filtrado
iptables -F

# Borrar todas las reglas de la tabla nat
iptables -t nat -F

# Reglas permitidas para la cadena de filtrado
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
iptables -A INPUT -p tcp --dport http -j ACCEPT
iptables -A INPUT -p tcp --dport mysql -j ACCEPT
iptables -A INPUT -p tcp --dport ftp -j ACCEPT
iptables -A INPUT -p tcp --dport ftp-data -j ACCEPT

# heartbeat
iptables -A INPUT -s 192.168.1.11 -p udp --dport 694 -j ACCEPT

# nbd_mgmd
iptables -A INPUT -s 10.0.0.12 -p tcp --dport 1186 -j ACCEPT
iptables -A INPUT -s 10.0.0.13 -p tcp --dport 1186 -j ACCEPT

# zabbix (agente)
iptables -A INPUT -s 192.168.1.11 -p tcp --dport 10050 -j ACCEPT

# zabbix (servidor)
iptables -A INPUT -s 192.168.1.11 -p tcp --dport 10051 -j ACCEPT
iptables -A INPUT -s 10.0.0.12 -p tcp --dport 10051 -j ACCEPT
iptables -A INPUT -s 10.0.0.13 -p tcp --dport 10051 -j ACCEPT

# Reglas SNAT para la tabla nat
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to 192.168.1.10

# Loguear las conexiones bloqueada
iptables -A INPUT -j LOG

# Bloquear el resto de conexiones
iptables -A INPUT -j REJECT
El script de iptables para el segundo nodo frontal, HA2, será similar al del primer nodo. Lo único que cambiará serán algunas direcciones IP origen.
root@ha2:~# cat /etc/init.d/iptables.sh
#!/bin/sh

# Borrar todas las reglas de la tabla de filtrado
iptables -F

# Borrar todas las reglas de la tabla nat
iptables -t nat -F

# Reglas permitidas para la cadena de filtrado
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
iptables -A INPUT -p tcp --dport http -j ACCEPT
iptables -A INPUT -p tcp --dport mysql -j ACCEPT
iptables -A INPUT -p tcp --dport ftp -j ACCEPT
iptables -A INPUT -p tcp --dport ftp-data -j ACCEPT

# heartbeat
iptables -A INPUT -s 192.168.1.10 -p udp --dport 694 -j ACCEPT

# nbd_mgmd
iptables -A INPUT -s 10.0.0.12 -p tcp --dport 1186 -j ACCEPT
iptables -A INPUT -s 10.0.0.13 -p tcp --dport 1186 -j ACCEPT

# zabbix (agente)
iptables -A INPUT -s 192.168.1.10 -p tcp --dport 10050 -j ACCEPT

# zabbix (servidor)
iptables -A INPUT -s 192.168.1.10 -p tcp --dport 10051 -j ACCEPT
iptables -A INPUT -s 10.0.0.12 -p tcp --dport 10051 -j ACCEPT
iptables -A INPUT -s 10.0.0.13 -p tcp --dport 10051 -j ACCEPT

# Reglas SNAT para la tabla nat
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to 192.168.1.11

# Loguear las conexiones bloqueada
iptables -A INPUT -j LOG

# Bloquear el resto de conexiones
iptables -A INPUT -j REJECT
A continuación se muestra el script de iptables para el nodo LB1.
root@lb1:~# cat /etc/init.d/iptables.sh
#!/bin/sh

# Borrar todas las reglas de la tabla de filtrado
iptables -F

# Reglas permitidas para la cadena de filtrado
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
iptables -A INPUT -p tcp --dport http -j ACCEPT
iptables -A INPUT -p tcp --dport mysql -j ACCEPT
iptables -A INPUT -p tcp --dport ftp -j ACCEPT
iptables -A INPUT -p tcp --dport ftp-data -j ACCEPT

# glusterfs y ndbd
iptables -A INPUT -s 10.0.0.13 -p tcp -j ACCEPT

# zabbix (agente)
iptables -A INPUT -s 192.168.1.10 -p tcp --dport 10050 -j ACCEPT
iptables -A INPUT -s 192.168.1.11 -p tcp --dport 10050 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 25 -j DROP

# Loguear las conexiones bloqueada
iptables -A INPUT -j LOG

# Bloquear el resto de conexiones
iptables -A INPUT -j REJECT
Y por último, el del nodo LB2:
root@lb2:~# cat /etc/init.d/iptables.sh
#!/bin/sh

# Borrar todas las reglas de la tabla de filtrado
iptables -F

# Reglas permitidas para la cadena de filtrado
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
iptables -A INPUT -p tcp --dport http -j ACCEPT
iptables -A INPUT -p tcp --dport mysql -j ACCEPT
iptables -A INPUT -p tcp --dport ftp -j ACCEPT
iptables -A INPUT -p tcp --dport ftp-data -j ACCEPT

# glusterfs y ndbd
iptables -A INPUT -s 10.0.0.12 -p tcp -j ACCEPT

# zabbix (agente)
iptables -A INPUT -s 192.168.1.10 -p tcp --dport 10050 -j ACCEPT
iptables -A INPUT -s 192.168.1.11 -p tcp --dport 10050 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 25 -j DROP

# Loguear las conexiones bloqueada
iptables -A INPUT -j LOG

# Bloquear el resto de conexiones
iptables -A INPUT -j REJECT
Para que los scripts se puedan lanzar durante el proceso de arranque, y a su vez, puedan ser iniciados y detenidos automáticamente, hay que ejecutar las siguientes órdenes.
root@ha1:~# chmod +x /etc/init.d/iptables.sh ; update-rc.d iptables.sh defaults
root@ha2:~# chmod +x /etc/init.d/iptables.sh ; update-rc.d iptables.sh defaults
root@lb1:~# chmod +x /etc/init.d/iptables.sh ; update-rc.d iptables.sh defaults
root@lb2:~# chmod +x /etc/init.d/iptables.sh ; update-rc.d iptables.sh defaults

No comments:

Post a Comment