lunes, 11 de abril de 2016

Firewall ipwf en FreeBSD

Habilitación y configuración de firewall ipfw en FreeBSD

En la presente entrada hago la traduccion de un interesantisimo articulo que encontre en BSD Magazine, acerca de la habilitación y configuración básica del firewall de FreeBSD ipfw, el cual se incluye en el sistema, solo se debe habilitar y configurar.

Basicamente un firewall controla el flujo de información entre una red de confianza (tal como una red corporativa) y una red publica como Internet. Los tipos de firewall mas comunes son basados en puertos (o filtros de paquetes), o alguna variacion tales como los de inspeccion de estado (stateful). Este tipo de firewalls son muy comunes debido a que son muy faciles de operar y mantener, son baratos, tienen buen rendimiento y han sido utilizados durante mas de dos decadas.

Los firewalls (conocidos en español como muros de fuego o cortafuegos) se encargan de bloquear o prevenir que ciertos paquetes de red ingresen a ciertos servicios dentro de nuestra red. Las practicas modernas de seguridad consisten en bloquear todos los paquetes, a excepcion de un pequeño numero bien seleccionado de ellos a los que se les permite ingresar a nuestra red, con el fin de minimizar la superficie de ataque, ademas del numero y alcance de los servicios expuestos en nuestra red.

Los paquetes pueden ser bloqueados en varios niveles de la pila de red. Al nivel practico mas bajo (capa2: nivel de enlace de datos), se pueden bloquear los paquetes provenientes de ciertas direcciones MAC. Es mucho mas util bloquear paquetes entrantes o salientes de ciertas direcciones IP (capa 3: nivel de red), y es aún mas util hacer el bloqueo basados en las propiedades de las conexiones TCP, tales como puertos o sesiones TCP establecidas (capa 4 y superiores: nivel de transporte hacia arriba). Finalmente, hay firewalls que llevan a cabo una inspeccion profunda de paquetes y operan basados en los datos de aplicacion que se transportan a traves de conexiones TCP (capa 7: aplicacion).

La introduccion de firewalls en un sistema de red requiere una planificacion cuidadosa, ya que es muy facil bloquear involuntariamente ciertos servicios o sistemas, incluso para los administradores.

Firewalls con filtrado de paquetes stateful (con estado)

Los primeros tipos de cortafuegos operan basándose exclusivamente en la información estática disponible en paquetes individuales, y debido a eso se denominan "sin estado". Por ejemplo, este tipo de cortafuegos podría bloquear los paquetes a ciertas direcciones IP, o a ciertos puertos TCP mediante el analisis de cada paquete. Sin embargo, protocolos ligeramente más avanzados, tal como TCP, han incluido el estado de la sesión adjunta a los paquetes de red, que es mantenido simultáneamente en las dos partes de la conexión. Sobre la base del estado de la conexión, ciertos tipos de paquetes pueden o no ser aceptados. Por ejemplo (de manera muy simplificada), el protocolo TCP tiene paquetes de red que se utilizan para establecer una conexión, paquetes que llevan datos, y paquetes que llevan datos que tienen algun significado. Es una violación del protocolo enviar paquetes que supuestamente se refieren a una conexión antes o después que esta conexión se establezca correctamente, o enviar paquetes de confirmación de paquetes de datos no existentes. Los firewalls que mantienen un seguimiento del estado de la conexion TCP  se llama "con estado".

Firewalls implementados como parte de los sistemas operativos (como ipfw que forma parte del sistema operativo FreeBSD), operan por debajo de la pila de red TCP / IP del sistema operativo y, como tal, debe mantener el mismo tipo de información que la pila de red, aunque no toda. Esto significa una ligera duplicación de datos entre el firewall y la pila de red, pero es necesario para evitar que los paquetes potencialmente peligrosos lleguen a esta pila.

Como funciona ipfw

Ipfw es uno de los firewalls disponibles en FreeBSD por defecto. Los otros son pf e ipf.

El concepto básico de ipfw es una lista numerada de reglas de firewalls que se recorre en orden para cada paquete recibido. Cada paquete se prueba contra las reglas y si se aplica una regla, se toma una acción determinada (por ejemplo, el paquete es omitido o aceptado sin condiciones). Esta lista es de tamaño fijo y puede contener hasta 65.535 entradas numeradas. Los números asignados a las reglas individuales no tienen ningún significado, solo utilizan para ordenar las reglas.

Los paquetes de red se comparan con las reglas basadas en ciertos datos que contienen, como las direcciones MAC, direcciones IP, los puertos TCP, o incluso los datos del paquete, o cierta información que se asocia con ellos, además de los datos que contienen, por ejemplo de qué interfaz de red se les ha recibido, o el estado de la conexión TCP de la cual forman parte. 

La lista de cosas que ipfw puede hacer con los paquetes es bastante larga, e incluye NAT y calidad de servicio.

Sintaxis de reglas

La sintaxis de reglas ipfw es muy legible, y en general sigue esta forma:

<accion> <protocolo> from <fuente> [ to <destino> [recv| xmit | via <nic>] ] [ opciones ]

Las acciones más comunes son allow (permitir) y deny (denegar). Los protocolos son por lo general IP, TCP o UDP. El origen y el destino son direcciones IP o una de las palabras clave especiales como "any"o "me", y la nic es el nombre de una interfaz de red. Las opciones dependen de un protocolo especifico y pueden incluir palabras clave como "keep-state" para permitir comparacion con estado para esta regla, o "setup" que sólo se aplican a paquetes de establecimiento de conexión TCP (SYN).

Habilitacion de ipfw

Ipfw no está activado por defecto. Está disponible como un modulo del núcleo que se carga automáticamente en el arranque si aparece en  /etc/rc.conf. De forma predeterminada, ipfw se carga sólo con una sola regla, la cual descarta todo el tráfico de red. Debido a esto, tenemos que configurar algunas reglas predeterminadas con el fin de acceder al sistema de forma remota (por ejemplo a través de SSH).

Esto se puede hacer mediante la creación de un archivo llamado  /etc/ipfw.rules con las siguientes líneas:
  
add 500 allow ip from any to any via lo0
add 600 deny ip from table(0) to me
add 1000 allow icmp from any to any
add 2000 allow tcp from me to any setup keep-state
add 2001 allow udp from me to any keep-state
add 4022 allow tcp from any to me 22 setup keep-state
add 4080 allow tcp from any to me 80, 443 setup keep-state
add 5000 allow ip from 192.168.1.0/24 to 192.168.1.0/24
add 65400 deny log ip from any to any

Luego de esto el firewall se debe activar agregando la siguiente linea al archivo  /etc/rc.conf

firewall_enable=”YES”
firewall_type=”/etc/ipfw.rules”


Los ejemplos de la lista dada anteriormente son:

500   Primeramente se permite todo el trafico IP a traves del bucle loopback. Esta primera regla se usa para la eficiencia del firewall, para saltar el filtrado de los paquetes del equipo local en las otras reglas.

600   Bloquea todos los paquetes provenientes de alguna de las direcciones IP registradas en la tabla 0 (las tablas seran descritas mas adelante).

1000  Permite el paso de los paquetes del protocolo ICMP incondicionalmente.

2000  Permite el establecimiento de conexiones ("setup") desde todas las direcciones IP asignadas a las interfaces de red local ("me") hacia cualquier direccion foranea ("any") con inspección de estado de paquetes ("keep-state").


2001  Permitir que los paquetes UDP desde todas las direcciones IP asignadas a las interfaces de red local a cualquier direcciones foranea, y permitir un corto tiempo para recibir una respuesta en el mismo puerto ("keep-state").

4022, 4080  Permitir el establecimiento de conexiones TCP ("setup") desde cualquier dirección foranea ("any") para todas las direcciones IP asignadas a las interfaces de red local ("me") en los puertos 22 , 80 y 443 , con la inspección de estado de paquetes ("keep-state").

5000  Permitir todos los paquetes IP independientemente del protocolo o cualquier otro detalle de todas las direcciones en una red local a todas las direcciones en la misma red . Esto también partidos en todas las direcciones de las interfaces de red locales . Esta regla se abre efectivamente el sistema en su totalidad al tráfico de red en la subred loca.

65400 Niega todos los demas paquetes y hace un registro de ellos en syslog.

Ademas de ser leido desde el archivo de configuracion en el arranque del sistema, las reglas pueden ser cargadas en el firewall mediante el uso del comando ipfw como usuario administrador, por ejemplo:

# ipfw add 4025 allow tcp from any to me 25 setup keep-state

Esta regla permite el trafico TCP al puerto 25, usado por SMTP, a cualquier cliente desde internet.

Las reglas no son automaticamente guardadas en el archivo  /etc/ipfw.rules, este archivo debe ser actualizado manualmente.


Previniendo ataques de fuerza bruta al protocolo SSH

Si el sistema trabaja como enrutador IP y esta expuesto a Internet, probablemente se encuentren cientos de ataques de fuerza bruta al protocolo SSH registrados en el archivo  /var/log/security diariamente. Dichos ataques usualmente intentan utilizar docenas de nombres de usuario y contraseña para tratar de ingresar en nuestro sistema, y continuan intentando con otros sistemas cuando no tienen exito, pero estos intentos deben ser bloqueados.

Una forma facil de bloquear este tipo de ataques es usando el programa "sshit". Despues de instalarlo, se debe editar el archivo  /usr/local/etc/sshit.conf y se configura "FIREWALL_TYPE=ipfw2". Este archivo de configuracion tambien contiene parametros el programa sshit bloqueara direcciones IP.

El programa sshit trabaja analizando el archivo del sistema  auth.log en busca de cierto tipo de registros, y le indica al firewall que bloquee las direcciones IP apropiadas agregando dicha direccion a la tabla 0.

Las tablas en ipjw son listas de direcciones las cuales pueden ser usadas en lugar de direcciones individuales, en cuyo caso el firewall aplica las acciones a todas las direcciones IP registradas en la tabla.

REFERENCIAS


Tipos de firewalls de red
http://www.zonasystem.com/2012/06/tipos-de-firewall-de-red-stateless.html

Como configurar Sshguard con IPFW en FreeBSD
http://www.unixmen.com/configure-sshguard-ipfw-firewall-freebsd/

Local file sharing with Samba, NFS and firewall, Ivan Voras, BSD magazine vol 8 N° 12 12-2014, pag 16. Disponible en https://bsdmag.org/download/samba-nfs-and-firewall-new-bsd-issue/

Next-Generation Firewalls for Dummies, Lawrence C. Miller

1 comentario: