Es todo acerca de passwords!
Uno de los temas en los que los departamentos de seguridad deben poner énfasis es en concientizar a los usuarios para que utilicen passwords fuertes. No es una tarea sencilla, y puede llevar a discusiones interminables sobre escusas de por qué es difícil recordar passwords largos, pero es algo que debe hacerse y es tal vez más importante que muchos otros aspectos de seguridad.
No es solo cuestión de los usuarios, sino y más importante, de los administradores de sistema. Es sorprendente la baja importancia que se le da a los passwords incluso en áreas donde se conocen los riesgos a los que uno se expone. En parte también es culpa de políticas mal diseñadas que fuerzan a un pobre mortal a cambiar un password continuamente y hacer que el olvido de contraseñas sea algo tan común que se decide utilizar pavadas como passwords.

Ojo, no me excluyo del tema, y es entendible que un usuario que tiene acceso a más de 3 aplicaciones por día, con distintos passwords, los cuales debe cambiar cada cierto tiempo y no se permiten repeticiones (por ejemplo, no podes repetir un password que pusiste hace 6 meses), hacen que uno termine cansándose y poniendo algo que sea fácil de recordar.
Imagínense al pobre administrador de dominio que debe acceder a más de 10 aplicaciones por día... recordar 10 passwords diferentes que cambian continuamente es casi para un robot.

Por esto, es tarea del departamento de seguridad encontrar una solución intermedia, que cumpla con un mínimo de seguridad, pero que no haga que los usuarios se vuelvan locos y quieran linchar al administrador de seguridad (osea, a mi).
Cómo se logra esto? en parte diseñando una buena política de contraseñas, y en parte concientizando a los usuarios sobre cómo crear passwords que sean fuertes y recordables. También es muy importante destacar los riesgos de utilizar passwords débiles, y explicar cuándo un password es débil para que no se cometan equivocaciones al elegirlos.

La fortaleza de los passwords debe ser consistente en todos las aplicaciones donde se necesiten utilizar estas cadenas de caracteres. El acceso a un sistema debido a una contraseña débil, puede hacer que se comprometan otros sistemas donde se utilizaban contraseñas fuertes. Supongan que en el trabajo utilizan una contraseña con 50 caracteres, imposible de romper con sistemas automatizados, pero en su casa utilizan una contraseña de 6 caracteres, bien fácil de romper. Si desde su casa acceden a la empresa a través de VPN, SSH o el protocolo que quieran, y utilizan certificados que almacenan en su máquina para autenticarse en la empresa... perdiste! Si en la máquina de su casa utilizan el "recordar contraseña" para no tener que marcar los 50 caracteres, perdiste!

Para que se den una idea de cuán importante es un password, tengan en mente que muchísimos sistemas se hackean por día debido a una mala elección de estos. Hace un par de meses se daba a conocer el robo de información empresarial alojada en una cuenta de gmail de un empleado de twitter. Cómo sucedió esto? hackearon twitter? NO!, hackearon gmail? NO, fue debido a un password débil (o pregunta de seguridad débil).

No hay parche de software contra la mala elección de passwords. Simplemente hay que aplicar algunas reglas generales para producir buenos passwords y reglas mentales para recordarlos. Es por esto, que la elección de passwords se vuelve el punto más débil de toda organización. Por más que usemos los firewalls más potentes, los mejores antivirus, actualicemos todos los días el sistema, usemos IDS, etc, etc, etc, si no elegimos un buen passwords, ésto no servirá de nada.


Qué debo saber para armar un buen password?

A continuación les dejo algunas reglas generales sobre passwords... apliquenlas siempre que puedan!

- Utilicen un mínimo de 10 caracteres. Con los sistemas actuales, un password que tenga menos de 10 caracteres es rompible en un tiempo razonable. 10 parece un montón para poder recordarlo, pero con algunas técnicas que describiré abajo, podrán armarlos.

