Iptables (II): filtrado por puertos y hosts

En el anterior post sobre Iptables comentamos cual es la estructura de este firewall, así como las bases de su comportamiento. Ahora vamos a ceñirnos en la parte más práctica, en como configurar reglas y filtrados específicos, y como podemos hacer cosas como evitar responder a pings, como prevenir que accedan a nuestro servidor desde direcciones ip que no sean las nuestras, etc.

Ya que una buena política de seguridad debe de tener en cuenta siempre que sistema está protegiendo y a que está expuesto dicho sistema, y puesto que la idea es explicarlo para diverso público, voy a dar pinceladas de caracter generalista.

No podemos proteger de la misma manera un servidor web dedicado a hostear gran número de páginas web, que proteger un firewall sobre un sistema de ordenadores industriales y sistemas SCADA. Por ejemplo, un servidor web siempre va a estar más expuesto a por ejemplo, ataques de tipo DDOS y escaneo de aplicaciones web, que un sistema industrial al que le conviene más protegerse de instrusiones directas, o conexiones de troyanos que puedan salir desde dentro.


El firewall es nuestra principal arma de defensa y barrera contra instrusos, escaneos, y toda clase de "problemas de seguridad" que se puedan dar en cualquier sistema, conjunto de sistemas, o redes. También hay que tener en cuenta que hay diferentes maneras de organizar una red o un conjunto de sistemas. En google podéis buscar imagenes sobre "firewall" para ver muchas de las estructuras propuestas.


 Ejemplo de esquema de red: http://www.pello.info

Al establecer una buena política de firewall hay que tener en cuenta que las reglas se ejecutan en orden descendente, y de no pasar por ninguna de ellas, se aplica la política por defecto que hallamos puesto.

Vamos a explicar algunas de las cosas más importantes

 
Filtrado por puertos:

Generalmente, y obviando las diferencias entre puertos tcp y udp, podemos decir que hay varias clases de puertos en cuanto a su número. Por un lado tenemos el puerto 0, exclusivo para comunicación de procesos, este puerto no se puede tocar, sus funciones están establecidas a nivel de kernel.

Los puertos del 1 al 1024 son los puertos de uso general y específico de aplicaciones concretas, dentro de ese rango están todos los importantes, por ejemplo, el 22 se utiliza para las conexiones ssh, el 53 para las resoluciones dns, el 80 para http, el 23 para telnet, 20-21 para ftp, etc. Aunque en casi todos los programas existen opciones para cambiar el puerto con defecto, y podemos por ejemplo poner nuestras conexiones ssh en cualquier puerto no ocupado, es conveniente siempre tener en cuenta este rango de puertos a la hora de poner nuestras reglas de firewall.

Los puertos por arriba del 1024, y hasta el final 65536 son de uso más libre, cualquier aplicación, por ejemplo el utorrent, o un troyano, o un proxy suelen usar un puerto en este rango. Este rango de puertos suelen ser cerrados o fuertemente filtrados. Aunque la elección de estos puertos sea algo caótica, y configurable, hay constantes que conviene saber. Por ejemplo, los proxies suelen utilizar los puertos 80, 8080, 8081, 3128.

Por ejemplo, podemos filtrar puertos de la siguiente manera:

iptables -A INPUT -p tcp --dport 20:21 -j DROP
iptables -A OUTPUT -p tcp --dport 8080 -j DROP


Si no prevemos hacer conexiones desde algún otro host a este, o si no prevemos que las vamos a hacer sobre puertos específicos, suele ser buena idea restringir todo el tráfico de entrada para conexiones no establecidas. En el caso de las conexiones salientes, ya que los troyanos suelen elegir puertos altos para no interferir con el software existente, suelen elegir puertos por arriba del 1024, aunque cada vez ocurre menos. Conbiene restringir todo el trafico de salida para todos aquellos puertos que no vayamos a utilizar y para todos los que estén libres de uso.

Filtrado por host: 

De la misma manera que es importante el filtrado por puertos, también suele ser buena idea, sobre todo en sistemas poco dinámicos y donde las conexiones son siempre las mismas, filtrar por hosts. Dicho de otra manera: dejar pasar la información que venga desde el lugar donde queremos únicamente.

Esto puede que sea una mala idea si por ejemplo tenemos un ordenador con funciones orientadas al público, o si tenemos rangos no fijos de ips desde los que se hacen conexiones o a los que hacemos conexiones. Puede ser buena idea aplicar este tipo de reglas junto a políticas de denegación por defecto para por ejemplo, servidores internos que alojan bases de datos, así, logramos que solo se pueda acceder desde una única IP.

Podemos establecer reglas que solo permitan la conexión desde un determinado host; esto se hace por ejemplo, así:

iptables -A INPUT -s 12.34.00.00 -p tcp -j DROP

También podemos poner rangos de ips, por ejemplo:

iptables -A INPUT -s 80.78.0.0/16 -j ACCEPT

Y, conbinar esto con el filtrado por puertos:

iptables -A INPUT -s 10.30.20.10 -p tcp --dport 23 -j ACCEPT  


En la siguiente entrada explicaremos como se hacen políticas para guardar logs, como analizarlos y cuales son las mejores opciones, así como opciones avanzadas en los filtrados por host.

0 comentarios:

Publicar un comentario en la entrada

ShellShock Labs es un blog dedicado a seguridad y hacking en general, un lugar donde buscamos que la gente participe con sus opiniones.

Síguenos




Posts Populares