Usar filtrado de MACs con iptables en Linux

Los administradores de seguridad perimetral están acostumbrados a trabajar con IPs en las reglas de sus firewalls y no es raro, por ejemplo, que pidan permitir a una IP local el acceso directo a Internet, sin proxy y sin restricción de puertos, para un usuario VIP o para un desarrollador que tiene que hacer algunas pruebas temporalmente, ya sabéis, esas pruebas temporales que duran un día... o tres años.

Estas IPs "especiales" con permisos son un dulce caramelo para un atacante infiltrado en la LAN que quiera usar un shell inverso o simplemente sacar información fácilmente. Para conseguirla, sólo tendría que probar todas las direcciones IP posibles de su rango para ver si alguna todavía está configurada en una de esas reglas "temporales". Además, como en la mayoría de los segmentos de red se utilizan clases C, como mucho habrá 254 IPs posibles y eso automatizándolo con un script es un suspiro en términos de tiempo.
Sin embargo, si en vez de una IP hubiéramos usado la dirección física o MAC, el atacante tendría que haber falsificado 256^6 direcciones, o lo que es lo mismo 281,5 trillones de direcciones posibles y eso sólo hablando de IPv4... es decir, le hubiese resultado inviable.

Por supuesto para hacer IP/MAC spoofing o jugar con ARP será necesario tener "cintura" y las cosas se complican si la electrónica de red tiene habilitada características como port security o ip source guard, pero quería sólo comentaros un ejemplo para que veais que de que, de vez en cuando, es buena idea utilizar direcciones MAC para permitir ciertos accesos en los firewalls, y no sólo en wlan.

Y bueno, como prefiero no entrar en el detalle de ningún firewall comercial, vamos a ver cómo filtrar direcciones MAC en Netfilter, con nuestras queridas iptables.

La sintaxis general es:

iptables -I "CHAIN-NAME" -m mac --mac-source "MAC-ADDRESS" -j "ACTION"

Si queremos permitir el tráfico desde una lista de MACs contenidas en un fichero:

for MAC in `cat fichero_direcciones_MAC`; do
  iptables -A FORWARD -i eth0 -o eth1 -m mac --mac-source $MAC -j ACCEPT
done


Y luego denegar el resto:

iptables -P FORWARD  DROP

Más ejemplos, permitir la conexión al puerto 22 desde la MAC 00:0F:EA:91:04:07:

iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT

Restringir el acceso ssh a todos excepto a la MAC 3E:D7:88:A6:66:8E:

iptables -I INPUT -p tcp --port 22 -m mac ! --mac-source 3E:D7:88:A6:66:8E -j REJECT

Denegar todas las conexiones entrantes desde la MAC 00:0F:EA:91:04:08:

iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP


¿Alguno más? ;)

2 comentarios :

  1. El filtrado de MAC tal y cómo dices resulta más seguro, pero utilizando el filtrado por IP tienes la comodidad de poder cambiarte la IP desde cualquier equipo de la red (estoy hablando en equipos Windows) y poder realizar las tareas que deseas con esa IP_PODEROSA.

    Utilizando las MAC tendríamos que habilitar todas las MAC existentes en nuestra red para que desde cualquier ordenador de la red pudiéramos tener el control.

    En este caso la seguridad tiene un precio, ahora ya es cosa de cada sysadmin cómo desea hacerlo :)

    Una posibilidad que se me ocurre, ¿se podría implementar también Latch (de ElevenPaths) para meterle aún más seguridad?

    ResponderEliminar
    Respuestas
    1. hace poco Ignacio Cabra desarrolló un plugin de Latch para el firewall de Windows, sería cuestión de mirar algo para Netfilter u otro firewall de red...

      Eliminar