19 enero 2010

Geo IPS 1.0

Una de las cosas que mas me han fascinado en los últimos años, han sido las tecnologías de Geolocalización IP que tan de moda se han puesto.

Y al hilo de esas tecnologías siempre me he preguntado como ningún fabricante de Firewalls ha implementado una evolución de las típicas reglas IP origen / IP destino con reglas basadas en procedencia geográfica.

Por ejemplo, mi servicio de acceso SSH sé positivamente que solo va a ser accedido desde Madrid y en alguna ocasión desde Zaragoza, no necesito conceder acceso a IPs chinas o americanas. Por otra parte, alguien que tenga un negocio online que sirva pedidos a España y Europa, no tiene porque exponer su site web a otros puntos geográficos tan exóticos como Camerún o Hong Kong. Además, es por todos conocido que cuando se publican top-de-países con mas incidencia de ataques, suelen ser siempre los mismos.




Al hilo de esto, he implementado un GeoIPS que extiende las capacidades nativas de Linux en cuanto a filtrado de paquetes permitiendo crear reglas por País o Ciudad. Inicialmente pensé en integrarlo en el kernel como extensión a iptables, pero he preferido hacerlo 'en modo snort' totalmente transparente al sistema operativo para facilitar su portabilidad a otros sistemas (*BSD, OpenSolaris ...) y su mantenimiento (cambios en el kernel, miles de kernels diferentes en función de la distribución ...)

El software se puede descargar del repo en Google de SbD y la guía de instalación está en el Wiki. / Warning / --> No es precisamente sencillo de instalar, se requiere algo de ninjutsu-linux para hacerlo funcionar.

En este post voy a explicar como configurarlo y como es la estructura del fichero de configuración.

El fichero de configuración se llama db.xml y con idea de, en un futuro, desarrollar helpers, está en formato XML.

Fichero de ejemplo:

<config interface="lo" ip="127.0.0.1" blockcommand="iptables -I INPUT  -j DROP -p tcp -s" unblockcommand="iptables -D INPUT  -j DROP  -p tcp -s" blocktime="25">

    <tcp name="53" mode= "deny">

      <country>Spain</country>

      <country>Mexico</country>

       <city>Zaragoza</city>

       <city>Mountain View</city>

    </tcp>

    <udp name="53" mode="deny">

      <country>Spain</country>

      <country>EEUU</country>

    </udp>

  </config>

Viendo la estructura del fichero debería ser fácil imaginar que es cada cosa; la parte inicial define la interface de red sobre la que va a escuchar GeoIPS, la IP que 'va a defender', los comandos de bloqueo y desbloqueo y el tiempo que va a durar bloqueada cada IP. De este punto, tendrás que configurar la interface de red y la IP.


Las siguientes partes son dos ejemplos de reglas geográficas para el puerto TCP/UDP 53.


Tomemos el primer ejemplo:

<tcp name="53" mode= "deny">

      <country>Spain</country>

      <country>Mexico</country>

       <city>Mountain View</city>

    </tcp>

La regla, define que vamos a filtrar el protocolo TCP, el puerto y el modo, en este caso deny. ¿Que significa Deny? Básicamente define que la regla va a permitir TODO el tráfico EXCEPTO el que venga desde Spain / Mexico (como países) y específicamente lo que venga de Mountain View como ciudad.

En contraposición a deny existe la directriz allow y es su opuesta; todo el tráfico que venga a ese puerto que NO pertenezca a Spain / Mexico (como países) o Mountain View como ciudad, será bloqueado.


El formato para puertos udp es idéntico a tcp.


Jugando con las reglas puedes definir cosas como:


'A nivel HTTP, permito todo MENOS lo que venga de Rusia y China'


'Para el ssh, únicamente admito Madrid / Barcelona'


Todo es cuestión de hacerse con la estructura XML del fichero.

Si alguien se anima a probarlo y adaptarlo a otros sistemas no Linux, bienvenidos sean !

30 comments :

Anónimo dijo...

Buenas! La verdad es que es una idea muy buena, ya había leído algún comentario anteriormente y me llamo mucho la atención, cuando tenga un rato espero probarla :) ¿No se tu punto de vista de esta herramienta para parar ataques DDoS? Al menos en algunos casos se podría minimizar el daño, por ejemplo, un negocio con mercado básicamente español, si sufre un ataque de este tipo, podríamos habilitar únicamente el acceso desde España, y así la continuidad del negocio no se vería del todo comprometida.. En fin, es tarde y hay que dormir, asi que dejo de divagar ya ;)
Saludos!
~TC

Javier dijo...

impresionante me dan ganas de aprender ninjitsu linux para probarlo, si tengo tiempo le echare un vistazo parap onerlo en el dsl o unos de esos pequeños

Anónimo dijo...

¿Como sabes de que ciudad es una IP?

Román Ramírez dijo...

Existe alguna que otra empresa que vende filtros mediante Geolocalización e, incluso, venden algún servicio de "identificación segura" de la procedencia de las conexiones (por si tienes que vetar un servicio que en tu territorio es legal pero en otro puede no serlo).

Por otro lado, ¿qué opinas de esas listas de ips para filtrar que comprenden los rangos chinos, coreanos, ucranianos, ...? Incluso, añadiendo las IPs de la red tor etc.

Anónimo dijo...

Muy buena idea, y además llevada a cabo estupendamente. Esto de utilizar el fichero xml facilitarà muchísimo su uso.

Tengo que aprender perl... porqué me he bajado el código, y para hacer una aplicación que parece taan complicada, veo que tampoco has usado muchas lineas de código...

Cómo haces para saber el orígen de la ip? Y para relacionarla por ejemplo, con la palabra 'China'? Quizá no me he explicado muy bien. Dependiendo de la respuesta a la primera pregunta, quizá n tenga sentido responder a la segunda.

Saludos y ánimo!

Newlog

nico dijo...

Ya existe algo similar desde 2005 como match para netfilter. Se llama geoip match y está desarrollado por Nicolas Bouliane y Samuel Jean.

Alejandro dijo...

¡Alucinante! La idea es buenísima.
Pero me surge una duda: ¿Maneras de detectarlo?

Pongamos que un server que tiene un servidor ssh (o cualquier otro) está en EEUU, y yo en España (y no quiere saber nada de españoles xD).
¿Cómo podría verificar que ese servidor no admite IPs españolas? ¿Solo puedo ir probando país por país?

Jordi dijo...

hummm, pienso que lo haría instalando el módulo de geoip en netfilter, lo veo mucho menos aparatoso que esto y no requiere ese ninjutsu raro que dices.
http://people.netfilter.org/~peejix/geoip/howto/geoip-HOWTO.html
Por otro lado discrepo un poco de que las implementaciones de netfilter en el kernel de linux varien tantisimo, son bastante estables.

Carlos Muñoz dijo...

Me parece una reflexión muy interesante. Si bien es cierto te equivocas al pensar que no existen Firewalls que no apliquen conceptos de Geolocalización a la hora de definir reglas. McAfee Enterprise Firewall (antiguamente llamado Sidewinder cuando era de Secure Computing), implementa la posibilidad de definir reglas de geolocalización desde hace un par de años, estas reglas de geolocalización no sólo pueden utilizarse para decidir desde que geografias pueden tener acceso a los servicios publicados o viceversa sino que "enganchan" con la activación de sus servicios IPS/IDS, Antivirus, autenticación, etc.
Un Saludo

Edgar Carrillo Egea dijo...

Como ya han dicho, buenisima la idea y además "barata".
Me la apunto para implementarla.
Muchas gracias.
Un saludo :)

HappyIdeasMaker dijo...

Si no me equivoco sí que existe, un módulo para iptables llamado "geoip".

Más info en http://people.netfilter.org/~peejix/geoip/howto/geoip-HOWTO.html

blas dijo...

Muy interesante el post. Efectivamente, cada vez son mas los clientes que entre sus políticas de FW, utilizan reglas de geolocalización como primera barrera de filtrado. Eliminan posibles riesgos y ahorran ancho de banda.

Aquí tenéis un sabor comercial del tema (con alguna funcionalidad adicional ;) ):

http://www.mcafee.com/us/enterprise/products/network_security/firewall_enterprise.html

Filter unwanted traffic using TrustedSource™ reputation and global threat intelligence; block traffic from countries you don't do business with; add application-layer and encrypted traffic visibility to stop attacks via email, Web 2.0, SSL, and VoIP

Salu2 y a seguir con vuestro fantástico blog :)

Blas.

eduardo abril dijo...

@Yago: ¿has probado el tiempo que necesita para hacer el filtrado?

Nosotros pusimos gelocalización en la banca electrónica y "online" era demasiado lento. Para un servidor ssh, con poquitas conexiones, entiendo que funcionará muy bien pero ... ¿y si tienes cientos de conexiones en paralelo?

El acceso a las db de geolocalización suele ser lento.

Muy interesante ...

Saludos,
Eduardo.

Yago Jesus dijo...

Gracias por los comentarios. Iré por partes:

Sobre como saber la procedencia de una IP, tiempo atrás añadimos esa funcionalidad a nuestros bots de mensajería instantánea, si añadís sbd.bot@gmail.com / sbd.bot@hotmail.com y empleáis el comando 'infoip' os dice la geolocalización de una IP.

Sobre que Mcafee ya implementa comercialmente en sus dispositivos de filtrado Geolocalización, desconozco por completo si lo usan como parte de su inteligencia para el IPS o si permiten reglas 'tan finas' como GeoIPS.

