Extensiones de la seguridad: filtros IP

En versiones más o menos recientes de AIX el operativo proporciona `de serie' unos interesantes mecanismos de seguridad IP basados en túneles y filtros de paquetes, algo similar - guardando las distancias - a ipchains o iptables en Linux; el uso de túneles requiere filtros, pero el de filtros no necesita para nada los túneles. Para poder utilizar ambos mecanismos necesitamos tener instalado el paquete (más concretamente, el fileset) bos.net.ipsec.rte:
bruja:/# lslpp -l bos.net.ipsec.rte
  Fileset                      Level  State      Description
  ----------------------------------------------------------------------------
Path: /usr/lib/objrepos
  bos.net.ipsec.rte          4.3.3.0  COMMITTED  IP Security

Path: /etc/objrepos
  bos.net.ipsec.rte          4.3.3.0  COMMITTED  IP Security
bruja:/#
Un túnel define una asociación entre dos máquinas en las que se han especificado parámetros de seguridad compartidos entre los dos extremos del túnel; el hecho de que se implique a otra máquina hace que, excepto en entornos muy homogénos - sistemas AIX - o en casos concretos, no se suela utilizar este mecanismo. En cambio, el filtrado de paquetes sí que se utiliza, ya que proporciona a un entorno aislado una protección frente a otras máquinas sin tener que modificar para nada el operativo o las aplicaciones de estas: proporciona un sistema de filtrado sencillo pero efectivo en máquinas en las que por cualquier motivo - dinero, utilización, rendimiento...- no se pueden implantar otras soluciones cortafuegos más completas, como CheckPoint Firewall-1 o IBM SecureWay Firewall. Por este motivo, en este punto vamos a comentar brevemente algunos aspectos del filtrado de paquetes en AIX, sin entrar en el apartado de túneles; si alguien está interesado en profundizar más en estos mecanismos de seguridad IP para AIX, puede consultar [IBM97b].

Para gestionar este sistema de filtrado podemos utilizar órdenes como rmfilt, mkfilt, genfilt o lsfilt; como siempre, es recomendable consultar las páginas de ayuda de cada una de ellas, aunque en este caso más que recomendable podríamos decir imprescindible, ya que el manejo de los filtros no es ni mucho menos inmediato, y la sintaxis para definir reglas es relativamente compleja. Para poner en marcha el sistema de filtrado necesitamos generar reglas y posteriormente activarlas; en el fichero /usr/samples/ipsec/filter.sample tenemos ejemplos de como definir una regla, un filtro de red, mediante genfilt.

El uso de genfilt puede llegar a ser bastante complicado, debido principalmente a su sintaxis (como acabamos de decir, es imprescindible consultar su página de manual). Para definir una regla nueva es obligatorio indicar al menos el protocolo sobre el que se aplicará (IPv4 o IPv6), así como el host o red origen y su máscara correspondiente; el resto de parámetros (destino, puertos de conexión, interfaz de red...) son opcionales, aunque como sucede en muchas otras ocasiones, es necesario estar atento a los valores que el sistema toma por defecto: por simple Ley de Murphy, serán restrictivos cuando nos interese que sean permisivos y viceversa. Para hacernos una idea de cómo se definen reglas mediante genfilt, si por ejemplo necesitáramos permitir todo el tráfico de una red local contra una máquina AIX situada en ella (192.168.0.10), la orden para lograrlo sería similar a:
bruja:/# genfilt -v 4 -a P -s 192.168.0.0 -m 255.255.0.0 -d 192.168.0.10 -M \
> 255.255.255.255 -i all
bruja:/#
Aunque no vamos a entrar aquí en detalles de la sintaxis de las reglas, veremos al final de este punto un shellscript como ejemplo de filtrado en una máquina AIX en el que se incluirán algunas definiciones de filtros; en cualquier caso, como ya hemos dicho, existe un fichero con ejemplos de reglas en /usr/samples/ipsec/filter.sample que podemos consultar para hacernos una idea de la sintaxis de genfilt.

Para activar el conjunto de reglas de filtrado que hayamos definido previamente mediante tenemos que utilizar la orden mkfilt; no obstante, antes de esto debemos haber generado los dispositivos especiales ipsec_v4 e ipsec_v6 (como su nombre indica, el segundo hace referencia a IPv6, mientras que el primero es relativo al protocolo clásico) en el sistema de ficheros utilizando mkdev, ya que de lo contrario la activación no será posible:
bruja:/# mkfilt -v 4
Device ipsec_v4 not found.
Filter activation for IPv4 not performed.
bruja:/# /usr/sbin/mkdev -c ipsec -t 4
ipsec_v4 Available
bruja:/# /usr/sbin/mkdev -c ipsec -t 6
ipsec_v6 Available
bruja:/#
Una vez creados ambos ficheros especiales ya podemos activar el ruleset definido; por ejemplo, el siguiente shellscript - o modificaciones del mismo - puede utilizarse para definir un sencillo sistema de filtrado en nuestra máquina:
bruja:/# cat /etc/filtros
#!/bin/sh
#
# Script para filtrar paquetes en una maquina AIX.
# Antonio Villalon, Noviembre 2001
#
#############
# Eliminamos y deshabilitamos reglas anteriores
#############
/usr/sbin/rmfilt -v 4 -n all
/usr/sbin/rmfilt -v 6 -n all
/usr/sbin/mkfilt -v 4 -d
/usr/sbin/mkfilt -v 6 -d
#############
# Permitimos todo desde LAN
#############
genfilt -v 4 -a P -s 192.168.0.0 -m 255.255.0.0 -d 192.168.0.10 -M \
255.255.255.255 -i all
#############
# Salida, todo abierto
#############
genfilt -v 4 -a P -s 192.168.0.10 -m 255.255.255.255 -d 0 -M 0
#############
# Vuelta de DNS
#############
genfilt -v 4 -a P -s 0 -m 0 -d 0 -M 0 -g N -c udp -o eq -p 53 -O gt -P 1023
#############
# Prohibimos todo lo no habilitado por defecto
#############
genfilt -v 4 -a P -s 0 -m 0 -d 192.168.0.10 -M 255.255.255.255 -c tcp/ack
genfilt -v 4 -a D -s 0 -m 0 -d 192.168.0.10 -M 255.255.255.255 
#############
# Activamos las reglas para IP e IPv6
#############
/usr/sbin/mkfilt -v 4 -u
/usr/sbin/mkfilt -v 6 -u
bruja:/#
Podemos ver que la activación del conjunto de reglas se realiza mediante la opción `-u' de mkfilt, tanto para IPv4 como para IPv6; esto significa que es a partir de la ejecución de esta orden cuando el sistema de filtrado comienza a funcionar.

