Monthly Archives: February 2009 - Page 2

Script para contar requests por IP de un access_log de Apache

Python

Python

El otro día necesitaba saber si había alguna/s IP/s que estuvieran haciendo muchos requests a un dominio, así que escribí un muy sencillo script en Python para obtener la cantidad de peticiones por IP en un access_log de Apache. Se los dejo por si a alguien le sirve. Se me ocurre que con bash y las distintas herramientas de unix para manipular archivos y strings quizás habría podido hacer algo un poco más óptimo (aunque esto anda bastante rápido), pero me sentía más cómodo con Python.

Script

#!/usr/bin/python
import sys
from operator import itemgetter

file = open(sys.argv[1], "r")
ips = {}
line = None
while line != "":
    line = file.readline()
    ip = line.rsplit(" ")[0]
    if ip != "":
        if ips.has_key(ip):
            ips[ip] = ips[ip] + 1
        else:
            ips[ip] = 1

file.close()
list = sorted(ips.items(), key=itemgetter(1), reverse=True)
for item in list:
        print item[0].rjust(15, " "), ": ", item[1]

Cómo usarlo

Guardar el script en un archivo por ejemplo countip.py. Luego darle permisos de ejecución y correrlo.

# chmod +x countip.py
# ./countip.py /var/log/httpd/access_log

Según mis pruebas el script procesa un log de más de 14 mil líneas en aproximadamente 0,09 segundos.

El viernes será la fecha UNIX 1234567890

UNIX

UNIX

Como salió en Slashdot el día Viernes 13 de Febrero a las 23:31:30 UTC será  el momento en que el UNIX Time llegue al número 1234567890.

Como sabrán el UNIX Time (POSIX Time o UNIX epoch) es un sistema para describir fechas que utilizan todos los sistemas UNIX, sus derivados y otros, que consiste en representarlas a partir de la cantidad de segundos transcurridos desde el 1 de Enero de 1970 UTC sin contar los segundos intercalares. Una de las grandes ventajas que tiene este sistema, y que cualquiera que haya programado algo alguna vez en su vida seguramente conozca, es que permite comparar fechas sencillamente.

El problema que tiene es que en los sistemas UNIX de 32 bits la fecha del sistema se almacena en un entero con signo de 32 bits, lo cual implica que el límite superior correspondería a las 03:14:07 UTC del Martes 19 de Enero de 2038. En los sistemas de 64 bits la fecha ya se almacena en enteros de 64 bits, con lo cual según Alan Cox el reinicio del UNIX epoch llegará después de que se haya apagado el sol jeje.

Análisis de Passwords de PHPBB

Leo en Slashdot el análisis que hace Robert Graham sobre el listado de passwords recientemente publicado luego de que hackearan el sitio phpbb.com.

Como indica, el análisis no revela resultados sorprendentes, pero sí muy interesantes para tener en cuenta. Por ejemplo, los passwords más comunes fueron “123456″ y “password”. A continuación la lista de los 20 más comunes, que como verán, coinciden bastante con este top 500 de passwords comunes.

3.03% “123456″
2.13% “password
1.45% “phpbb
0.91% “qwerty”
0.82% “12345″
0.59% “12345678″
0.58% “letmein
0.53% “1234″
0.50% “test”
0.43% “123″
0.36% “trustno1
0.33% “dragon
0.31% “abc123″
0.31% “123456789″
0.31% “111111″
0.30% “hello”
0.30% “monkey
0.28% “master
0.22% “killer
0.22% “123123″

Notesé que “phpbb” es uno de los passwords más populares, de la misma forma que en el sitio MySpace.com, hackeado hace dos años, lo era “myspace1″. Más información en Wired y InfoWorld.

Teniendo en cuenta de que se trata de un análisis de passwords de un sitio en inglés, seguiremos repasando los resultados del autor.

16%  de los passwords coinciden con un primer nombre de la persona. Esto incluye el propio nombre, el esposo o esposa, un hijo, etc. Los nombres más populares fueron Joshua, Thomas, Michael, y Charlie. Estos son nombres comunes, pero el autor piensa que por ejemplo “Joshua” era el password de la computadora en “Wargames” lo cual puede estar relacionado. También encuentra que hay variaciones de “jordan” que son populares, lo que puede estar relacionado con Michael Jackson (por ejemplo “jordan23″, que hace referencia al número de la camiseta del jugador). Esto le hace pensar a Robert cuánta gente usará “michael” como password para referirse a sus chicos y cuantos en relación a estrellas deportivas.

