jueves, 15 de mayo de 2008

Seguridad de contraseñas

En todo sistema operativo tipo UNIX se dan varias constantes, y una de ellas es el fichero /etc/passwd y la forma en que funciona. Para que la autentificación de usuario funcione correctamente se necesitan (como mínimo) algún tipo de fichero(s) con UID a mapas de nombres de usuarios, GID a mapas de nombres de grupos, contraseñas para todos los usuarios y demás información variada. El problema es que todo el mundo necesita acceso al fichero de contraseñas, cada vez que se hace un ls, se verifica el fichero de contraseñas, de modo que ¿cómo se consigue almacenar todas las contraseñas con seguridad y a la vez mantenerlas legibles por el mundo? Durante muchos años, la solución ha sido bastante simple y efectiva, simplemente, haz un hash de las contraseñas y guarda el hash, cuando un usuario necesite autentificar, toma la contraseña que introduce, pásala por el hash y si coincide, evidentemente se trataba de la misma contraseña. El problema que tiene esto es que la potencia computacional ha crecido enormemente, y ahora se puede coger una copia del fichero de contraseñas e intentar abrirlo mediante fuerza bruta en una cantidad de tiempo razonable. Para resolver esto hay varias soluciones:


Utiliza un algoritmo de hashing "mejor", como MD5. Problema: se pueden romper muchas cosas si están esperando algo más.
Almacena las contraseñas en alguna otra parte. Problema: el sistema/usuarios siguen necesitando tener acceso a ellas, y podría hacer que fallasen algunos programas si no están configurados de esta forma.

Varios SO’s han escogido la primera opción, Linux ha implementado la segunda desde hace tiempo, se llama contraseñas con shadow. En el fichero de contraseñas, se reemplaza la contraseña por una ‘x’, lo cual le indica al sistema que verifique tu contraseña contra el fichero shadow (se hace lo mismo con el fichero de grupos y sus contraseñas). Parece lo suficientemente simple, pero hasta hace bien poco, implementar el shadow era una ardua tarea. Había que recompilar todos los programas que verificasen la contraseña (login, ftpd, etc, etc) y esto, por supuesto, implica una considerable cantidad de esfuerzo. Es aquí donde brilla Red Hat, con su confianza en PAM.

Para implementar contraseñas con shadow hay que hacer dos cosas. La primera es relativamente simple, cambiar el fichero de contraseñas, pero la segunda puede ser un calvario. Hay que asegurarse que todos tus programas tienen soporte para contraseñas con shadow, lo cual puede ser bastante penoso en algunos casos (esta es una más que importante razón por la cual un mayor número de distribuciones deberían venir con PAM).

Debido a la confianza de Red Hat en PAM para la autentificación, para implementar un esquema nuevo de autentificación todo lo que se necesita es añadir un módulo PAM que lo entienda y editar el fichero de configuración para cualquier programa (digamos el login) permitiéndole que use ese módulo para hacer la autentificación. No hace falta recompilar, y hay poco tejemaneje, ¿a que sí? En Red Hat 6.0, durante la instalación se te da la opción de elegir contraseñas con shadow, o puedes implementarlas más tarde vía las utilidades pwconv y grpconv que vienen con el paquete de utilidades shadow. La mayoría del resto de distribuciones también tienen soporte para contraseñas con shadow, y la dificultad de implementación varía de un modo u otro. Ahora, para que un atacante mire las contraseñas con hash, tiene que esforzarse un poco más que simplemente copiar el fichero /etc/passwd. También asegúrate de ejecutar cada cierto tiempo pwconv, para tener la certeza de que todas las contraseñas efectivamente tienen shadow. Hay veces que las contraseñas se quedan en /etc/passwd en lugar de enviarse a /etc/shadow como deberían, lo cual hacen algunas utilidades que editan el fichero de contraseñas.



Reventando contraseñas

En Linux las contraseñas se guardan en formato hash, sin embargo ello no las hace irrecuperables, no es posible hacer ingeniería inversa de la contraseña a partir del hash resultante, sin embargo sí que puedes hacer un hash de un lista de palabras y compararlas. Si el resultado coincide, entonces has encontrado la contraseña, es por esto que es crítica la elección de buenas contraseñas, y las palabras sacadas de un diccionario son una idea horrible. Incluso con un fichero de contraseñas con shadow, el root puede acceder a las contraseñas, y si se han escrito scripts o programas que se ejecuten como root (pongamos un script CGI para www) los atacantes pueden recuperar el fichero de contraseñas. La mayoría del software para reventar contraseñas también te permite la ejecución en múltiples hosts en paralelo para acelerar las cosas.

John the ripper ("Juan el destripador")

Un eficiente revienta contraseñas disponible en: http://www.false.com/security/john/∞

Crack

El revienta contraseñas original y ampliamente extendido (según me consta), lo puedes conseguir en: http://www.users.dircon.uk/~crypto/∞

Saltine cracker

Otro revienta contraseñas con capacidades de red, lo puedes descargar de: http://www.thegrid.net/gravitino/products.html∞

VCU

VCU (Velocity Cracking Utilities) es un programa basado en windows para ayudar a reventar contraseñas "VCU intenta facilitar la tarea de reventar contraseñas a usuarios de ordenadores de cualquier nivel". Lo puedes descargar desde: http://wilter.com/wf/vcu/∞

Espero que esto sea suficiente motivo para utilizar contraseñas con shadow y un hash más robusto como el MD5 (el cual soporta Red Hat 6.0, no conozco otras distribuciones que lo soporten).

No hay comentarios: