Cisco Modular Policy Framework (I)

(N.d.E. Entrada realizada por José Luis Villalón y Borja Merino)

Cisco Modular Policy Framework (MPF) es un conjunto de funcionalidades y reglas que nos proporciona Cisco para configurar de forma flexible sus firewalls, pudiendo realizar un filtrado más específico de las conexiones que atraviesan nuestra red.

Habitualmente, cuando configuramos un firewall, solemos centrarnos principalmente en las capas de red y transporte, filtrando únicamente por direcciones IP, puertos, o incluso flags, no obstante, no debemos olvidarnos de que esto no siempre es suficiente, por lo que debemos poder controlar también las capas superiores, pudiendo filtrar por parámetros concretos a nivel de aplicación.

Como ya vimos hace tiempo, Cisco ASA nos da la posibilidad de poder normalizar conexiones TCP, no obstante, es realmente MPF quien hace posible esta normalización, junto con otras funcionalidades avanzadas como comprobaciones a nivel de checksum de paquete, tcp windowing, filtrado de flags, gestión de ancho de banda, o incluso, la posibilidad de hacer un bypass del stateful inspection del sistema. No obstante, para este post usaremos el framework para llevar a cabo una inspeccionar tráfico a nivel de aplicación.

Recordando el post de Roberto sobre la identificación de accesos de logmein, podemos configurar nuestro ASA para filtrar determinados patrones de tráfico a nivel de aplicación; en nuestro caso y para mantener un ejemplo similar, bloquearemos las peticiones DNS a dominios de logmein.com, aunque también se podría inspeccionar el tráfico HTTP para evitar ciertas conexiones.

Para llevar a cabo la inspección DNS, realizaríamos los siguientes pasos (existen configuraciones alternativas):

1. Configuramos una expresión regular que nos permita detectar los patrones de tráfico interesante:

ciscoasa# regex DNSFilter ".\.logmein\.com"

Podemos comprobar si una url hace match con la expresión regular mediante el comando test:

ciscoasa# test regex www.logmein.com .\.logmein\.com
    INFO: Regular expression match succeeded.   

2. Configuramos un class-map para identificar el tráfico que queremos inspeccionar:

ciscoasa(config)# class-map type regex match-any DNSFilterList
ciscoasa(config-cmap)# description Dominios Bloqueados
ciscoasa(config-cmap)# match regex DNSFilter

Creando un class-map, podríamos añadir más entradas a la comprobación de expresiones regulares.

3. Creamos un policy-map donde asociamos el anterior class-map para especificar las acciones a llevar a cabo al detectar la expresión regular sospechosa. En este caso, cortamos la conexión y registramos el acceso:

ciscoasa(config)# policy-map type inspect dns DNSInspection
ciscoasa(config-pmap)# parameters
ciscoasa(config-pmap-p)# match domain-name regex class DNSFilterList
ciscoasa(config-pmap-c)# drop log

4. Asociamos al policy-map existente la nueva inspección de tráfico DNS creada en el punto anterior.

ciscoasa(config)# policy-map global_policy                                                        
ciscoasa(config-pmap)# class inspection_default                                                       
ciscoasa(config-pmap-c)# inspect dns DNSInspection 

Puesto que hemos modificado el policy-map creado por defecto, no sería necesario modificar o crear un nuevo service-policy.

Llegados a este momento, si intentamos realizar una consulta DNS (que no esté almacenada en nuestra caché local o en la caché de nuestro servidor DNS) por ejemplo a www.logmein.com, sería filtrada por el firewall, generando el siguiente log:

%ASA-4-410003: DNS Classification: Dropped DNS request (id 24326) from 
     inside:10.10.10.20/64355 to outside:8.8.8.8/53; matched Class 23: match 
     domain-name regex class DNSFilterList

Donde claramente podremos identificar la IP que lanza la consulta DNS, y también se reflejaría en el debug si esta activado en el firewall:

DNS: === request: Param flags 0x7, match flags 0x10
DNS: Match flags 0x100 rr 1, return 0
DNS: Match dn, list 0xd5711358 entries 1
DNS: Match dn regex, return 1
DNS: Match type 0x1, class 0x1, return 1
DNS: Action 20: matching class 24, DNS Classification: Dropped
DNS: Ques 0: DN: 

Como hemos podido ver, esta funcionalidad nos permite crear nuevos patrones de filtrado acorde a las necesidades de nuestra organización; Veremos otras interesantes utilidades de MPF en el próximo post.