ACLs, Listas de Control de Acceso

Siguiendo el hilo de la entrada anterior, “Cuando las VLANs y Firewall no son suficientes” vamos hablar de las ACL, Access Control List o Listas de Control de Acceso.

¿Qué son?

Una Lista de Control de Acceso es un conjunto de sentencias que permiten o deniegan un tráfico determinado. Algo similar a lo que viene hacer un cortafuegos.

¿Para qué se utilizan?

Aunque pueden tener diversos usos, es una manera “sencilla” de filtrar el tráfico que pasa por un dispositivo de red de capa 3, o también para el acceso al mismo vía SSH. Es útil para aplicar ciertas políticas de seguridad.

¿Qué tipos hay?

Hay varios tipos, pero poniendo como ejemplo los dispositivos Cisco, las más utilizadas son las “Standard” y “Extended”. En las “Standard” emplearemos como parámetro de filtrado las direcciones IP de origen; mientras que las “Extended” utilizaremos la IPs de origen, destino y puertos. También tendremos las “Named”, que es lo mismo que las dos anteriores pero nos permiten asignarlas un nombre en lugar de un número. Más adelante lo explicaremos.

¿Cómo funcionan?

Una Lista de Control de Acceso se compone de una serie de sentencias que permiten o deniegan un tráfico determinado. El equipo irá comparando cada paquete con cada una de las sentencias de la ACL, de la primera a la última. En el momento que un paquete coincida con la sentencia, ésta se ejecuta y no se sigue comparando. Cada ACL tiene un “deny any” implícito al final de las sentencias, esto es, si un paquete no coincide con ninguna de las sentencias se descarta.

¿Cómo se utilizan?

Una vez que la ACL está creada, se debe aplicar a una intefaz, y también en un sentido determinado. Es decir, en sentido entrante (Inbound) o saliente (Outbound) a esa interfaz.

A este respecto debemos tener en cuenta dos aspectos importantes. Cuando una ACL se aplica en sentido entrante, los paquetes que serán evaluados primero por dicha ACL, y en caso de ser permitidos será entonces cuando el equipo los enrute por alguna interfaz de salida. Obviamente, todos los paquetes que se denieguen no serán sometidos a la tabla de enrutamiento.

Sin embargo, cuando una ACL se aplica a en sentido “Saliente”, ésta se aplicará una vez los paquetes hayan sido enrutados. O lo que es lo mismo, primero se enrutan y luego se ve si se permiten o deniegan.

¿Por qué este matiz? Tanto el enrutamiento, como comparar cada paquete con cada sentencia de las ACL son procesos que consumen recursos hardware. Por tanto, deberemos tener en cuenta el sentido ya que si tenemos que descartar paquetes, será mejor hacerlo en ACL entrantes de tal manera que el equipo no tenga que malgastar recursos en enrutarlo para luego descartarlo en caso denegar ese mismo tráfico en una ACL saliente.

Por otro lado, es conveniente crear el contenido de las ACL en un editor de texto y luego aplicarla en el equipo haciendo un “copy/paste”. ¿Por qué? Cada vez que añadamos una sentencia ésta será anexada al final de la ACL y tampoco tendremos la posibilidad de borrar una entrada concreta.

ACLs Standard

Las Listas de Control de Acceso Estándar son aquellas que efectúan el filtrado, permitiendo o denegando inspeccionando la IP de origen. Cada ACL de este tipo lo podremos numerar de un rango que podrá ir de 1-99 o 1300-1999.

Switch01(config)#access-list ?
   <1-99> IP standard access list
   <100-199> IP extended access list
   <1000-1099> IPX SAP access list
   <1100-1199> Extended 48-bit MAC address access list
   <1200-1299> IPX summary address access list
   <1300-1999> IP standard access list (expanded range)
   <200-299> Protocol type-code access list
   <2000-2699> IP extended access list (expanded range)
   <300-399> DECnet access list
   <600-699> Appletalk access list
   <700-799> 48-bit MAC address access list
   <800-899> IPX standard access list
   <900-999> IPX extended access list
    dynamic-extended Extend the dynamic ACL absolute timer
    rate-limit Simple rate-limit specific access list

