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. Una buena referencia puede ser [JF01], así como la documentación sobre el producto que está disponible a través de la
web de Cisco Systems (
http://www.cisco.com/##).
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 Enter privileged mode or change privileged mode password
pager Control page length for pagination
quit Disable, end configuration or logout
dixie>
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 Change or view the arp table, and set the arp timeout value
auth-prompt Customize authentication challenge, reject or acceptance prompt
configure Configure from terminal, floppy, or memory, clear configure
copy Copy image from TFTP server into flash.
debug Debug packets or ICMP tracings through the PIX Firewall.
disable Exit from privileged mode
enable Modify enable password
flashfs Show or destroy filesystem information
kill Terminate a telnet session
pager Control page length for pagination
passwd Change Telnet console access password
ping Test connectivity from specified interface to <ip>
quit Disable, end configuration or logout
reload Halt and reload system
session Access an internal AccessPro router console
terminal Set terminal line parameters
who Show active administration sessions on PIX
write Write config to net, flash, floppy, or terminal, or erase flash
dixie#
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 Enable, disable, or view TACACS+ or RADIUS
user authentication, authorization and accounting
access-group Bind an access-list to an interface to filter inbound traffic
access-list Add an access list
age This command is deprecated. See ipsec, isakmp, map, ca commands
alias Administer overlapping addresses with dual NAT.
apply Apply outbound lists to source or destination IP addresses
arp Change or view the arp table, and set the arp timeout value
auth-prompt Customize authentication challenge, reject or acceptance prompt
aaa-server Define AAA Server group
ca CEP (Certificate Enrollment Protocol)
Create and enroll RSA key pairs into a PKI (Public Key Infrastructure).
clock Show and set the date and time of PIX
conduit Add conduit access to higher security level network or ICMP
crypto Configure IPsec, IKE, and CA
configure Configure from terminal, floppy, or memory, clear configure
copy Copy image from TFTP server into flash.
debug Debug packets or ICMP tracings through the PIX Firewall.
disable Exit from privileged mode
domain-name Change domain name
dynamic-map Specify a dynamic crypto map template
enable Modify enable password
established Allow inbound connections based on established connections
failover Enable/disable PIX failover feature to a standby PIX
filter Enable, disable, or view URL, Java, and ActiveX filtering
fixup Add or delete PIX service and feature defaults
flashfs Show or destroy filesystem information
ipsec Configure IPSEC policy
isakmp Configure ISAKMP policy
global Specify, delete or view global address pools,
or designate a PAT(Port Address Translated) address
hostname Change host name
vpdn Configure VPDN (PPTP) Policy
interface Identify network interface type, speed duplex, and if shutdown
ip Set ip address for specified interface,
define a local address pool, or
toggle Unicast Reverse Path Forwarding on an interface.
kill Terminate a telnet session
link This command is deprecated. See ipsec, isakmp, map, ca commands
linkpath This command is deprecated. See ipsec, isakmp, map, ca commands
logging Enable logging facility
map Configure IPsec crypto map
mtu Specify MTU(Maximum Transmission Unit) for an interface
name Associate a name with an IP address
nameif Assign a name to an interface
names Enable, disable or display IP address to name conversion
nat Associate a network with a pool of global IP addresses
outbound Create an outbound access list
pager Control page length for pagination
passwd Change Telnet console access password
ping Test connectivity from specified interface to <ip>
quit Disable, end configuration or logout
radius-server Specify a RADIUS aaa server
reload Halt and reload system
rip Broadcast default route or passive RIP
route Enter a static route for an interface
session Access an internal AccessPro router console
snmp-server Provide SNMP and event information
sysopt Set system functional option
static Map a higher security level host address to global address
tacacs-server Specify a TACACS+ server
telnet Add telnet access to PIX console and set idle timeout
terminal Set terminal line parameters
tftp-server Specify default TFTP server address and directory
timeout Set the maximum idle times
url-cache Enable URL caching
url-server Specify a URL filter server
virtual Set address for authentication virtual servers
who Show active administration sessions on PIX
write Write config to net, flash, floppy, or terminal, or erase flash
dixie(config)#
Interfaces de red
Cisco denomina a cada uno de sus interfaces hardware de la forma ethernetN
o token-ringN
. 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 siguiente17.3:
dixie(config)# nameif e2 dmz security50
dixie(config)#
Es muy importante que exista una interfaza 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
.