22 de abril de 2018

Manejadores de passwords

Algunas definiciones


Ataque de Fuerza bruta


El atacante intenta probar todas las combinaciones posibles de letras hasta llegar a la clave. Esto implica una cantidad grande de intentos, que aumenta mucho con el largo de la clave y cantidad de diferentes caracteres posibles., 27 por cada letra minúscula individual, 27x27=729 por cada par de letras, 27x27x27=19683 por ternas y así sucesivamente.  Con mayúsculas+minúsculas+dígitos mas símbolos normales=96 letras distintas, así que x1=96, x2=9216, x3=884736.

Diccionario


En vez de probar todas las combinaciones posibles de letras, el ataque por diccionario se basa en tener una o varias listas de palabras para probar (por ejemplo la lista de palabras de un idioma, por eso se la llamo diccionario), por lo que la cantidad de intentos empieza siendo la cantidad de palabras en esa lista, por lo cual la cantidad de intentos es usualmente menor a los que se hacen en ataques de fuerza bruta. Sobre esto hay refinamientos que se hacen, como hacer transformaciones en las palabras del diccionario probando pasar letras a mayúsculas, substituir letras por números que se le parecen y transformaciones por el estilo. También se suele agregar a las listas de palabras nombres, palabras relacionadas con las personas/organizaciones a las cuales se quieren determinar la clave y otros.

Como los atacantes obtienen nuestras claves?


La forma mas trivial es intentar identificarse como nosotros a los sitios donde tenemos usuarios y claves. Dependiendo de cual sea el sitio, podrían hacer miles o millones de intentos por dia intentando llegar a ella, siguiendo un ataque de fuerza bruta o de diccionario. Algunos servidores limitan la cantidad de intentos, o no son especialmente rápidos validando usuarios (con un intento por segundo solo haría 86000 intentos en un día), pueden bloquear al equipo remoto que hace esos intentos, o incluso alertar al usuario que eso esta pasando, pero no todos los servidores son asi.

Hay veces que hay intrusiones en algunos servidores donde nuestras claves estan almacenadas. ya sea por amenazas internas, software con alguna vulnerabilidad u otros factores.

Usualmente las claves no se guardan en texto plano, sino encriptadas de tal forma que no toma mucho tiempo verificar que una clave tiene una determinada encriptacion, pero es imposible a partir de una encriptacion determinar la clave que la origino (pensar en una suma larga de numeros, a partir de los numeros puedo saber el resultado, pero a partir del resultado no puedo obtener los numeros que me hicieron llegar a el, solo que en este caso la "cuenta" que se hace es mas compleja). Pero con las claves encriptadas se puede hacer (fuera de linea, de forma distribuida, sin nada que bloquee el proceso, y muy rapido) un ataque de fuerza bruta o diccionario tambien, solo que mucho mas rápido y por lo tanto con muchos mas intentos por dia/hora que las pruebas en linea. Pero aun siendo mas rapida la cantidad de intentos, hay limites practicos respecto a la cantidad de claves que se pueden probar, si la cantidad de claves posibles son en el orden de trillones, y cada intento lleva milesimas de segundo tomaria decadas probar todas desde una sola computadora.

En algunos sitios las claves si se han guardado en texto plano, y se han difundido las claves de sus usuarios, pudiendo ser usadas en ese servicio e intentadas en otros, de hecho, pasando a formar parte de las listas que se intentan en los ataques de diccionario. Eso ha ocurrido en el pasado con empresas y servicios grandes como Adobe, LinkedIn y Yahoo!.

A priori uno no sabe cuan seguro es manejando claves un sitio, o cuan de confianza es su personal, o cuan forzados estén por resoluciones de su gobierno a dar datos privados de sus usuarios a organizaciones de su gobierno o personal de él.

En este contexto, que hace que una clave sea buena, respecto a estos tipos de ataque?