Definido el número, a continuación deberemos especificar si permitimos o denegamos el tráfico en cuestión.

Switch01(config)#access-list 5 ?
   deny Specify packets to reject
   permit Specify packets to forward
   remark Access list entry comment

El siguiente paso será proporcionar los valores:

Switch01(config)#access-list 5 deny ?
   Hostname or A.B.C.D Address to match
   any Any source host
   host A single host address

La primera de las opciones hace referencia a la IP o rango de éstas. La segunda y la tercera permiten, en lugar de especificar en formato numeral “cualquier IP” o “una IP concreta”, introducir los términos “any” y “host” respectivamente.

Máscaras Wildcard

Las Máscaras Wildcard son utilizadas por las ACLs para indicar un equipo, un conjunto de éstos o una red completa. Se asemeja a lo que vendría ser una máscara de subred aunque con bien significado es distinto.

Cuando en una Máscara Wildcard figura un “0” se entiende que el valor que consta en la IP debe coincidir. Sin embargo cuando aparece un “255” puede tomar cualquier valor. Por ejemplo:

192.168.1.0 0.0.0.255

Quiere decir que los tres primeros octetos “192.168.1” que coincidan con el paquete se les aplicará esa sentencia en la ACL. El cuarto octeto podrá tener cualquier valor, de 1 a 254.

Por ejemplo:

Switch01(config)#access-list 10 deny 192.168.1.0 0.0.0.255 

Esto añadirá una sentencia en la que se denegarán todos los paquetes con IP de origen “192.168.1” ya que la máscara tiene un “0”. El cuarto octeto puede tener cualquier valor “255”, entre 1 y 254.

Para indicar rango de subredes deberemos de realizar cálculos. Una manera sencilla para indicar redes es restar “255” a la máscara de subred de una dirección IP contenida en ese rango.

No os asustéis, aquí os dejo unos enlaces donde una calculadora hará el trabajo por vosotros:

Link 1

Link 2

Os dejo unos enlaces que hablan de las Máscaras Wildcard

Link 1

Link 2

Como dije antes, no sólo tenemos que crear las ACL sino además aplicarlas a una interfaz en alguno de los sentidos, bien entrante, bien saliente. Esto es:

Switch01#config t
Switch01(config)#access-list 10 deny 192.168.1.0 0.0.0.255
Switch01(config)#access-list 5 permit any
Switch01(config)#interface Ethernet 0
Switch01(config-if)#ip access-group 10 out 

En la configuración anterior configuramos la access list “Standard”, número 5, en la que denegaríamos la red 192.168.1.0/24, y luego permitiríamos el resto de tráfico. Luego, aplicaríamos dicha ACL a la interfaz Ethernet 0 en sentido saliente.

ACLs Extended

A diferencia de las ACL Standard, las “Extended”, pueden llevar a cabo el filtrado considerando la IP de origen, la de  destino, y los puertos.

Los rangos para identificar estas ACLs van de 100 a 199 y de 2000 a 2699.

Switch01(config)#access-list 115 ?
   deny Specify packets to reject
   dynamic Specify a DYNAMIC list of PERMITs or DENYs
   permit Specify packets to forward
   remark Access list entry comment

Acto seguido definiremos si denegamos o permitimos:

Switch01(config)#access-list 115 deny ?
   <0-255> An IP protocol number
   ahp Authentication Header Protocol
   eigrp Cisco's EIGRP routing protocol
   esp Encapsulation Security Payload
   gre Cisco's GRE tunneling
   icmp Internet Control Message Protocol
   igmp Internet Gateway Message Protocol
   ip Any Internet Protocol
   ipinip IP in IP tunneling
   nos KA9Q NOS compatible IP over IP tunneling
   ospf OSPF routing protocol
   pcp Payload Compression Protocol
   pim Protocol Independent Multicast
   tcp Transmission Control Protocol
   udp User Datagram Protocol

Ahora definiremos el protocolo:

Switch01(config)#access-list 110 deny tcp ?
   A.B.C.D Source address
   any Any source host
   host A single source host

El siguiente parámetro de definir es la IP, red o subred, o cualquier IP de origen. Cabe mencionar que  podremos indicar el puerto de origen con los parámetros eq, gt, lt, neq o range. Para nuestro ejemplo no consideraremos puertos de origen:

Switch01(config)#access-list 110 deny tcp any ?
   A.B.C.D Destination address
   any Any destination host
   eq Match only packets on a given port number
   gt Match only packets with a greater port number
   host A single destination host
   lt Match only packets with a lower port number
   neq Match only packets not on a given port number
   range Match only packets in the range of port numbers

Como es lógico habrá que especificar la IP, red o subred, o cualquier IP de destino.

Switch01(config)#access-list 110 deny tcp any host 172.16.30.2 ?
   ack Match on the ACK bit
   dscp Match packets with given dscp value
   eq Match only packets on a given port number
   established Match established connections
   fin Match on the FIN bit
   fragments Check non-initial fragments
   gt Match only packets with a greater port number
   log Log matches against this entry
   log-input Log matches against this entry, including input interface
   lt Match only packets with a lower port number
   neq Match only packets not on a given port number
   precedence Match packets with given precedence value
   psh Match on the PSH bit
   range Match only packets in the range of port numbers
   rst Match on the RST bit
   syn Match on the SYN bit
   time-range Specify a time-range
   tos Match packets with given TOS value
   urg Match on the URG bit
   <cr>

Aquí sí que tendremos que definir un puerto de destino o parámetros a tal efecto. Los equipos tienen predefinidos el nombre de los servicios en lugar de los números de puertos para que sea más intuitivo.

Switch01(config)#access-list 110 deny tcp any host 172.16.30.2 eq ?
   <0-65535> Port number
   bgp Border Gateway Protocol (179)
   chargen Character generator (19)
   cmd Remote commands (rcmd, 514)
   daytime Daytime (13)
   discard Discard (9)
   domain Domain Name Service (53)
   drip Dynamic Routing Information Protocol (3949)
   echo Echo (7)
   exec Exec (rsh, 512)
   finger Finger (79)
   ftp File Transfer Protocol (21)
   ftp-data FTP data connections (20)
   gopher Gopher (70)
   hostname NIC hostname server (101)
   ident Ident Protocol (113)
   irc Internet Relay Chat (194)
   klogin Kerberos login (543)
   kshell Kerberos shell (544)
   login Login (rlogin, 513)
   lpd Printer service (515)
   nntp Network News Transport Protocol (119)
   pim-auto-rp PIM Auto-RP (496)
   pop2 Post Office Protocol v2 (109)
   pop3 Post Office Protocol v3 (110)
   smtp Simple Mail Transport Protocol (25)
   sunrpc Sun Remote Procedure Call (111)
   syslog Syslog (514)
   tacacs TAC Access Control System (49)
   talk Talk (517)
   telnet Telnet (23)
   time Time (37)
   uucp Unix-to-Unix Copy Program (540)
   whois Nicname (43)
   www World Wide Web (HTTP, 80)

Pues si lo que queremos es bloquear el Puerto 80, quedaría:

Switch01(config)#access-list 110 deny tcp any host 172.16.30.2 eq 80 log 

Como veréis podremos loguear cada vez que un paquete “machee” con esa sentencia. Eso está bien como control, pero ojo que nos puede inundar de mensajes la consola.

ACL Named

Las ACl Named (Nombradas) son aquellas que en lugar de configurarlas con un número, lo podremos hacer con un nombre para que nos sea más intuitivo. La única diferencia será anteponer el término IP a lo que hemos visto.

Switch01(config)#ip access-list standard BlockSales
Switch01(config-std-nacl)#
Switch01(config-std-nacl)#deny 172.16.40.0 0.0.0.255
Switch01(config-std-nacl)#permit any
Switch01(config-std-nacl)#exit 

Y en lo referente a las ACLs esto es todo. EL tema da para mucho más así que aquí os dejo algún otro enlace para que profundicéis sobre el tema.

Link 1

Link 2

Link 3

Link 4

El objetivo de este artículo ha sido mostrar una funcionalidad que no debemos dejar de pasar de alto para proteger nuestras comunicaciones entre sistemas, equipos y dispositivos. Las ACLs son son uns sustituto de un cortafuegos pero pueden ser un aliado muy, muy bueno.

Espero que os haya gustado.

Un saludo!!!