14% de los passwords son patrones del teclado, como “1234″, “qwerty”, “asdf”, “1qaz2wsx”, “1q2w3e” o “159357″.

4% son variaciones de la palabra “password”, como “passw0rd”, “password1″, “passwd” o “drowssap” (password escrito al revés).

5% de los passwords son referencias a la cultura popular de la TV, películas y música. Éstas tienden a ser de la cultura juvenil (“hannah”, “pokemon”, “tigger”) y geek (“klingon”, “starwars”, “matrix”, “legolas”, “ironman”). En cuanto a la música, sin embargo, parece haber un mayor rango de edad, con un montón de bandas viejas (según el autor) como “ironmaiden”. Algunas son referencias a la cultura popular que no fueron elegidas por ser tan populares sino porque parecen passwordscomo “ou812″ (Album de Van Halen de los 80s), “blink182″,  “rush2112″ (album de los 80s), and “8675309″ (canción pop de los 80s).

4% de los passwords parecen hacer referencia a cosas cercanas. El nombre “samsung” es un password popular, probablemente porque es la marca en el monitor que la gente está mirando. De la misma forma, hay muchos nombres de computadoras hogareñas como “dell”, “packard”, “apple”, “pavilion”, “presario”, “compaq”, etc. Es difícil darse cuenta cuáles pertenecen a esta categoría, sin embargo. ¿”cocacola” es un password popular porque hay una lata de Coca en el escritorio? ¿o sólo porque es un nombre conocido? De cualquier forma, “cocacola” aparece más que “pepsi” entre los que eligen passwords.

3% de los passwords son palabras “emo”. Insultos, sobre todo “fuck” son comunes pero también varias formas de amor y odio (como “iloveyou” o “ihateyou”).

3% de los passwords son palabras de “no me importa”. Muchas palabras reflejan una actitud de desinterés con respecto al hecho de definir un password, algunas implícitamente como “abc123″ o “blahblah”, y otras explícitamente como “whatever”, “whocares”, o “nothing”.

1.3% son passwords que la gente vio en películas/TV. Esta es una categoría pequeña que consiste solo de “letmein”, “trustno1″, “joshua”, y “monkey”, pero que da cuenta de una gran cantidad de passwords.

1% de los passwords están relacionados con deportes, por lo menos (aclara el autor que dice que no es fanático de los deportes, así que es posible que no haya reconocido algunos).

Distribución de la longitud de los passwords:

1 caracter 0.34%
2 caracteres 0.54%
3
caracteres 2.92%
4
caracteres 12.29%
5
caracteres 13.29%
6
caracteres 35.16%
7
caracteres 14.60%
8
caracteres 15.50%
9
caracteres 3.81%
10
caracteres 1.14%
11
caracteres 0.22%

Todo esto es importante para cualquier usuario, y sobre todo para los administradores de sistemas, para tener mayor conciencia al elegir nuestros passwords. La recomendación siempre suele ser no repetir passwords entre cuentas, siempre usar largas combinaciones de dígitos alfanuméricos y que estén lo menos relacionados con nosotros mismos que se pueda.

Instalar mod_evasive en Apache para dificultar ataques DoS

Apache Web Server

Apache Web Server

Describiremos a continuación los pasos para la instalación y configuración de mod_evasive, un módulo para Apache desarrollado por Nuclear Elephant para prevenir ataques DoS. Antes que nada es preciso advertir que no se trata de una solución definitiva y que, incluso, bajo ataques importantes, no sirve de mucho. Pero es una buena forma de evitar ataques pequeños y mantener la salud de nuestro servidor.

¿Cómo funciona?

Básicamente lo que hace es mantener una tabla dinámica con las URIs accedidas por las distintas IPs de los clientes del Apache, y permite ejecutar algunas acciones cuando una misma IP solicita un mismo recurso (una misma URI o elementos de un mismo sitio) más de n veces en m segundos. La acción por default que ejecuta el mod_evasive es, una vez superado el máximo de requests por segundo permitidos, bloquear durante una cantidad de segundos al cliente (la IP) devolviendo un error 403 (Forbidden) a la petición HTTP. Pero lo interesante es que también permite ejecutar un comando de sistema al registrarse un intento de ataque, con lo cual se puede agregar una regla al iptables para bloquear la IP del cliente.

Instalación