- Un compromiso entre largo y variedad de caracteres, para que las combinaciones posibles sean del orden de millones de millones. Algo que contenga letras mayúsculas y minúsculas, dígitos y algunos símbolos como espacios, comas y similares, con un largo de 12 caracteres o mas es lo considerado actualmente seguro ante un intento de determinar claves a partir de su versión encriptada usando un numero razonable de computadoras. Podría ser con un conjunto mas limitado de caracteres, pero mas largo, para llegar a las mismas probabilidades.
- No ser una (o dos) palabras de diccionario, obviamente, ni modificaciones triviales de ellas. Recordar que las listas de palabras usadas no tiene porque ser las de un diccionario formal, puede incluir palabras o frases usadas en nuestra cultura, nombres,  o palabras/números/fechas relacionadas con uno mismo. Y tampoco ser una clave que hayamos usado en otro lado, o una que se pueda derivar de ella, ya que podemos no saber si sus claves se han difundido de forma no publica. Y que sea improbable que una o varias personas hayan usado la misma clave en otros lados (ya que sería más probable que aparezcan en listas de claves filtradas usadas como diccionario).

Claves seguras y memorables


Ya sabemos que aspecto tiene que tener una clave segura. Como hacemos que sea recordable? No somos buenos recordando secuencia largas de letras y números sin sentido, pero que pasa si le damos un sentido? Somos buenos recordando cosas con sentido, historias, expresiones y similares. Hay muchas estrategias al respecto.

En vez de ampliar la cantidad de caracteres, podemos usar letras normales y usar frases, llegando a la cantidad de combinaciones mas por largo que por variedad de letras. Esas frases deberían apuntar a ser mas bien únicas, no usables por nadie más y no demasiado obvias respecto a nosotros para terceros.

na forma es tomar varias palabras al azar (digamos, 4, con la cantidad de palabras del idioma español aún sabiendo nuestra estrategia de generación son muchas combinaciones) y formar una asociación de ideas con ellas, una historia, una imagen, algo con un sentido, y con ese sentido en la cabeza podemos recordar esas palabras.  En xkcd: Password Strenght (en inglés) hay una explicación de esta práctica.

Se pueden recordar frases largas (estrofas de canciones, anécdotas de la vida, pasajes de libros, etc), pero es algo muy engorroso de escribir cada vez que se quiera usar esa clave. Pero se puede agregar a esto una transformación fácil de recordar y hacer, para que quede algo mas corto, y tal vez con un conjunto de caracteres más variado, para que quede con los criterios de "buena clave" expresados mas arriba. Digamos que tomo como frase recordable "En 1815 Napoleón perdió la batalla de Waterloo." Y digamos que me quedo con las 2 letras iniciales de cada palabras, números, símbolos de puntuación, y mantengo las mayúsculas donde van. Esa frase larga de escribir me quedaría como "En1815NapelabadeWa.", cosa que es difícil de atacar por fuerza bruta (19 caracteres de todos los tipos), es difícil que encontrar en listas (a menos que usen exactamente la misma frase y transformación en varias de sus cuentas) y si bien la clave en sí es difícil de recordar, la frase original no lo es, y la transformación tampoco, y eso es lo que tenemos en mente al escribirla.
Esa frase y transformación son sólo ejemplos, cada uno tiene potenciales frases que recuerda mejor, o que puede querer usar frecuentemente (por ejemplo, ya que es algo que pueda tener que escribirse frecuentemente, algo motivacional, objetivos o algo estimulante puede tener consecuencias en nuestra vida mas allá de el ingresar nuestra clave). Y las transformaciones también hay varias posibles que son fáciles de recordar, primera, segunda, o última letra de cada palabra, número o símbolo cuando la palabra signifique eso, p/ej si la palabra es "igual" poner "=", mismo con mas, coma, punto, etc, alternar mayúsculas, y otros)
Lo que importa con esta u otras estrategias de frases es que se cumpla con los requerimientos de seguridad (largo y variedad de caracteres), verificar, si se genera la clave, que no caiga justo a ser una palabra existente (por ejemplo, las iniciales de "Pero al saberse sólo Washington ordeno retirada de soldados" generaria "PassWords", que es vulnerable a un ataque de diccionario), y no usar la clave en todos lados.

Demasiadas claves. Usemos administradores de contraseñas.


