This site is the archived OWASP Foundation Wiki and is no longer accepting Account Requests.
To view the new OWASP Foundation website, please visit https://owasp.org

Difference between revisions of "Guía de Referencias sobre Autentificación"

From OWASP
Jump to: navigation, search
Line 194: Line 194:
  
 
Para más información, ver: [https://en.wikipedia.org/wiki/Transport_Layer_Security#Client-authenticated_TLS_handshake Client-authenticated TLS handshake]
 
Para más información, ver: [https://en.wikipedia.org/wiki/Transport_Layer_Security#Client-authenticated_TLS_handshake Client-authenticated TLS handshake]
 +
 +
 +
== Autentificación y mensajes de error ==
 +
 +
En el caso de las funcionalidades de autentificación, los mensajes de error implementados de forma incorrecta pueden ser utilizados con el propósito de obtener y almacenar identificadores de usuario y contraseñas. Una aplicación, debería responder (tanto en los encabezados HTTP como en el contenido HTML) de forma genérica.
 +
 +
 +
==== Respuestas de autentificación ====
 +
 +
Una aplicación debería responder mensajes de error genéricos independientemente de si era incorrecto el identificador de usuario o la encontraseña. Tampoco debería dar información sobre el estado de una cuenta existente.
 +
 +
 +
==== Ejemplo de respuestas incorrectas ====
 +
 +
*"Inicio de sesión para el usuario foo: contraseña incorrecta"
 +
*"Falló el inicio de sesión: usuario no válido"
 +
*"Falló el inicio de sesión: cuenta deshabilitada"
 +
*"Falló el inicio de sesión: usuario inactivo"
 +
 +
 +
==== Ejemplo de respuestas correctas ====
 +
 +
*"Falló el inicio de sesión: Usuario o contraseña incorrectos"
 +
 +
La respuesta correcta no debería indicar si el identificador de usuario o la contraseña es el parámetro incorrecto y por lo tanto, inferir un identificador de usuario válido.
  
  

Revision as of 16:52, 2 August 2015

Cheatsheets-header.jpg

Last revision (mm/dd/yy): 08/2/2015

Introducción

La autentificación es el proceso de verificar que un individuo, entidad o sitio Web es quien dice ser. En el contexto de una aplicación Web, la autentificación, comúnmente es realizada mediante el envío de un nombre de usuario o ID y, uno o más datos de información privada que solo un determinado usuario debe conocer.


El manejo de sesiones es un proceso por el cual un servidor mantiene el estado de una entidad interactuando con él. Esto es requerido por un servidor para recordar como debe reaccionar a las peticiones posteriores a lo largo de una transacción. Las sesiones son mantenidas en el servidor por un identificador de sesión el cual puede ser pasado y devuelto entre el cliente y el servidor al transmitir y recibir solicitudes. Las sesiones deben ser únicas por usuario e informáticamente, muy difíciles de predecir.



Reglas generales de autentificación

ID de usuario

Asegúrese de que sus nombres/identificadores de usuarios no sean sensibles a mayúsculas y minúsculas. El usuario 'smith' y el usuario 'Smith' deberían ser el mismo usuario.

Dirección de correo electrónico como ID de usuario

Muchos sitios utilizan la dirección de correo electrónico como identificador de usuario, lo cual es un buen mecanismo para segurar un identificador único por cada usuario sin agregarle a éstos la carga de tener que recordar un nuevo nombre de usuario. Sin embargo, muchas aplicaciones Web no tratan correctamente las direcciones de correo electrónico, debido a conceptos equivocados sobre lo que constituye una dirección de correo electrónico válida.

Specifically, it is completely valid to have an mailbox address which:

  • Es sensible a mayúsculas y minúsculas en la parte local
  • Tiene caracteres no alfanuméricos en la parte local (incluyendo + y @)
  • Tiene cero o más etiquetas (aunque ciertamente cero no va a ocurrir)

La parte local es la parte de la dirección de correo electrónico que se encuentra a la izquierda del caracter '@'. El dominio es la parte de la dirección de correo electrónico que se encuentra a la derecha del caracter '@' y consiste en cero o más etiquetas unidas por el caracter de punto.

Al momento de estar escribir este artículo, el RFC 5321 es el estándar actual que define el protocolo SMTP y lo que constituye una dirección de correo electrónico válida.

Por favor, tenga en cuenta que las direcciones de correo electrónico deberías ser consideradas datos públicos. En aplicaciones de alta seguridad, podrías asignarse los nombres de usuario y ser secretos en lugar de ser datos públicos definidos por el usuario.


Validación

Muchas aplicaciones Web contienen expresiones regulares informáticamente muy costosas e inexactas contain computationally expensive and inaccurate regular expressions para intentar validar las direcciones de correo electrónico.

Cambios recientes generaron que el número de falsos negativos se viera incrementado, particularmente debido a:

  • El aumento de popularidad de las sub-direcciones de proveedores como Gmail (comúnmente usando + como token en la parte local para afectar la entrega)
  • Nuevos gTLDs con nombres largos (muchas experesiones regulares comprueban el número y longitud de cada etiqueta en el dominio)

Siguiendo el RFC 5321, las mejores prácticas para la validación de una dirección de correo electrónico deberían ser:

  • Comprobar la presencia de al menos un símbolo de @ en la dirección
  • Asegurarse de que la parte local no es de más de 64 bytes
  • Asegurarse de que el dominio no es de más de 255 bytes
  • Asegurarse que sea una dirección de entrega verídica (NdT: se refiere a que el correo pueda ser entregado)

Para asegurarse que una dirección de entrega sea verídica, la única forma es enviar un correo electrónico al usuario y que éste deba tomar alguna acción para confirmar que lo ha recibido. Más allá de confirmar que la dirección de correo electrónico es válida y reciba los mensajes, esto también proporciona una confirmación positiva de que el usuario tiene acceso al buzón de correo y es probable esté autorizado a usarlo. Esto no significa que otros usuarios no tengan acceso al mismo buzón de correo, cuando por ejemplo el usuario utiliza un servicio que genera una dirección de correo electrónico deshechable.


Normalización

Como la parte local de las direcciones de correo electrónico son, de hecho, sensibles a mayúsculas y minúsculas, es importante almacenar y comparar las direcciones de correo electrónico correctamente. Para normalizar la entrada de una dirección de correo electrónico, debería convertir la parte del dominio SOLO a minúsculas.

Desafortunadamente, esto hace y hará a la entrada, más difícil de normalizar y de coincidir correctamente con los intentos del usuario.

Es razonable aceptar solo una única capitalización de diferentes alternativas para direcciones de correo electrónico idénticas. Sin embargo, en este caso es crítico para:

  • Almacenar la parte del usuario tal y como fue provista y verificada por el usuario en el proceso de verificación
  • Realizar comparaciones lowercase(provista) == lowercase(almacenada)


Implementar controles adecuados de fortaleza de contraseña

Una de las principales preocupaciones cuando se utilizan contraseñas para la autentificación, es la fortaleza de las contraseñas. Una política de contraseñas "fuertes" hace que sea difícil o incluso improbable adivinar la contraseña a través de medios manuales o automatizados. Las siguientes características definen una contraseña fuerte:


Advertencia


Las siguientes indicaciones están disputadas. Por favor, vea la presentación de OWASP (en inglés), "Your Password Complexity Requirements are Worthless - OWASP AppSecUSA 2014" para más información.



Longitud de la contraseña

Las contraseñas más largas proporcionan una mayor combinación de caracteres y en consecuencia hacen que sea más difícil de adivinar para un atacante.


  • La longitud mínima de las contraseñas debería ser forzada por la aplicación.
    • Las contraseñas menores a 10 caracteres son consideradas débiles ([1]).

Mientras que la longitud mínima forzada puede causar problemas para la memorización de la contraseña en algunos usuarios, las aplicaciones deberían alentarlos a establecer frases de paso o passphrases (frases o combinaciones de palabras) que pueden ser mucho más largas que las contraseñas típicas y mucho más fáciles de recordar.


  • La longitud máxima de la contraseña no debería establecerse demasiado baja, ya que evitará que los usuarios puedan crear frases de paso (passphrases). La longitud máxima típica es de 128 caracteres.
    • Frases de paso de menos de 20 caracteres usualmente son consideradas ebiles si solo se emplean letras minúsculas.


Complejidad de la contraseña

Las aplicaciones deberían imponer reglas de complejidad de contraseñas para evitar las contraseñas fáciles de adivinar. Los mecanismos de contraseñas deberían permitir al usuario, poder tipear casi cualquier caracter como parte de su contraseña, incluyendo el caracter de espacio. La contraseñas deberían, obviamente, ser sensibles a mayúsculas y minúsculas a fin de incrementar la complejidad de las mismas. Ocasionalmente, encontramos sistemas donde las contraseñas no son sensibles a mayúsculas y minúsculas, frecuentemente debido a problemas de sistemas heredados como los viejos ordenadores centrales que no tenían contraseñas sensibles a mayúsculas y minúsculas.


El mecanismo de cambio de contraseña debería requerir un nivel mínimo de complejidad que tenga sentido para la aplicación y su población de usuarios. Por ejemplo:

  • La contraseña debe reunir al menos 3 de las siguientes 4 reglas de complejidad
    • al menos 1 mayúscula (A-Z)
    • al menos 1 minúscula (a-z)
    • al menos 1 dígito (0-9)
    • al menos 1 caracter especial (puntuación) — no olvidar de tratar también, a los espacios en blanco como un caracter especial
  • al menos 10 caracteres
  • no más de 128 caracteres
  • no más de 2 caracteres indénticos consecutivos (ej., 111 no está permitido)


Topologías de contraseña

  • Prohibir topologías de contraseñas de uso común
  • Forzar a varios usuarios a utilizar diferentes topologías de contraseña
  • Exigir un cambio mínimo de topología entre viejas y nuevas contraseñas


Información adicional

  • Asegúrese de que todos los caracteres que el usuario tipea están realmente incluidos en la contraseña. Hemos visto sistemas que truncan la contraseña a una longitud inferior de la que el usuario provee (ej., truncada a los 15 caracteres cuando se han ingresado 20).
    • Esto es manejado usualmente al establecer la longitud de TODOS los campos de contraseña exactamente como la longitud máxima de la contraseña. Esto es particularmente importante si su longitud máxima de contraseña es corta, como 20-30 caracteres.


Si la aplicación requiere políticas de contraseña más complejas, será necesario ser muy claro sobre cuáles son esas políticas.

  • La política requerida necesita ser indicada explícitamente en la página de cambio de contraseña
    • asegúrese de enumerar cada carácter especial que permite, para que sea evidente para el usuario


Recomendación:

  • Lo ideal, sería que la aplicación indicara al usuario cómo escribir su nueva contraseña y cuánto de la directiva de complejidad de su nueva contraseña cumple
    • De hecho, el botón de envío debería verser atenuado hasta que la nueva contraseña reúna los requisitos establecidos en la política de complejidad de contraseña y la segunda copia de la nueva contraseña coincida con la primera. Esto hará que sea mucho más fácil, para el usuario, entender la política de complejidad y cumplirla.


Independientemente de cómo se comporte la UI, cuando un usuario envía su solicitud de cambio de contraseña:

  • Si la nueva contraseña no cumple con la política de complejidad de contraseña, el mensaje de error debería describir TODAS las reglas de complejidad con las cuáles la nueva contraseña no cumple y no sola la primera regla con la que no cumpla.


Implementar un mecanismo de recuperación de contraseña seguro

Es común que una aplicación tenga un mecanismo que provea al usurio un medio para acceder a su cuenta en caso de que olvide su contraseña. Por favor, para más detalles sobre esta característica, vea Forgot Password Cheat Sheet (en inglés).


Almacenar contraseñas de forma segura

Es fundamental para una aplicación, almacenar contraseñas usando la técnica criptográfica correcta. Para conocer más sobre este mecanismo, vea Password Storage Cheat Sheet (en inglés).


Transmitir contraseñas sólo sobre TLS u otro transporte fuerte

Ver: Transport Layer Protection Cheat Sheet (en inglés)

La página de inicio de sesión y todas las páginas autentificadas subsiguientes, deberían ser accedidas exclusivamente sobre TLS u otro transporte fuerte. La página de inicio de sesión principal, conocida como "landing page", debe ser servida sobre TLS u otro transporte fuerte.

Si no se utiliza TLS u otro transporte fuerte para la landing page de inicio de sesión, se permite a un atacante modificar el action del formulario de inicio de sesión, generando que las credenciales del usuario sean enviadas a una ubicación arbitraria.

Si no se utiliza TLS u otro transporte fuerte para las páginas autentificadas que se habilitan luego del inicio de sesión un atancante puede ver la ID de sesión sin cifrar y comprometer la sesión autentificada del usuario.


Solicitar volver a autentificarse para funciones sensibles

Con el fin de mitigar ataques CSRF y de secuestro de sesión (hijacking), es importante solicitar las credenciales actuales de una cuenta en los siguientes casos:

  • Antes de modificar información sensible (como la contraseña del usuario, la dirección de correo electrónico del usuario)
  • Antes de transacciones sensibles (como enviar una compra a una nueva dirección).

Sin esta contramedida, un atacante puede ser capaz de ejecutar transacciones sensibles a través de un ataques CSRF o XSS sin necesidad de conocer las credenciales actuales del usuario. Adicionalmente, un atacante puede obtener, temporalmente, acceso físico al navegador del usuario o robar su ID de sesión para tomar el control de la sesión del usuario.


Utilizar la autentificación por múltiples factores

La autentificación por múltiples factores (MFA por las siglas en ingles de "Multi-factor authentication") es el uso de más de un factor de autentificación para iniciar sesión o procesar una transacción, mediante:

  • Algo que se conoce (detalles de la cuenta o contraseñas)
  • Algo que se tiene (tokens o teléfonos móviles)
  • Algo que se es (factores biométricos)

Los esquemas de autentificación como las contraseñas de un solo uso (OTP por las siglas en inglés de "One Time Passwords") implementadas utilizando un token físico (hardware) también pueden ser un factor clave en la lucha contra ataques tales como los ataques CSRF y malware del lado del cliente. Un considerable número de los token de hardware para MFA disponibles en el mercado, permiten una buena integración con las aplicaciones Web. Ver: [2] (en inglés).


Autentificación TLS

La autentificación TLS, también conocida como autentificación TLS authentication mutua, consiste en que ambos, navegador y servidor, envíen sus respectivos certificados TLS durante el proceso de negociación TLS (handshaking). Así como se puede validar la autenticidad de un servidor mediante el certificado y, preguntar a una Autoridad de Certificación conocida (CA, por las siglas en inglés de "Certificate Authority") si la certificación es válida, el servidor puede autentificar al usuario recibiendo un certificado desde el cliente y validándolo contra una CA o su propia CA. Para hacer esto, el servidor debe proveer al usuario de un certificado generado específicamente para él, asignado valores que puedan ser usados para determinar que el usuario debe validar el certificado. El usuario instala los certificados en el navegador y los usa para el sitio Web.


Es una buena idea hacer esto cuando:

  • Es aceptable (o incluso preferido) que el usuario sólo tenga acceso a la página web des una sola computadora/navegador.
  • El usuario no se asusta fácilmente por el proceso de instalación de certificados TLS en su navegador o habrá alguien, probablemente de soporte de TI, que lo hará esto para el usuario.
  • El sitio web requiere un paso adicional de seguridad.
  • El sitio Web es de la intranet de una compañía, empresa u organización.


Por lo general, no es una buena idea utilizar este método para la mayor parte de los sitios Web de acceso público que tendrán un usuario promedio. Por ejemplo, no será una buena idea implemenetar esto en un sitio Web como Facebook. Si bien esta técnica puede evitar que el usuario tenga que escribir una contraseña (protegiéndola así contra el robo desde un keylogger promedio), aún se considera una buena idea emplear el uso de una contraseña combinada con la autentificación TLS.


Para más información, ver: Client-authenticated TLS handshake


Autentificación y mensajes de error

En el caso de las funcionalidades de autentificación, los mensajes de error implementados de forma incorrecta pueden ser utilizados con el propósito de obtener y almacenar identificadores de usuario y contraseñas. Una aplicación, debería responder (tanto en los encabezados HTTP como en el contenido HTML) de forma genérica.


Respuestas de autentificación

Una aplicación debería responder mensajes de error genéricos independientemente de si era incorrecto el identificador de usuario o la encontraseña. Tampoco debería dar información sobre el estado de una cuenta existente.


Ejemplo de respuestas incorrectas

  • "Inicio de sesión para el usuario foo: contraseña incorrecta"
  • "Falló el inicio de sesión: usuario no válido"
  • "Falló el inicio de sesión: cuenta deshabilitada"
  • "Falló el inicio de sesión: usuario inactivo"


Ejemplo de respuestas correctas

  • "Falló el inicio de sesión: Usuario o contraseña incorrectos"

La respuesta correcta no debería indicar si el identificador de usuario o la contraseña es el parámetro incorrecto y por lo tanto, inferir un identificador de usuario válido.


Recursos adicionales

Un PDF del Cheatsheet en inglés puede obtenerse aquí: https://magic.piktochart.com/output/7003174-authentication-cheat-sheet


Autores y Editores principales

Eoin Keary eoinkeary[at]owasp.org
Jim Manico
Timo Goosen
Pawel Krawczyk
Sven Neuhaus
Manuel Aude Morales


Traducción al idioma Español:
Eugenia Bahit