Para consultar el conjunto de reglas definidas en nuestra máquina podemos utilizar el comando lsfilt (si lo ejecutamos sin ninguna opción nos proporcionará el listado de todas las reglas, tanto activas - las que se están aplicando - como inactivas - definidas pero sin ser aplicadas -). Como en otros sistemas de filtrado, a cada regla se le asigna un número de orden, y es ese número el que indica la precedencia de su aplicación: si un paquete hace match con una cierta regla, es esa la que se aplica, descartando las que son posteriores; es una aproximación similar a la seguida en Firewall-1 o ipchains, pero diferente de la de otros cortafuegos como IP Filter. Para consultar una regla concreta podemos utilizar las diferentes opciones de la orden lsfilt:
bruja:/# lsfilt -v 4 -n 3
Rule 3:
Rule action         : permit
Source Address      : 192.168.0.0
Source Mask         : 255.255.0.0
Destination Address : 192.168.0.10
Destination Mask    : 255.255.255.255
Source Routing      : yes
Protocol            : all
Source Port         : any 0
Destination Port    : any 0
Scope               : both
Direction           : both
Logging control     : no
Fragment control    : all packets
Tunnel ID number    : 0
Interface           : all
Auto-Generated      : no
bruja:/#
Para acabar este punto quizás es necesario saber cómo deshabilitar el sistema de filtrado; ya lo hemos visto antes, en el shellscript de ejemplo, pero hay que recordar que mediante la opción `-d' de la orden mkfilt podemos hacerlo. Esto es especialmente importante en situaciones en las que un filtro incorrecto deja inaccesible el sistema o alguna aplicación crítica, ya que la posibilidad de deshabilitar todo el filtrado mediante una orden sencilla, en línea de comandos, proporciona una solución rápida y efectiva este tipo de problemas.
© 2002 Antonio Villalón Huerta