Lo de arriba esta bien con pocas claves, pero no funciona con decenas o cientos de claves. Acá es donde entra una categoría de programas llamados administradores de contraseñas. En esencia, esos programas nos permiten almacenar y recuperar nuestras claves, usualmente requiriendo una clave maestra para accederlas. De esta forma la clave que tengo que recordar, la que tiene que ser memorable, tener algún sentido, tener una forma de generarla, etc, es la clave maestra del administrador de contraseñas, no todas y cada una de las claves que manejo.

Hay muchos administradores de contraseñas. Los navegadores usualmente incluyen uno propio, o pueden usar el provisto por el sistema operativo. Hay varios sitios web de renombre que dan ese servicio, como Dashlane o LastPass, pero en lo personal, como el manejo de claves es algo muy delicado, prefiero algo que corra en mi propia computadora, sea multiplataforma, y sea de código abierto.

Mi preferido al respecto es KeePassX (basado en KeePass, y con un derivado con algunas mejoras en KeePassXC, los 3 tienen el mismo esquema y pueden usar el mismo formato de archivos, asi que se podría elegir cualquiera de ellos). Hay muchos otros manejadores de claves, algunos código abierto, otros comerciales, y también hay maliciosos, pero estos están lo suficientemente probados como para ser una buena opción por defecto.

Con este administrador uno tiene un archivo que es donde se almacenan las claves (puedo tener varios almacenes de claves, lo que me permite manejar de distinta maneras a diferentes grupos de claves que me interesa que estén separadas), con una clave maestra para abrirlo. En el puedo tener de forma jerárquica mis claves, categorizarlas, agregarles información asociada (usuario, sitio, notas, etc), incluye generadores de claves seguras, buscar, cortar y pegar y otras funciones útiles a la hora de manejar claves. Al estar basado en archivos individuales, esos archivos puedo respaldarlos en pendrives, sincronizarlos via la nube, incluso usarlos desde el celular (hay aplicaciones para móviles que abren esos archivos, por ejemplo KeePassDroid) o compartirlos con otras personas de ser todas claves de cuentas compartidas con ellos.
 

Estrategias para el uso de un administrador de claves


Con un administrador de claves, ya no es tan difícil tener una clave distinta y segura por cada servicio. Uno puede tener una clave maestra que sea a la vez segura y memorable (como vimos más arriba), pero las claves de los servicios no tienen porque ser todas memorables. Puede ser arbitrariamente larga, compleja y al azar, que de todas formas se pegaría en el dialogo de ingreso del servicio sin siquiera verla.

Hay algunas claves que probablemente nos interese que sean recordables. La clave del administrador de contraseñas (para los que son tipo KeePassX, de cada uno de los archivos donde almacenemos claves) entra en esta categoría. La clave del correo donde uno puede recuperar contraseñas, o del sitio donde respaldé los archivos del administrador de contraseñas, o de sitios/situaciones donde uno no puede ir al administración de contraseñas o ver la clave, son otros posibles. Y también puede ser con los sitios a los que uno tenga que colocar la clave con suficiente frecuencia como para que sea un peso el entrar al manejador y luego al sitio. Con cuentas de banco es complicado, algunos bancos colocan restricciones al uso de administradores de contraseñas (por ejemplo, no dejando pegar una contraseña en el diálogo de entrada), amen de tener restricciones de como pueden ser las claves que pueden no ser fácilmente memorables, o desde donde se puede entrar. Pero siempre puede servir un administrador de contraseñas como ayudamemoria.

Una cosa que es importante respecto a donde se ejecuta o como se accede al administrador de contraseñas es que sea un equipo seguro. El archivo en si, si se le coloco una clave razonablemente compleja, es seguro, pero cuando colocamos la clave para abrirla, si hay algo que intercepta o puede ver lo que escribimos (aplicaciones maliciosas en el celular o computadora, especialmente si la computadora es de terceros, o sitios web que simulan ser el donde guardamos las claves, pero que no lo son) podria obtener la clave maestra y por lo tanto el acceso a las claves en el archivo. Y por supuesto, escribir las claves en papelitos, pizarrones u otros sitios que sean visibles por terceros (en persona, fotos que compartimos por celular, etc) pueden volver a todo el esquema inseguro.