La instalación es muy sencilla. Basta con descargar el tar, descomprimirlo, compilarlo con apxs y habilitarlo en el httpd.conf.

# cd /usr/src
# wget http://www.zdziarski.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz
# tar zxvf mod_evasive_1.10.1.tar.gz
# cd mod_evasive
# apxs -cia mod_evasive20.c # para Apache 1.3 el comando sería apxs -cia mod_evasive.c
# vi /etc/httpd/conf/httpd.conf # editamos la configuracion
# service httpd restart # reiniciamos el Apache

En el httpd.conf habría que agregar las siguientes líneas.

<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 300
</IfModule>

Opciones de configuración

A continuación transcribo la descripción de las distintas opciones de configuración tomada de esta excelente guía de Xombra Team.

  • DOSHashTableSize <valor> – Establece el número de nodos a almacenar para cada proceso de peticiones de la tabla hash (contenedor asociativo de recuperación de peticiones por medio de claves que agiliza las respuestas del servidor). Si aplicamos un número alto a este parámetro obtendremos un rendimiento mayor, ya que las iteraciones necesarias para obtener un registro de la tabla son menores. Por contra, y de forma evidente, aumenta el consumo de memoria necesario para el almacenamiento de una tabla mayor. Se hace necesario incrementar este parámetro si el servidor atiende un número abultado de peticiones, aunque puede no servir de nada si la memoria de la máquina es escasa.
  • DOSPageCount <valor> – Indica el valor del umbral para el número de peticiones de una misma página (o URI) dentro del intervalo definido en DOSPageInterval. Cuando el valor del parámetro es excedido, la IP del cliente se añade a la lista de bloqueos.
  • DOSSiteCount <valor> – Cuenta cuántas peticiones de cualquier tipo puede hacer un cliente dentro del intervalo definido en DOSSiteInterval. Si se excede dicho valor, el cliente queda añadido a la lista de bloqueos.
  • DOSPageInterval <valor> – El intervalo, en segundos, para el umbral de petición de páginas.
  • DOSSiteInterval <valor> – El intervalo, en segundos, para el umbral de petición de objetos de cualquier tipo.
  • DOSBlockingPeriod <valor> – Establece el tiempo, en segundos, que un cliente queda bloqueado una vez que ha sido añadido a la lista de bloqueos. Como ya se indicó unas líneas atrás, todo cliente bloqueado recibirá una respuesta del tipo 403 (Forbidden) a cualquier petición que realice durante este periodo.
  • DOSEmailNotify <e-mail> – Un e-mail será enviado a la dirección especificada cuando una dirección IP quede bloqueada. La configuración del proceso de envío se establece en el fichero mod_evasive.c de la forma /bin/mail -t %s, siendo %s el parámetro que queda configurado en este parámetro. Será necesario cambiar el proceso si usamos un método diferente de envío de e-mails y volver a compilar el módulo con apxs (por ejemplo, la opción t ha quedado obsoleta en las últimas versiones del comando).
  • DOSSystemCommand <comando> – El comando reflejado se ejecutará cuando una dirección IP quede bloqueada. Se hace muy útil en llamadas a herramientas de filtrado o firewalls. Usaremos %s para especificar la dirección IP implicada. Por ejemplo, podemos establecer su uso con iptables de la forma siguiente:
    DOSSystemCommand “/sbin/iptables –I INPUT –p tcp –dport 80 –s %s –j DROP”
  • DOSLogDir <ruta> – Establece una ruta para el directorio temporal. Por defecto, dicha ruta queda establecida en /tmp, lo cual puede originar algunos agujeros de seguridad si el sistema resulta violado.
  • DOSWhitelist <IP> – La dirección IP indicada como valor del parámetro no será tenida en cuenta por el módulo en ningún caso. Para cada dirección IP a excluir ha de añadirse una nueva línea con el parámetro. Por ejemplo, dejaremos fuera del chequeo del módulo a un posible bot que use los siguientes rangos de direcciones:
    DOSWhitelist 66.249.65.*
    DOSWhitelist 66.249.66.*

Probarlo

¿Y cómo sé si está funcionando? mod_evasive viene con un pequeño script en perl para probar el funcionamiento del módulo. Para eso vamos al directorio de mod_evasive y ejecutamos el script test.pl:

# cd /usr/src/mod_evasive
# perl test.pl
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden

Y si pusimos la directiva para bloquear la IP por iptables podemos verlo con:

# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp --  anywhere tcp dpt:http

Referencias