- Utilicen una combinación de mayúsculas, minúsculas, números y caracteres especiales (por ejemplo !$%&/#=^´Ç*+@) en su password. Como mínimo agreguen un par de caracteres especiales. De esta forma harán mucho más difícil un ataque por fuerza bruta (ni hablar de los ataques de diccionario).

- Nunca utilicen una palabra que pueda encontrarse en un diccionario, no importa de qué jerga sea el diccionario. Si la contraseña se puede encontrar en un diccionario, un sistema automatizado la puede romper. Cuando digo diccionario, me refiero a cualquier diccionario, así contengan palabras impronunciables de medicina o términos inventados en películas o series (como trustno1, pokemon, starwars, etc), si la palabra es conocida, la van a descubrir.
Este concepto se aplica también a palabras escritas en lenguaje hacker o elite, donde se reemplazan letras por números y caracteres especiales (como el caso de mi nick), ejemplos de estos reemplazos son e -> 3, a -> 4 o @, s -> 5, t -> 7, o -> 0. Existen diccionarios con las palabras escritas en este lenguaje.

- No utilicen información personal. Nada de poner el nombre, dirección, teléfono, documento o cualquier otra información personal como passwords. Cualquier que los conozca puede obtener esta información y utilizarla.

- No utilicen el nombre de usuario como password.

- No utilicen secuencias predecibles como 123456, asdfgh, qwerty, etc.

- Cambien el password cada cierto tiempo. La cantidad de tiempo dependerá de la política de cada aplicación, de la fuerte que sea el password, de los mecanismos de protección de la aplicación (por ejemplo si cada 3 intentos fallidos, el sistema bloquea el usuario) y otros parámetros, pero por regla general, tengan en cuenta que el password debe cambiarse cada cierto tiempo.

- Cuando cambien un password, cambienlo de verdad. Agregar un número al final al password anterior no sirve. Si usaban micasitaloca, luego micasitaloca1, micasitaloca2, micasitaloca3, etc, si en algún momento descubren que el password es micasitaloca, conocerán los passwords que utilizan en cada cambio...

- Utilicen contraseñas distintas en las diferentes aplicaciones que tengan acceso. Esto tal vez sea lo más difícil de cumplir, pero es muy importante, sobre todo para administradores de sistema. Si utilizan el mismo password para todo, y este password se obtiene, el atacante tendrá acceso a todo!

- No le revelen el password ni a Dios (claro que Dios, según la creencia general, lo sabría igual =D). Más allá de los comentarios chistosos, es muy, pero muy importante que no le digan el password a nadie, ni a familiares, ni a amigos, ni siquiera a sus jefes! Que una cuenta sea utilizada por más de una persona hace que sea irrastreable quién generó un problema o realizó alguna maldad, quedando siempre como culpable el dueño de la cuenta. Aunque parezca loco, sus jefes no deberían pedirles el password, si necesita por alguna razón acceder a su cuenta, deberá hacerlo por otros medios, generando el papelerío adecuado que constate el por qué necesita utilizar la cuenta.

- No utilicen "recordar contraseña" en ninguna aplicación, y mucho menos en un celular, notebook, netbook, palm, o cualquier otro dispositivo que sea fácilmente robable. Esto hace que la seguridad de una organización se valla al tacho si alguien irrumpe en uno de estos sistemas.

- No hablar con nadie sobre temas relacionados a la contraseña. Tal vez uno utiliza una frase sacada de algún lugar loco que sería muy difícil de averiguar, pero si la andan comentando, la contraseña se vuelve fácil de adivinar.


Cómo alguien puede romper un password?

Para que no les parezca todo tan loco (el hecho de necesitar 10 caracteres que contenga mayúsculas, minúsculas, números y caracteres especiales puede parecer una locura), me parece que les va a servir una buena justificación. Porque hay una justificación a todo esto, no es un simple capricho de la gente que trabaja en seguridad (en serio!, no se la agarren con nosotros! =P ).

Los ataques utilizados para romper una contraseña son los siguientes:

- Fuerza Bruta. El más conocido de todos, también es el más simple, pero el que consume mayor tiempo. Un ataque por fuerza bruta consiste en utilizar todas las combinaciones de caracteres posibles (por ej. aaaaaa, aaaaab, aaaaac, .... zzzzza, zzzzzb, etc), hasta encontrar la combinación correcta. Este ataque es costoso, sobre todo si no se sabe de antemano la cantidad de caracteres utilizados, pero con la tecnología actual se pueden realizar cientos, miles o millones de pruebas por minuto, dependiendo de si se prueba localmente o por red.

- Diccionario. Este ataque se basa en utilizar diccionarios para realizar las pruebas. En lugar de hacer ataques ciegamente con todas las combinaciones posibles, se utilizan palabras conocidas para realizar cada intento. Existen diccionarios de todo tipo, con palabras de medicina, películas, computación, mecánica, etc. Por supuesto que existen diccionarios para todos los idiomas sobre todos los rubros. Estos ataque son los más efectivos y rápidos dado que la cantidad de palabras a probar siempre es menor a tener que probar todo el espectro combinaciones de caracteres.

- Rainbow Tables. Ataque con una lógica más compleja que los anteriores. Se basa en romper los passwords a partir de los hashes almacenados en un dado sistema. Para el que no lo sepa, la mayoría de los sistemas (si son sistemas bien hechos) no almacenan los passwords de forma plana, sino que primero les aplican una función de hash y luego almacenan el hash obtenido. Por esto, si alguien obtiene la lista de hashes, primero deberá obtener la contraseña a partir del hash para poder utilizar una cuenta de usuario. Por lógica estos hashes son difíciles de romper, pero con el ataque utilizando rainbow tables, dependiendo del algoritmo de hashing y de si se utiliza salt (número aleatorio pegado al password antes de generar el hash), obtener un password de menos de 15 caracteres es cuestión de minutos.
Claro que para poder aplicar este ataque, el atacante primero deberá obtener la lista de hashes, y para eso primero debe obtener acceso al sistema con privilegios de administrador.
No hay mucho que un usuario común pueda hacer contra los rainbow tables, al menos que utilice más de 15 caracteres en sus contraseñas, pero lo nombro porque es un ataque muy utilizado últimamente.

- Ingeniería Social. Para mi, el top de los ataques. Nada de esperar horas de ejecución, irrumpir en sistemas, buscar diccionarios, siempre es más fácil encontrar a alguien que termine revelando su password por voluntad propia. Es relativamente fácil utilizar artilugios en conversaciones para que otra persona, sin darse cuenta, termine revelando su password. Por ello en la sección anterior destaqué el hecho de que no le deben revelar el password a nadie!, mucho menos si no están seguros de con quién están hablando!

- Otras técnicas dependientes de la aplicación que autentica. Existen otras técnicas que se basan en falencias de cada aplicación y no tienen tanto que ver con lo fuerte que sea el password del usuario, por lo que quedarán para otro informe =P


Cómo mierd* armo un password de más de 10 caracteres con todo tipo de caracteres distintos y acordarmelo!!!???

Llegamos a la pregunta cumbre, cómo hacemos para cumplir con todo lo que dije y no quemarnos el cerebro en el intento.
Una contraseña debe ser difícil de romper, pero a su vez, debe ser recordable. Si a cada rato tenemos que llamar al administrador para que nos resetee la contraseña, no sólo nos haremos odiar, sino que no podremos trabajar. Por ello, algunas ideas generales que pueden encontrar en la red son las siguientes:

- Utilizar una frase con varias palabras. Las frases son buenas porque son recordables. Eso sí, no utilicen una frase que dicen continuamente, utilizan en la vida diaria, o sea extremadamente conocida. Utilicen algo sacado de algún libro o algo por el estilo. Nunca hablen de la frase frente a nadie, para no dar indicios.

- Utilizar las iniciales de una frase y agregarles complejidad. Como en el punto anterior, utilizaremos una frase, pero en lugar de tener la frase entera, usamos solamente las iniciales. Por ejemplo, podemos utilizar la frase "Los de Micrsoft son unos ladrones increíbles, pero de ladrones se compone el mundo" (by d3m4s1@d0v1v0), con lo que tenemos las iniciales ldmsuliplscem. Ahora para que no quede todo en minúsculas, rompible fácilmente, cambiamos algunas letras por mayúsculas y agregamos algunos símbolos, con lo que podría quedar así: "lDM5u|_1PdlSc#m". Traten de generar variaciones que luego recuerden.

- Utilizar dos palabras concatenadas con algún caracter especial en el medio. En este caso podemos usar las palabras seguridad y linux de la siguiente manera: seguridad$@linux.

- Utilizar dos palabras entrelazadas letra por letra, agregando caracteres especiales y números. En este caso, el ejemplo anterior (palabras seguridad y linux) podría quedar: sl31gnuXrid@d.

- Escribir cualquier cosa con todos los caracteres posibles y repetir la escritura muchas veces hasta hacerlo mecánico. Esta técnica es la que yo empleo. Escriben algo totalmente sin sentido como j#dw=menta67jjBOz3D en un archivo leíble, y lo repiten varias veces a lo largo del día hasta que se les hace tan mecánico que es como si escribieran algo con total sentido.

- Sorprendanse. Como última tip, queda decir que utilicen alguna técnica que mezcle a las anteriores o utilice otra idea. Siempre que el password sea de más de 10 caracteres y utilice mayúsculas, minúsculas, números y caracteres especiales, y no sea palabra de diccionario, y les resulte fácil de recordar.


Algunos ejemplos reales de malos passwords

Si buscan en google "common passwords" o "contraseñas comunes", se pueden encontrar con varias páginas que revelan datos sobre distintos exámenes en bases de datos de diferentes lugares.
En Most common password list from 3 databases se revelan los passwords hackeados de 3 sites muy utilizados (singles.org, phpBB y MySpace). En el top de los más utilizados nos encontramos con 123456, password, qwerty, 12345, jesus, 12345678, abc123.
En The top 500 Worst Passwords of All Time nos encontramos con una simpática lista de los passwords que la gente (de habla inglesa) suele utilizar. Lo gracioso es que 1 de cada 9 personas utiliza un password de esa lista y una de cada 50 utiliza alguno de los 20 primeros!
Muchos de los passwords en estas listas se aplican a gente de habla hispana.


Conclusiones

Incentivar a los usuarios para que utilicen passwords fuertes y recordables es una tarea difícil, pero que se tiene que hacer. Hay varias reglas a cumplir y es importante que estas sean transmitidas a todos los usuarios. Siempre que piensen en un password, piensen en las técnicas de cracking y en si sería posible crackearlo con alguna de ellas.
Existe formas relativamente simples de crear buenos passwords y que sean recordables, es cuestión de aplicarlas a la vida diaria.
Coincido totalmente con Roger A. Grimes en su artículo Password-cracking contest proves theory cuando dice: "I maintain that length is a better computational protector of password confidentiality than complexity, because true complexity is not easily enforced. And if it is enforced, most users will revolt, frequently forget passwords, or write them down. So if we can’t guarantee complexity, length is a better protector."
Es decir, el mantiene que el largo es mejor protector computacional de la confidencialidad de un password que la complejidad, porque la verdadera complejidad no es realmente forzada. Y si ésta no es forzada, la mayoría de los usuarios se revelarán, frecuentemente olvidando passwords o anotándolos. Así que si no podemos garantizar complejidad, el largo es un mejor protector.
Por esto, creo que las frases largas pueden ser mejores passwords que otro totalmente complejo pero olvidable.

6 comentarios:

MagnoBalt dijo...

Muy interesante el post y tu blog
Un abrazo
Saludos

JaviZ dijo...

100% de acuerdo con Magno!

salu2,
j

Zerial dijo...

Bueno, a ver .... Creo que llego la hora de dejar a un lado las password y comenzar a utilizar las passphrases.

Aunque el problema quizas no es la complejidad de la clave... el problema es que los usuarios "normales" ponen su clave en cualquier lado! sin imoportar nada. no saben si es un sitio seguro, si es un sitio de verdad o fake, etc. Por otro lado es culpa tambien de los desarrolladores quienes guardan las passwors en texto plano o bien usando hash debiles. Aunque no lo crea, es mucho mas comun de lo que se lo imaginan.

d3m4s1@d0v1v0 dijo...

Si, desde que lidio con algunas aplicacioncitas en mi lugar de trabajo, noté que o bien almacenan las claves de forma plana, o bien usan codificación (tipo base64), que es reversible fácilmente, o bien utilizan un algoritmo de hash inventado (le sumo 2, le resto 3, le agrego una z y todo bien). Damn! con lo fácil que es usar sha1 o sha2, una simple llamada a función de librería!

nacho dijo...

muy buen post! El problema es hacer llegar esta información al "usuario final".

La solución está en la educación!

Saludos!

Anónimo dijo...

en esta pagina descubriras password excelte!!!

http://www.cod3g.com/rf_145274.html

Publicar un comentario