Respecto al modulo netfilter que han comentado varias personas, discrepo totalmente en que es menos engorroso. Parchear y compilar un kernel es bastante mas complejo que instalar un soft que se ejecuta en espacio de usuario. Adicionalmente hay que tener en cuenta que, como cada distribución 'toca' su propio kernel, probablemente en algunas el parche de un montón de 'junks'al instalarlo. Además de cara a tener el sistema up2date, es mala idea modificar el kernel y salirte 'del circuito' de actualizaciones de tu distribución (salvo que en cada cambio de kernel, tengas que re-parchear y re-compilar a mano ...) en Fedora, por ejemplo, los cambios de kernel son casi semanales.

Yago Jesus dijo...

@Eduardo Abril: No he probado el rendimiento mas alla de algunos servidores sin demasiada carga, supongo que dependerá del volumen de datos y de las capacidades de la maquina (RAM, CPU, etc)

Yago Jesus dijo...

@Roman Ramirez: Las estadísticas están ahí ... está demostrado que un volumen muy grande de ataques tienen una procedencia geográfica idéntica. No veo mal que se elimine el grado de exposición filtrandolas

Yago Jesus dijo...

@Alejandro me temo que para averiguar esas reglas, te tocará tener un montón de proxys en diferentes localizaciones geográficas e ir probando cuales consiguen acceder ... Tarea bastante complicada, por cierto

Anónimo dijo...

¿Para geolocalizar la IP que base de datos consultáis? Una de estas gratuitas en local supongo.

Yago Jesus dijo...

@Anonimo, usamos MaxMind http://www.maxmind.com/

Anónimo dijo...

La API de MaxMind al final hace consultas a su web, no? Lo que ralentiza un poco el proceso.

Lo ideal es tener una base de datos de geolocalización en local ya sea Mysql o xml y consultarla.

Gracias por el esfuerzo de hacer esta utilidad.

Yago Jesus dijo...

@Anonimo, Maxmind tiene una interface web a la que realizar consultas, pero también ofrece gratuitamente una base de datos en formato fichero que es la que usa Geo IPS, no se realizan consultas vía web

dreg dijo...

mola, buena reflexion. ta chula la tool :)

dani dijo...

Muchísimas gracias.

Estoy montanto un equipo en un dedicado en internet, y tenía pensado justamente eso, filtrar todo lo posible, sobre todo paises como china y sus temidos DoD.

Me viene de perlas, me vas a ahorrar mucho trabajo.

Saludos.

Román Ramírez dijo...

@Yago: de hecho, me refería a Maxmind cuando hablaba de soluciones comerciales :)

Yo veo esta base de datos corriendo en un memcached con una buena configuración de expires, whitelists, etc.

Muy buena idea Yago.

TheCr0w dijo...

Esta idea es buena pero tambien tiene sus limitaciones. La manera de administrarlo fiablemente yo no la tengo tan clara... esto ya lo he visto en otros sitios, bancos por ej, y no funciona bien del todo y pongo un ejemplo.

Cuando trabajaba en una multinacional hace unos años, el pool de IPs para salir a Internet era de la compañia en cuestion,el operador contratado para todo el tráfico IP hacia Internet lo gestionaba, enrutaba segun nuestros requisitos.
El pool de IPs adquirido era de EEUU pero lo utilizabamos en España, Francia, India etc... y al ir a acceder al banco, Santander en este caso, te decia que por motivos de seguridad no se podia acceder desde el extranjero, asi q, unas 4000 personas q trabajaban y cobraban sus nominas en dicho banco no podían acceder.

Este casio en una tienda on-line podria llevar a no vender, o a un servicio de VPN a que sus empleados no puedan acceder.

Jar0b_ dijo...

Bien pensado y sencillo...

La verdad es que te quitas bastante "basura" de encima con un filtrado asi de simple.

Un saludo !

deltonos77 dijo...

@TheCr0w: Eso que te refieres del banco fué una solución "chapucera" para proteger los aplicativos,y ahí no se tocaba nada de FW.
Las restricciones se levantaban según el perfil de movilidad que se creaba de cada usuario...y tras ver el coñazo que era obviamente decidí que ese no era mi banco para manejar mi cuenta (por eso de irte de vacaciones a Portugal y andar jodido, por ejemplo)

Tonio dijo...

Le he dado algo más de publicidad en una web de ámbito Gallego de sw Libre, con vuestro permiso he traducido una parte y luego referencio hacia esta web.

Acabada la carrera de Ing.Inf. estoy con un master en el que se tocan temas de seguridad y dado que me gusta (mucho) seguro que puedo aprender de vuestras publicaciones.

S2!

Yago Jesus dijo...

Muchas gracias Tonio, si nos pones la URL de esa web, igual podemos referenciarla en algún post

Tonio dijo...

Uppps perdón! se me fue...
http://agnix.org/?q=node/2504