jueves, 14 de noviembre de 2013

GeoIP para Iptables con Xtables_addons en GNU\Linux Ubuntu 13+

Después de un largo tiempo os traigo un nuevo articulo relacionado con la seguridad de vuestros sistemas para que podáis estar un poco más seguros evitando o permitiendo a países enteros de forma específica en vuestros firewalls o cortafuegos con iptables.

Xtables-addons

Xtables_addons es un software con licencia libre que sustituye la forma de parchear el kernel para agregar modificaciones a netfilter (iptables).

Antes se usaba patch-o-matic para agregar características pero se necesitaba recompilar el kernel y reiniciar el sistema para que funcionara. Además se debían repetir los pasos cada vez que se instalaba un nuevo kernel.

Con xtables-addons se consigue crear módulos dinámicos del kernel (dkms) que evita el reinicio del servidor ya que se cargan de forma dinámica. Podemos ver más información en

http://xtables-addons.sourceforge.net

En algunas distribuciones GNU\Linux como Ubuntu disponemos de los paquetes en los repositorios. En otras distribuciones como CentOS no. Nosotros vamos a instalarlo en GNU\Linux Ubuntu 13.10 64 bits pero he comprobado que también funciona en GNU\Linux CentOS 6.4 64 bits aunque hay que compilarlo a partir de los fuente e instalar la última versión 1.X. En Ubuntu instalaremos la versión más actual la 2.X (2.3).

Instalación

Instalamos los paquetes necesarios mediante apt-get
sudo apt-get install libtext-csv-xs-perl xtables-addons-common xtables-addons-dkms
Esto reconfigurará los módulos apropiados del kernel que tengamos instalado, entre ellos el módulo de GeoIP. Cuando se actualice el kernel se actualizaran los módulos gracias a dkms.

Una vez instalado, para usar las características de GeoIP deberemos de configurar las bases de datos de los países y los rangos de IPs para poder filtrar. Esto lo haremos usando los scripts que incluye xtables_addons al instalarse. Estos scripts se encuentran en /usr/lib/xtables_addons
cd /usr/lib/xtables-addons/
Actualizamos las bases de datos, para ello usamos el script de descarga
sudo ./xt_geoip_dl
--2013-11-14 18:50:19--  http://geolite.maxmind.com/download/geoip/database/GeoIPv6.csv.gz
Resolviendo geolite.maxmind.com (geolite.maxmind.com)... 108.168.255.243, 2607:f0d0:3:8::4
Conectando con geolite.maxmind.com (geolite.maxmind.com)[108.168.255.243]:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 729907 (713K) [application/octet-stream]
Grabando a: “GeoIPv6.csv.gz”

100%[======================================================>] 729.907      447KB/s   en 1,6s   

2013-11-14 18:50:21 (447 KB/s) - “GeoIPv6.csv.gz” guardado [729907/729907]

--2013-11-14 18:50:21--  http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
Reutilizando la conexión con geolite.maxmind.com:80.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 1260849 (1,2M) [application/zip]
Grabando a: “GeoIPCountryCSV.zip”

100%[======================================================>] 1.260.849    917KB/s   en 1,3s   

2013-11-14 18:50:22 (917 KB/s) - “GeoIPCountryCSV.zip” guardado [1260849/1260849]

COMPLETADO --2013-11-14 18:50:22--
Tiempo total: 3,4s
Descargados: 2 files, 1,9M in 2,9s (662 KB/s)
Archive:  GeoIPCountryCSV.zip
  inflating: GeoIPCountryWhois.csv   
