Configuración de Firewall Cisco PIX
Introducción PIX (Private Internet eXchange) es una de las soluciones de seguridad ofrecidas por Cisco Systems; se trata de un firewall completamente hardware: a diferencia de otros sistemas cortafuegos, PIX no se ejecuta en una máquina Unix, sino que incluye un sistema operativo empotrado denominado Finesse que desde espacio de usuario se asemeja más a un router que a un sistema Unix clásico. Por tanto, dado que la gestión de este cortafuegos no es tan inmediata para un administrador de sistemas como la de uno que se ejecute sobre Unix, vamos a dedicarle más tiempo al PIX Firewall de lo que hemos dedicado al resto de cortafuegos. El cortafuegos PIX utiliza un algoritmo de protección denominado Adaptive Security Algorithm (ASA): a cualquier paquete inbound (generalmente, los provenientes de redes externas que tienen como origen una red protegida) se le aplica este algoritmo antes de dejarles atravesar el firewall, aparte de realizar comprobaciones contra la información de estado de la conexión (PIX es stateful) en memoria; para ello, a cada interfaz del firewall se le asigna un nivel de seguridad comprendido entre 0 (el interfaz menos seguro, externo) y 100 (el más seguro, interno). La filosofía de funcionamiento del Adaptive Security Algorithm se basa en estas reglas: ♦ Ningún paquete puede atravesar el cortafuegos sin tener conexión y estado. ♦ Cualquier conexión cuyo origen tiene un nivel de seguridad mayor que el destino (outbound) es permitida si no se prohíbe explícitamente mediante listas de acceso. ♦ Cualquier conexión que tiene como origen una interfaz o red de menor seguridad que su destino (inbound) es denegada, si no se permite explícitamente mediante listas de acceso. ♦ Los paquetes ICMP son detenidos a no ser que se habilite su tráfico explícitamente. ♦ Cualquier intento de violación de las reglas anteriores es detenido, y un mensaje de alerta es enviado a syslog. Cuando a un interfaz del cortafuegos llega un paquete proveniente de una red con menor nivel de seguridad que su destino, el firewall le aplica el adaptive security algorithm para verificar que se trata de una trama válida, y en caso de que lo sea comprobar si del host origen se ha establecido una conexión con anterioridad; si no había una conexión previa, el firewall PIX crea una nueva entrada en su tabla de estados en la que se incluyen los datos necesarios para identificar a la conexión. El cortafuegos PIX puede resultar muy complejo de gestionar, especialmente a los que provenimos del mundo Unix, ya que como hemos dicho se asemeja más a un router que a un servidor con cualquier flavour de Unix; es por tanto recomendable consultar bibliografía adicional antes de trabajar con estos equipos. La primera sesión con PIX Firewall Si conectamos al firewall por consola a través de una línea serie entramos directamente sin necesidad de contraseña, en modo no privilegiado; esto lo sabemos porque nos aparece el prompt siguiente: pixie>
Si en este prompt tecleamos la orden `?', nos mostrará la ayuda disponible en el modo sin privilegios: dixie> ? enable pager quit dixie>
Enter privileged mode or change privileged mode password Control page length for pagination Disable, end configuration or logout
Son pocos comandos con los que apenas se puede hacer nada; la orden pager nos permite ajustar el número de líneas para paginar, la orden quit (o exit) sale del firewall, y la orden enable nos pasa a modo superusuario, pidiendo la contraseña (que por defecto será `cisco'); cada orden del PIX se puede abreviar (por ejemplo, en lugar de enable podríamos teclear ena): dixie> ena Password: ***** dixie#
Como vemos, al estar en modo privilegiado, el prompt cambia y nos muestra una almohadilla; en este modo ya podemos reconfigurar parámetros del PIX, y tenemos más órdenes disponibles que antes: dixie# ? arp auth-prompt configure copy debug disable enable flashfs kill pager passwd ping quit reload session terminal who write dixie#
Change or view the arp table, and set the arp timeout value Customize authentication challenge, reject or acceptance prompt Configure from terminal, floppy, or memory, clear configure Copy image from TFTP server into flash. Debug packets or ICMP tracings through the PIX Firewall. Exit from privileged mode Modify enable password Show or destroy filesystem information Terminate a telnet session Control page length for pagination Change Telnet console access password Test connectivity from specified interface to Disable, end configuration or logout Halt and reload system Access an internal AccessPro router console Set terminal line parameters Show active administration sessions on PIX Write config to net, flash, floppy, or terminal, or erase flash
Para comenzar a reconfigurar el firewall nos pondremos en modo configuración (desde modo privilegiado) con la orden configure (la `t' corresponde a Terminal); de nuevo, cambia el prompt que nos aparece en consola: dixie# con t dixie(config)#
En este modo disponemos de más comandos para configurar el PIX; como siempre, podemos verlos con la orden `?': dixie(config)# ?
aaa access-group access-list age alias apply arp auth-prompt aaa-server ca clock conduit crypto configure copy debug disable domain-name dynamic-map enable established failover filter fixup flashfs ipsec isakmp global hostname vpdn interface ip kill link linkpath logging map mtu name nameif names nat outbound pager passwd ping quit radius-server reload rip route session snmp-server sysopt static tacacs-server telnet terminal
Enable, disable, or view TACACS+ or RADIUS user authentication, authorization and accounting Bind an access-list to an interface to filter inbound traffic Add an access list This command is deprecated. See ipsec, isakmp, map, ca commands Administer overlapping addresses with dual NAT. Apply outbound lists to source or destination IP addresses Change or view the arp table, and set the arp timeout value Customize authentication challenge, reject or acceptance prompt Define AAA Server group CEP (Certificate Enrollment Protocol)Create and enroll RSA key pairs into a PKI (Public Key Infrastructure). Show and set the date and time of PIX Add conduit access to higher security level network or ICMP Configure IPsec, IKE, and CA Configure from terminal, floppy, or memory, clear configure Copy image from TFTP server into flash. Debug packets or ICMP tracings through the PIX Firewall. Exit from privileged mode Change domain name Specify a dynamic crypto map template Modify enable password Allow inbound connections based on established connections Enable/disable PIX failover feature to a standby PIX Enable, disable, or view URL, Java, and ActiveX filtering Add or delete PIX service and feature defaults Show or destroy filesystem information Configure IPSEC policy Configure ISAKMP policy Specify, delete or view global address pools, or designate a PAT (Port Address Translated) address Change host name Configure VPDN (PPTP) Policy Identify network interface type, speed duplex, and if shutdown Set ip address for specified interface, define a local address pool, or toggle Unicast Reverse Path Forwarding on an interface. Terminate a telnet session This command is deprecated. See ipsec, isakmp, map, ca commands This command is deprecated. See ipsec, isakmp, map, ca commands Enable logging facility Configure IPsec crypto map Specify MTU(Maximum Transmission Unit) for an interface Associate a name with an IP address Assign a name to an interface Enable, disable or display IP address to name conversion Associate a network with a pool of global IP addresses Create an outbound access list Control page length for pagination Change Telnet console access password Test connectivity from specified interface to Disable, end configuration or logout Specify a RADIUS aaa server Halt and reload system Broadcast default route or passive RIP Enter a static route for an interface Access an internal AccessPro router console Provide SNMP and event information Set system functional option Map a higher security level host address to global address Specify a TACACS+ server Add telnet access to PIX console and set idle timeout Set terminal line parameters
tftp-server timeout url-cache url-server virtual who write dixie(config)#
Specify default TFTP server address and directory Set the maximum idle times Enable URL caching Specify a URL filter server Set address for authentication virtual servers Show active administration sessions on PIX Write config to net, flash, floppy, or terminal, or erase flash
Interfaces de red Cisco denomina a cada uno de sus interfaces hardware de la forma ethernetN o tokenringN. Desde el modo configuración podemos asignarles nombres simbólicos y niveles de seguridad, teniendo en cuenta que el nombre outside se asigna por defecto a la tarjeta ethernet0 y el nombre inside a la ethernet1. Además, el nivel de seguridad de la interfaz outside ha de ser el más bajo, 0, y el reservado para inside el más elevado, 100; el resto de tarjetas pueden tener cualquier número comprendido entre los dos anteriores. Si queremos asignarle un nombre simbólico y un nivel de seguridad a un interfaz hemos de utilizar la orden nameif; por ejemplo, para denominar dmz a la tarjeta ethernet2, y darle un nivel 50, ejecutaríamos lo siguiente : dixie(config)# nameif e2 dmz security50 dixie(config)#
Es muy importante que exista una interface llamada outside con un nivel 0 y una inside con un nivel 100; si alguna de las dos no existe, o si está duplicada, el cortafuegos parará todo el tráfico que pase por él. Podemos ver si la configuración actual de las interfaces es correcta mediante la orden show nameif: dixie(config)# show nameif nameif ethernet0 outside security0 nameif ethernet1 inside security100 nameif ethernet2 dmz security50 nameif ethernet3 intf3 security15 dixie(config)#
Accesos entre interfaces Para conseguir excepciones a las reglas de funcionamiento del adaptive security algorithm se utilizan los comandos nat y static; la orden nat permite que una interfaz de mayor seguridad pueda acceder a uno de menor, mientras que static hace justo lo contrario. Para cada interfaz de mayor nivel de seguridad que quiera acceder a una de menor nivel hemos de ejecutar la orden nat: dixie(config)# nat (dmz) 0 0.0.0.0 0.0.0.0 dixie(config)# sh nat nat (dmz) 0 0.0.0.0 0.0.0.0 0 0 pixie(config)#
La orden anterior indica que el interfaz dmz accederá sin realizar NAT (el primer `0'), aplicando esto a todas las máquinas de la subred conectada a ese interfaz: los dos grupos `0.0.0.0' representan la dirección y la subred, respectivamente, de los equipos a
los que permitimos la salida; si sólo quisiéramos que una de las máquinas conectada al interfaz dmz accediera a segmentos de menor prioridad, pondríamos su dirección IP y su máscara (255.255.255.255). Si lo que queremos es permitir el acceso desde un interfaz de menor nivel de seguridad a uno de mayor ejecutaremos la orden static, que tiene la sintaxis siguiente: static (if_interna,if_externa) dir_destino dir_destino netmask mascara El hecho de que aparezca por duplicado la dirección destino de la máquina que estamos `publicando' al exterior es porque, al ejecutar la orden nat, hemos decidido no hacer NAT real; si lo estuviéramos haciendo, en lugar de la dirección destino utilizaríamos en primer lugar la dirección que le damos a la máquina hacia el exterior (típicamente, una IP pública) y en segundo la dirección que tiene el equipo dentro de la red a la que está directamente conectado (una privada). De esta forma, si lo que queremos es que desde toda Internet (interfaz outside) se pueda acceder a nuestro servidor de correo POP3, en la máquina 158.42.22.41 (por ejemplo, dentro del interfaz dmz), ejecutaríamos en primer lugar la siguiente orden: dixie(config)# static (dmz,outside) 158.42.22.41 158.42.22.41 netmask 255.255.255.255 dixie(config)# sh static static (dmz,outside) 158.42.22.41 158.42.22.41 netmask 255.255.255.255 0 0 dixie(config)#
Con el comando anterior nos limitamos a `publicar' la dirección de una máquina protegida por el PIX firewall al resto de Internet; pero esto no significa que ya se pueda acceder a ese sistema: tras la orden static, es necesario habilitar listas de control de acceso a los diferentes servicios de la dirección que hemos publicado, y asociar dichas listas de control a la interfaz correspondiente; si por ejemplo el acceso necesitado es SMTP, ejecutaríamos la siguiente orden: dixie(config)# access-list prueba permit tcp any host 158.42.22.41 eq smtp dixie(config)# access-group prueba in interface outside dixie(config)#
Como vemos, asociamos la lista de control a la interfaz de entrada del tráfico, no a la que está conectada la máquina. El tema de las listas de control de acceso es el que vamos a ver en el punto siguiente. Listas de control de acceso Como acabamos de decir, para acceder a determinados servicios de una máquina, una vez hemos dejado establecer las conexiones entre interfaces, es necesario definir permisos sobre el modo de acceso, el origen y los servicios a los que se permite acceder de esa máquina; esto lo conseguiremos mediante la orden access-list, cuya sintaxis es la siguiente: access-list ID accion proto dir-origen pto-origen dir-destino pto-destino Si por ejemplo queremos habilitar un acceso HTTP desde cualquier lugar de Internet, y además acceso POP3 desde un determinado segmento externo (por ejemplo, 196.33.22.128/25) a la máquina 158.42.22.41, lo haremos mediante una lista de control de dos entradas (que llamaremos prova), que podemos crear con las siguientes órdenes:
pixie(config)# access-list prova permit tcp any host 158.42.22.41 eq http pixie(config)# access-list prova permit tcp 196.33.22.128 255.255.255.128 host 158.42.22.41 eq http pixie(config)#
Dentro de una lista de control es importante asegurarse que la regla más general es siempre la última; PIX funciona en este sentido como Firewall-1: en el momento en que una determinada regla hace match, se aplica y no se sigue analizando el resto. Por ejemplo, si queremos que ningún equipo del exterior haga ping a la máquina 158.42.22.41, excepto los que provienen de la red 196.72.31.0/24, definiremos la siguiente lista de control de acceso: pixie(config)# access-list prova permit icmp 196.72.31.0 255.255.255.0 host 158.42.22.41 pixie(config)# access-list prova deny icmp any any pixie(config)#
Con las órdenes anteriores no hacemos más que definir (o modificar, si ya existía) la ACL `prova'; esto no tiene ningún efecto sobre el funcionamiento del cortafuegos, ya que para que lo tenga tenemos que asociar esta lista a una interfaz de red: en concreto, a aquella de la que va a provenir el tráfico de entrada en cada caso. Para ello, utilizaremos la orden access-group: pixie(config)# access-group prova in interface outside pixie(config)#
Con este comando asociamos la lista de control a la interfaz especificada; si esta interfaz ya tenía asociada una lista de control, la nueva reemplaza a la antigua pero las conexiones no se pierden, ni siquiera las que estaban permitidas anteriormente pero ahora se niegan. Esto es útil para poder añadir entradas intermedias a las listas de control sin que las conexiones establecidas por el interfaz al que queremos asociarlas se pierdan: para ello, lo más rápido es copiar la lista en un editor de textos, realizar sobre el mismo las modificaciones necesarias, y grabarla de nuevo en el cortafuegos con otro nombre; tras esto, la asociamos al interfaz correspondiente mediante access-group, y cuando estemos seguros de que todo funciona correctamente la grabamos en memoria mediante write mem. Si lo que queremos es añadir una entrada al final de la lista de control no es necesario todo esto: basta con ejecutar el access-list correspondiente para que la nueva entrada se añada a la lista, y automáticamente se aplique sobre el interfaz; si no queremos añadir, sino eliminar entradas de una ACL, podemos ejecutar directamente no access-list, orden que recibe como parámetro la entrada a eliminar: pixie(config)# sh access-list prova access-list prova permit tcp any host 158.42.22.41 eq smtp (hitcnt=0) access-list prova permit tcp any host 158.42.22.41 eq pop3 (hitcnt=0) access-list prova permit tcp any host 158.42.22.41 eq telnet (hitcnt=0) pixie(config)# no access-list prova permit tcp any host 158.42.22.41 eq pop3 pixie(config)# sh access-list prova access-list prova permit tcp any host 158.42.22.41 eq smtp (hitcnt=0) access-list prova permit tcp any host 158.42.22.41 eq telnet (hitcnt=0) pixie(config)#
Como siempre, una vez que estemos seguros de que la configuración es correcta, será necesario grabar los cambios en memoria flash mediante write mem. Rutado En el cortafuegos PIX es necesario especificar mediante rutas estáticas cómo vamos a encaminar los paquetes que nos llegan, añadiendo una ruta para cada red conectada a un interfaz; sólo podremos asignar una ruta por defecto, asociada siempre al interfaz outside. Para ver las rutas del firewall utilizaremos la orden sh route: pixie(config)# sh route outside 0.0.0.0 0.0.0.0 172.17.1.3 1 OTHER static inside 172.17.2.0 255.255.255.0 172.17.2.1 1 CONNECT static dmz 192.168.63.0 255.255.255.0 192.168.63.156 1 CONNECT static failover 192.168.87.208 255.255.255.252 192.168.87.209 1 CONNECT static dmz 158.42.0.0 255.255.0.0 192.168.63.156 1 OTHER static pixie(config)#
Como vemos, la ruta por defecto está asociada a la interfaz outside; además, la interfaz dmz tiene dos rutas, una para una clase pública y otra para una privada, y también existe una boca del firewall dedicada en exclusiva al failover, del que hablaremos más adelante. Si lo que queremos es modificar cualquiera de estas rutas, añadir rutas nuevas, o eliminar alguna de ellas, ejecutaremos la orden route, cuya sintaxis es la siguiente: route interfaz direccion-remota mascara gateway metrica Por ejemplo, si deseamos enrutar el tráfico dirigido a la red 192.168.63.128/25 a través del interfaz dmz, que tiene como dirección IP 192.168.63.156, y que está directamente conectado a la red (un salto), ejecutaríamos esta orden: pixie(config)# route dmz 192.168.63.128 255.255.255.128 192.168.63.156 1 pixie(config)#
Para eliminar una ruta, ejecutaremos el comando no route, que recibe como parámetro la ruta que deseamos eliminar (algo similar a lo que sucedía con las listas de control de acceso). Arranque y parada del cortafuegos La orden reload (modo privilegiado) reinicia el firewall y carga su configuración, bien desde diskette bien desde la memoria flash (en caso de que no haya ningún disco en la unidad). Al ejecutar reload se nos pedirá confirmación para reiniciar el cortafuegos, y es muy importante que en caso de no querer ejecutar el comando tecleemos `n'; cualquier otra respuesta ejecuta la orden. Configuraciones del sistema Nombre de la máquina Mediante la orden hostname cambiamos el nombre de host del cortafuegos: dixie(config)# hostname pixie pixie(config)# hostname dixie dixie(config)#
Contraseñas En modo configuración podemos cambiar la contraseña de acceso al modo privilegiado mediante la orden enable password; mediante show enable vemos la cadena cifrada con nuestra contraseña: dixie(config)# show enable enable password /hVDnFhQPQc4lzN5 encrypted dixie(config)# enable password passprova dixie(config)# show enable enable password S6KVLr8BjSKx8os/ encrypted dixie(config)#
Esta clave es diferente de la que se utiliza para acceder al cortafuegos vía telnet; para modificar esta última (por defecto será `cisco') utilizaremos la orden passwd, y para visualizar la cadena cifrada resultante show passwd: dixie(config)# show passwd passwd 2KFQnbNIdI.2KYOU encrypted dixie(config)# passwd prova dixie(config)# show passwd passwd /hVDnFhQPQc4lzN5 encrypted dixie(config)#
Si quisiéramos restaurar esta contraseña a su valor original (`cisco'), no tenemos más que ejecutar la orden clear passwd: dixie(config)# show passwd passwd /hVDnFhQPQc4lzN5 encrypted dixie(config)# clear passwd dixie(config)# show passwd passwd 2KFQnbNIdI.2KYOU encrypted dixie(config)#
La cadena `encrypted' que aparece tras la contraseña indica que se trata de una clave cifrada; también nos puede resultar útil para asignar un password directamente en cifrado, en lugar de hacerlo en texto claro: dixie(config)# show passwd passwd 2KFQnbNIdI.2KYOU encrypted dixie(config)# passwd /hVDnFhQPQc4lzN5 encrypted dixie(config)# show passwd passwd /hVDnFhQPQc4lzN5 encrypted dixie(config)# show enable password enable password 2KFQnbNIdI.2KYOU encrypted dixie(config)# enable password /hVDnFhQPQc4lzN5 encrypted dixie(config)# show enable password enable password /hVDnFhQPQc4lzN5 encrypted dixie(config)#
En caso de pérdida de la clave de acceso vía telnet, no tenemos más que conectar al cortafuegos mediante una conexión serie y, desde el modo privilegiado asignar una nueva contraseña; si lo que hemos perdido es la clave para situar al cortafuegos en modo privilegiado, el proceso es algo más complicado: en este caso debemos
descargar la utilidad PIX Password Lockout Utility apropiada para nuestra versión de firewall (que podemos ver con sh version), desde la dirección http://www.cisco.com/warp/public/110/34.shtml Se trata de un fichero `.bin' que podemos transferir a un disquette mediante la orden dd: anita:~$ dd if=np51.bin of=/dev/fd0 144+0 records in 144+0 records out anita:~$
Tenemos que arrancar con el disco al que hemos transferido este sistema, que nos automáticamente nos preguntará si queremos borrar las claves; le diremos que sí y reiniciaremos el cortafuegos, que tendrá como contraseña de acceso remoto `cisco' y no tendrá password para pasar al modo privilegiado. Cambios permanentes Cada vez que nuestro PIX se apague perderá su configuración y cargará o bien una introducida en un diskette (esto es sólo teoría, nunca nos ha funcionado correctamente) o bien la que está grabada en su memoria flash; si deseamos que nuestros cambios sean permanentes hemos de grabarlos o en disco o en memoria flash , mediante la orden write (write floppy o write mem, en cada caso): dixie# write mem Building configuration... Cryptochecksum: 206a9447 17e7ec36 d53c98d2 22a06c5e [OK] dixie# wr floppy Building configuration... [OK] dixie#
Si lo que queremos es visualizar la configuración que vamos a grabar (la actual), podemos ejecutar la orden write terminal, que la volcará en pantalla; esto representa la configuración que se está ejecutando en estos momentos, cuyo resultado puede ser diferente del proporcionado por sh conf (este último muestra la configuración que hemos cargado al arrancar). Configuración de terminal Para reconfigurar el número de líneas de nuestra terminal de conexión, tanto en modo privilegiado como en modo usuario, podemos usar la orden pager, que recibe como parámetro el número de líneas deseado: dixie> show pager pager lines 24 dixie> pager 30 dixie> show page pager lines 30 dixie>
Para configurar el número de columnas de nuestra consola podemos utilizar el comando terminal; si esta orden recibe como parámetro la palabra monitor, habilita la impresión de mensajes de syslog en nuestra pantalla, mientras que si recibe como parámetro la
palabra width modifica el número de columnas. De nuevo, para ver la configuración actual utilizaremos la orden show: dixie# show terminal Width = 80, monitor dixie# terminal width 90 dixie# show terminal Width = 90, monitor dixie#
Información del sistema Las órdenes que nos permiten obtener información del estado actual del PIX comienzan por la palabra `show'; algunas de ellas son las siguientes: show processes Muestra los procesos que se están ejecutando en el cortafuegos. show version Muestra información genérica sobre el firewall, como la versión del software instalado en el PIX, el uptime del sistema, ciertos parámetros hardware, licencias, etc. Este es un ejemplo de dicha información: dixie(config)# show version Cisco Secure PIX Firewall Version 5.1(2) Compiled on Tue 16-May-00 16:09 by bhochuli Finesse Bios V3.3 dixie up 140 days 0 hours Hardware: SE440BX2, 128 MB RAM, CPU Pentium II 349 MHz Flash AT29C040A @ 0x300, 2MB BIOS Flash AM28F256 @ 0xfffd8000, 32KB 0: 1: 2: 3:
ethernet0: ethernet1: ethernet2: ethernet3:
address address address address
Licensed connections:
is is is is
0090.279b.c9d2, irq 11 0090.279b.c848, irq 10 0090.279b.c759, irq 15 0090.279b.c84c, irq 9 65536
Serial Number: 18018531 (0x112f0e3) Activation Key: 0xfe1f8896 0xe1fcb1e2 0x3400545b 0x8f392616 dixie(config)#
show interface Muestra información detallada sobre cada uno de los interfaces de red del firewall, de forma muy parecida al ifconfig de Unix. show conn Muestra las conexiones activas a través del cortafuegos.
show history Muestra las últimas órdenes ejecutadas en línea de comandos, de una forma similar al histórico que casi todos los shells de Unix incorporan; la interfaz del PIX es muy similar a la de bash: Control-W borra una palabra, Control-E va al final de línea, Control-B al principio, Control-R realiza búsquedas, los cursores recorren el histórico de órdenes, etc. show flashfs Muestra información sobre el sistema de ficheros empotrado en la memoria flash de la máquina. show clock Muestra la fecha y hora del sistema; podemos modificar esta información mediante la orden clock: pixie(config)# sh clock 01:38:34 Jun 11 2001 pixie(config)# clock set 03:30:00 Jun 11 2001 pixie(config)# sh clock 03:30:02 Jun 11 2001 pixie(config)#
show configure Muestra la configuración cargada al arrancar el cortafuegos (no tiene por qué ser la que se está ejecutando en estos momentos; esta se puede ver con wr t). Es el contenido de la memoria no volátil. show failover Muestra el estado del subsistema de tolerancia a fallos. show who Muestra las conexiones establecidas vía telnet con el cortafuegos.
El sistema de log remoto El PIX Firewall registra los eventos que se producen en la máquina en un sistema de log que podemos visualizar en el propio cortafuegos mediante la orden sh log. También podemos enviar los registros a un sistema Unix que escuche peticiones de syslog remoto, indicando la interfaz por la que se van a enviar los registros y la dirección del sistema remoto mediante logging host: pixie(config)# logging host inside 192.168.63.22 pixie(config)# En el sistema donde deseemos enviar los registros, el demonio syslogd ha de estar escuchando peticiones remotas (opción `-r' del programa), y en los cortafuegos intermedios ha de estar habilitado el tráfico desde el PIX al puerto 514 (UDP) de la máquina Unix. Por defecto, PIX registra eventos más relacionados con el estado del failover que con la seguridad de los sistemas y los posibles ataques que pueden sufrir. Esto genera una gran cantidad de mensajes que pueden hacer crecer al fichero de log de una forma considerable con entradas de este tipo:
Jun 6 09:46:37 192.168.63.156 %PIX-1-103003: network interface 0 failed. Jun 6 09:46:49 192.168.63.156 %PIX-1-103005: reporting failure. Jun 6 09:46:49 192.168.63.156 %PIX-1-105004: interface 1 normal Jun 6 09:51:04 192.168.63.156 %PIX-1-105009: 0 Passed
(Primary) Other firewall (Primary) Other firewall (Primary) Monitoring on (Primary) Testing on interface
Para evitar registrar estos mensajes, en el cortafuegos podemos ejecutar la orden no logging message, que recibe como parámetro el número de mensaje que no queremos guardar; por ejemplo, si queremos evitar el registro de la alerta PIX-1-103003, ejecutaremos: pixie(config)# no logging message 103003 pixie(config)# Si queremos lo contrario, volver a registrar el mensaje en el sistema remoto, ejecutaremos la misma orden pero sin el `no' delante, o bien clear logging disabled, que habilita el registro de todos los mensajes. pixie(config)# logging message 103003 pixie(config)#
Podemos ver los mensajes que no estamos registrando mediante el comando sh logging disabled: pixie(config)# sh logging disabled no logging message 105008 no logging message 105009 no logging message 103003 no logging message 103004 no logging message 103005 pixie(config)#
A nosotros nos va a interesar más registrar eventos registrados con entradas y salidas al cortafuegos, y también con tráfico negado en el mismo. Para ello, podemos ver la facility y la severity de los mensajes de log en el sistema Unix; la facility es siempre PIX, mientras que la severity es el número siguiente en el código de mensaje registrado (de 1 a 7); por ejemplo, un mensaje con un código como PIX-6-307002 corresponde a una facility PIX y a una severity 6. Podemos configurar nuestro syslog.conf para registrar los eventos provenientes del PIX (para Unix, con severity local4) en diferentes ficheros; lo más cómodo será registrar todos los eventos (ejecutando logging trap debugging) con una facility 20 (logging facility 20), y luego denegar mensajes determinados - relativos al failover mediante no logging message. Failover El sistema de alta disponibilidad implantado por PIX permite utilizar una unidad secundaria que tomará el control de las conexiones en caso de que la primaria falle; ambas unidades estarán conectadas por un cable serie (un RS-232 modificado) que transmite a 9600 baudios, y contínuamente se intercambian mensajes `hello' para que ambas puedan conocer el estado de la otra unidad. Si dos de estos mensajes consecutivos - se envían a intervalos de 15 segundos - no son recibidos en un
determinado tiempo, entra en juego el failover para comprobar cual de las dos unidades ha fallado y transferir el control a la otra. Entonces cada unidad cambia de estado: la nueva unidad activa asume las direcciones IP y MAC de la anterior y comienza a aceptar tráfico, y la que antes era la activa ahora asume los parámetros de la que no lo era; el resto de elementos de la red no ve ningún cambio en los dispositivos, por lo que no existen cambios o timeouts en las tablas ARP. Si queremos saber el estado del failover (por ejemplo para ver cuál es la unidad activa en un determinado momento) hemos de ejecutar la orden sh failover: pixie(config)# sh failover Failover On Cable status: Normal Reconnect timeout 0:00:00 This host: Primary - Active Active time: 386520 (sec) Interface failover (192.168.87.209): Normal Interface dmz1 (192.168.63.156): Normal Interface outside (172.17.1.1): Normal Interface inside (172.17.2.1): Normal Other host: Secondary - Standby Active time: 405 (sec) Interface failover (192.168.87.210): Normal Interface dmz1 (192.168.63.157): Normal Interface outside (172.17.1.2): Normal Interface inside (172.17.2.2): Normal Stateful Failover Logical Update Statistics Link : failover Stateful Obj xmit xerr rcv General 53081 0 50149 sys cmd 52067 0 50146
up time
xlate tcp conn udp conn ARP tbl RIP Tbl
0
9
0
0
1005 0 0 0 0 0 0 0
rerr 0 0
0
0 0 0 0
0
0 3
0 0 0
0
Logical Update Queue Information Cur Max Total Recv Q: 0 1 50149 Xmit Q: 0 3 53081 pixie(config)#
En el resultado de la orden anterior vemos que la unidad principal está funcionando normalmente, mientras que la secundaria está en standby; esto será lo habitual si no entra en juego el failover o incluso si entra y la unidad principal se recupera, ya que en ese caso se hace un rebalanceo. Si en lugar de que todas las interfaces estén en estado normal aparecieran errores temporales de escasa duración, no hay ningún problema, ya que esto suele significar que el cortafuegos está testeando la alta disponibilidad y la conectividad de las interfaces. El failover es casi transparente a la administración de la máquina, en el sentido de que la configuración sólo se realiza en la unidad activa en cada momento, y automáticamente se transfiere a la que está en standby; además, como hemos dicho, cuando entra la alta
disponibilidad las unidades intercambian sus direcciones IP, por lo que el acceso vía telnet a la máquina se realiza contra la misma dirección que durante el funcionamiento normal de los equipos. Incluso si trabajamos con stateful failover, las unidades mantienen la información de estado de cada conexión, por lo que en caso de switchover ninguna de ellas se pierde; en caso contrario, las conexiones activas son eliminadas y el cliente debe reestablecerlas. Con la orden failover podemos habilitar el failover, y con no failover deshabilitarlo: pixie(config)# no failover pixie(config)# sh failover Failover Off Cable status: Normal Reconnect timeout 0:00:00 pixie(config)#
Las órdenes anteriores también admiten argumentos; si indicamos `link' podemos definir la interfaz de stateful failover, por la que ambas unidades intercambiarán información. Con `ip address' podemos configurar una dirección de failover para cada interfaz de la unidad secundaria, y con el parámetro `active' forzamos a una unidad determinada ponerse como activa (o en standby, si ejecutamos no failover active). Como siempre, podemos teclear el signo `?' para obtener ayuda desde línea de comandos: pixie(config)# failover ? usage: [no] failover [active] failover ip address failover timeout failover reset failover link pixie(config)# failover