Esto nos habrá descargado y descomprimido la base de datos csv. Ahora hay que convertir los ficheros de países en ficheros apropiados para el firewall y xtables_addons. Por defecto se usa una ubicación determinada para almacenarlos, por tanto, antes de ejecutar el script de construcción tenemos que crear el directorio de almacén en dicha ubicación y después ejecutamos el script dándole dicha ruta como parámetro (sin el directorio LE). Si no se hace esto fallará.
sudo mkdir -p /usr/share/xt_geoip/LE
sudo /usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip/ GeoIPCountryWhois.csv
82078 entries total
    0 IPv6 ranges for A1 Anonymous Proxy
  102 IPv4 ranges for A1 Anonymous Proxy
    0 IPv6 ranges for A2 Satellite Provider
  372 IPv4 ranges for A2 Satellite Provider
    0 IPv6 ranges for AD Andorra
    9 IPv4 ranges for AD Andorra
    0 IPv6 ranges for AE United Arab Emirates
  104 IPv4 ranges for AE United Arab Emirates
    0 IPv6 ranges for AF Afghanistan
   65 IPv4 ranges for AF Afghanistan
    0 IPv6 ranges for AG Antigua and Barbuda
   39 IPv4 ranges for AG Antigua and Barbuda
...
    0 IPv6 ranges for WS Samoa
   13 IPv4 ranges for WS Samoa
    0 IPv6 ranges for YE Yemen
   12 IPv4 ranges for YE Yemen
    0 IPv6 ranges for YT Mayotte
   13 IPv4 ranges for YT Mayotte
    0 IPv6 ranges for ZA South Africa
  461 IPv4 ranges for ZA South Africa
    0 IPv6 ranges for ZM Zambia
   41 IPv4 ranges for ZM Zambia
    0 IPv6 ranges for ZW Zimbabwe
   45 IPv4 ranges for ZW Zimbabwe
He dejado solo un extracto de la salida para no alargar el documento, pero se han configurado todos los países. Además hay algunos rangos especiales como podemos ver en el inicio, por ejemplo, A1 que es el rango de proxies anónimos. Esto puede ser interesante para denegar ataques desde dichos proxies que suelen ser usados como inicios de ataques.

Para comprobar que está todo correcto podemos ejecutar la regla que deniega a China a través del sistema de GeoIP de xtables_addons e iptables. Además crearemos una regla que deniegue los proxies anónimos al puerto 80 y 443. Suponemos que las políticas por defecto de iptables en el INPUT es ACCEPT.
sudo iptables -A INPUT -m geoip --src-cc CN -j DROP
sudo iptables -A INPUT -p tcp -m tcp -m multiport --dports 80,443 -m geoip --src-cc A1 -j DROP
Como vemos se usa el modulo "geoip" y el source es CN. CN se corresponde con el código de China de la base de datos geoip que contendrá los rangos de IP que se denegarán (drop). En caso de la segunda regla, sería lo mismo pero añadiríamos el protocolo tcp, los puertos 80 (http) y 443 (https) y el rango A1 (proxies anónimos)

En caso de tener política por defecto de denegación (DROP) solo habría que ejecutar las reglas correspondientes a los países que quisiéramos permitir, por ejemplo, España. Para nuestro servidor web, denegamos por defecto y permitimos solo a usuarios de España el acceso a nuestra web.
sudo iptables -A INPUT -p tcp -m tcp -m multiport --dports 80,443 -m geoip --src-cc ES -j ACCEPT
Podemos ver que se han creado las reglas de forma correcta. Se deniega China y Proxies y se permite a España de forma explícita.
 sudo iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       all  --  0.0.0.0/0            0.0.0.0/0            -m geoip --source-country CN 
2    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp multiport dports 80,443 -m geoip --source-country A1 
3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp multiport dports 80,443 -m geoip --source-country ES 

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
Conclusión

Espero que estos pasos os ayuden a asegurar vuestros servidores y ordenadores de trabajo y a clarificar este tema que está un poco farragoso en internet.

Además con un poco de imaginación y un script bash sencillo podréis añadir conjuntos de reglas con el comando iptables para automatizar algo el proceso, pero eso ya os lo dejo a vosotros ;-).

Como añadido os dejo el link para consultar el cádigo de países en wikipedia.

http://es.wikipedia.org/wiki/ISO_3166-1
Related Posts with Thumbnails