¿Cómo protege OAuth 2 contra cosas como los ataques de repetición usando el token de seguridad?

564

Según tengo entendido, la siguiente cadena de eventos ocurre en OAuth 2 para Site-Aacceder a la información del UsuarioSite-B .

  1. Site-Ase registra Site-By obtiene un secreto y una identificación.
  2. Cuando usuario le dice Site-Aal acceso Site-B, usuario se envía a Site-Bdonde dicen Site-Bque lo harían de hecho similares para dar Site-Apermisos a información específica.
  3. Site-Bredirige al Usuario nuevamente Site-A, junto con un Código de autorización
  4. Site-Aluego pasa ese código de autorización junto con su secreto a Site-Bcambio de un token de seguridad.
  5. Site-Aluego realiza solicitudes Site-Ben nombre del usuario agrupando el token de seguridad junto con las solicitudes.

¿Cómo funciona todo esto en términos de seguridad y encriptación, a un alto nivel? ¿Cómo protege OAuth 2 contra cosas como los ataques de repetición usando el token de seguridad?

William Jones
fuente
49
oauth2 simplemente explicó aquí: gist.github.com/mziwisky/10079157
Paolo el
44
Lea la especificación: tools.ietf.org/html/rfc6749 Es posible que se sorprenda de lo comprensible que es. También es correcto, lo que puede no ser tan malo.
Kris Vandermotten
1
Esta pregunta y sus respuestas (actuales) se centran en un "tipo de concesión" en particular en OAuth 2.0 (es decir code), pero hay otros tipos de concesión definidos en OAuth 2.0 que son relevantes para diferentes casos de uso (por ejemplo, no relacionados con el usuario).
Hans Z.
44
Oh, ¿por qué no reemplazar "Sitio B" con algo más legible como "Sitio de IdProvider"?
Yurii

Respuestas:

1379

Cómo funciona OAuth 2.0 en la vida real:

Estaba conduciendo por la panadería de Olaf de camino al trabajo cuando vi la rosquilla más deliciosa en la ventana; quiero decir, la cosa estaba goteando chocolate. Así que entré y exigí "¡Debo tener esa rosquilla!". Él dijo "seguro que serán $ 30".

Sí, lo sé, $ 30 por una dona! ¡Debe ser delicioso! Alcancé mi billetera cuando de repente escuché al chef gritar "¡NO! No hay donas para ti". ¿Pregunté por qué? Dijo que solo acepta transferencias bancarias.

¿Seriamente? Sí, hablaba en serio. Casi me alejé allí mismo, pero luego la dona me llamó: "Cómeme, estoy delicioso ...". ¿Quién soy yo para desobedecer las órdenes de un donut? Dije ok.

Me entregó una nota con su nombre (el chef, no la rosquilla): "Diles que Olaf te envió". Su nombre ya estaba en la nota, así que no sé cuál era el punto de decir eso, pero está bien.

Conduje una hora y media hasta mi banco. Le entregué la nota al cajero; Le dije que Olaf me envió. Ella me dio una de esas miradas, del tipo que dice: "Puedo leer".

Ella tomó mi nota, pidió mi identificación, me preguntó cuánto dinero estaba bien para darle. Le dije $ 30 dólares. Hizo algunos garabatos y me entregó otra nota. Este tenía un montón de números, supuse que así es como hacen un seguimiento de las notas.

En ese momento me muero de hambre. Me apresuré a salir de allí, una hora y media después estaba de regreso, de pie frente a Olaf con mi nota extendida. Lo tomó, lo miró y dijo: "Volveré".

Pensé que estaba recibiendo mi dona, pero después de 30 minutos comencé a sospechar. Entonces le pregunté al tipo detrás del mostrador "¿Dónde está Olaf?". Él dijo "Fue a buscar dinero". "¿Qué quieres decir?". "Toma nota al banco".

Huh ... así que Olaf tomó la nota que el banco me dio y volvió al banco para sacar dinero de mi cuenta. Como tenía la nota que me dio el banco, el banco sabía que él era el tipo del que estaba hablando, y como hablé con el banco sabían que solo le daría $ 30.

Debió de tomarme mucho tiempo darme cuenta porque, para cuando levanté la vista, Olaf estaba parado frente a mí y finalmente me entregó mi donut. Antes de irme tuve que preguntar: "Olaf, ¿siempre vendiste rosquillas de esta manera?". "No, solía hacerlo diferente".

Huh Mientras caminaba de regreso a mi auto sonó mi teléfono. No me molesté en contestar, probablemente era mi trabajo llamarme para despedirme, mi jefe es un idiota. Además, quedé atrapado pensando en el proceso que acabo de pasar.

Quiero decir, piénselo: pude dejar que Olaf tomara $ 30 de mi cuenta bancaria sin tener que darle la información de mi cuenta. Y no tuve que preocuparme de que sacaría demasiado dinero porque ya le dije al banco que solo se le permitía tomar $ 30. Y el banco sabía que él era el tipo correcto porque tenía la nota que me dieron para darle a Olaf.

Ok, seguro que preferiría entregarle $ 30 de mi bolsillo. Pero ahora que tenía esa nota, podía decirle al banco que lo dejara tomar $ 30 cada semana, luego podía aparecer en la panadería y ya no tenía que ir al banco. Incluso podría pedir la dona por teléfono si quisiera.

Por supuesto que nunca haría eso, esa rosquilla era asquerosa.

Me pregunto si este enfoque tiene aplicaciones más amplias. Mencionó que este era su segundo enfoque, podría llamarlo Olaf 2.0. De todos modos, es mejor que llegue a casa, tengo que empezar a buscar un nuevo trabajo. Pero no antes de obtener uno de esos batidos de fresa de ese nuevo lugar al otro lado de la ciudad, necesito algo para eliminar el sabor de esa rosquilla.

Luis perez
fuente
41
Bueno, en la práctica, Olaf debería poder tomar $ 30 de su cuenta en cualquier momento que quiera, incluso si no solicita ninguna dona. Curiosamente, ese es el objetivo principal en los escenarios reales de oauth2.0 :) Esta es ciertamente una gran respuesta, pero quien esté leyendo esto, dirígete a la esencia que Paolo mencionó en su comentario de la pregunta ( gist.github.com/mziwisky/ 10079157 ). Una buena lectura complementaria para aclarar el concepto.
Samiron
44
Gran respuesta pero 2 puntos para plantear: 1. Como señaló @Samiron, Olaf podría tomar 30 $ en cualquier momento que quiera. 2. En un escenario real de OAuth2.0, Olaf no podrá servir el donut antes de sacar dinero del banco. Mientras que en este ejemplo, podría haber guardado el cheque y simplemente le entregó a Luis su donut bien ganado. Entonces, si modificamos el ejemplo para hacer que autorice a Olaf a obtener masa de un tercero que conozco, entonces tendría más sentido ya que Olaf tendría que obtener la masa antes de que comience a hornear la dona (suponiendo que la dona solitaria Olaf ¡tenía era solo para mostrar!).
Ticker23
44
ticker23, la historia de donuts desafortunadamente supera tu corrección técnica: cuando la leí me vendieron la historia. Fue escrito por Homer Simpson.
shevy
44
@Prageeth Olaf siempre lleva la nota hacia y desde el banco en una caja segura que gotea tinta si se manipula, tomaría muchas vidas restaurar la nota. El banco también toma las huellas digitales de los clientes en su primera visita, si Olaf pierde sus dedos en un accidente de horneado, tendrá que pedirle a Luis que configure la transferencia bancaria nuevamente, y el banco tendrá que identificar a Olaf por su tatuaje de Breaking Bread la próxima vez. .
Chris
11
Me encantan las respuestas lindas tanto como a la siguiente persona, y cuando su ternura ayuda a que la respuesta sea más accesible es increíble ... pero al final del día, Stack Overflow se trata de educar a las personas, y esta linda historia no hace eso. Incluso para comprender la analogía de las rosquillas, ya debe comprender cómo funciona OAuth2, pero se suponía que el objetivo de la respuesta era explicar precisamente eso. Considere editar esta respuesta (superior) para explicar realmente los conceptos, no solo hacer referencia oblicua al final ... incluso si eso tiene el costo de una broma o dos.
machineghost
133

Según lo que he leído, así es como funciona todo:

El flujo general descrito en la pregunta es correcto. En el paso 2, el usuario X se autentica y también autoriza el acceso del sitio A a la información del usuario X en el sitio B. En el paso 4, el sitio devuelve su secreto al sitio B, autenticándose a sí mismo, así como el código de autorización, que indica qué está pidiendo (token de acceso del usuario X).

En general, OAuth 2 en realidad es un modelo de seguridad muy simple, y el cifrado nunca entra directamente en juego. En cambio, tanto el token secreto como el de seguridad son esencialmente contraseñas, y todo está protegido solo por la seguridad de la conexión https.

OAuth 2 no tiene protección contra los ataques de repetición del token de seguridad o el secreto. En cambio, depende completamente de que el Sitio B sea responsable de estos artículos y no los deje salir, y de que se envíen a través de https mientras están en tránsito (https protegerá los parámetros de URL).

El propósito del paso del Código de autorización es simplemente la conveniencia, y el Código de autorización no es especialmente sensible por sí solo. Proporciona un identificador común para el token de acceso del usuario X para el sitio A cuando solicita al sitio B el token de acceso del usuario X. Solo la identificación de usuario del usuario X en el sitio B no habría funcionado, porque podría haber muchos tokens de acceso pendientes a la espera de ser entregados a diferentes sitios al mismo tiempo.

William Jones
fuente
28
Has pasado por alto una función importante del código de autorización. ¿Por qué no simplemente devolver el token de actualización (lo que llama el token de seguridad) inmediatamente, en lugar de tener el paso adicional de intercambiar el código de autorización? Porque capturar el token de actualización permitiría ataques de repetición, mientras que el código de autorización solo se puede usar una vez.
Maurice Naftalin
3
OK, @mauricen, eso tiene sentido ... ¿Pero no podría suceder el ataque de repetición tan bien con el token de actualización, ya que eso es lo que termina pasando con cada solicitud?
Mr Mikkél
15
El código de autorización se pasa a través del usuario, por lo que (por ejemplo) podría almacenarse como una cookie (consulte stackoverflow.com/questions/4065657/… ). El token de actualización pasa directamente entre los dos sitios, por lo que es mucho menos vulnerable.
Maurice Naftalin
Por curiosidad, ¿OAuth devuelve algún identificador único para que el programa lo use? Por ejemplo, actualmente estoy confiando en la dirección MAC para la identificación del usuario, pero dicho esto, los MAC no son confiables / fáciles de usar / etc. Puedo descartar el mecanismo de identificación de la dirección MAC e ir a OAuth si me permite identificar de manera única a los usuarios.
theGreenCabbage
1
Observe en este diagrama: tools.ietf.org/html/rfc6749#section-4.1 que no se muestra el "secreto", solo el identificador del cliente (ID en la pregunta). ¿Por qué es importante el secreto y por qué no está incluido en el RFC? También en la pregunta también está el estado local que se recomienda pasar en la transmisión inicial del Id. Del cliente (A), y la redirección de regreso al cliente junto con el código de autorización para protegerse contra XSSF.
David Williams
104

OAuth es un protocolo con el que una aplicación de terceros puede acceder a sus datos almacenados en otro sitio web sin su cuenta y contraseña. Para una definición más oficial, consulte el Wiki o la especificación.

Aquí hay una demostración de caso de uso:

  1. Inicio sesión en LinkedIn y quiero conectar a algunos amigos que están en mis contactos de Gmail. LinkedIn apoya esto. Solicitará un recurso seguro (mi lista de contactos de gmail) de gmail. Entonces hago clic en este botón:
    Agregar conexión

  2. Aparece una página web y muestra la página de inicio de sesión de Gmail cuando ingreso mi cuenta y contraseña:
    Agregar conexión

  3. Luego, Gmail muestra una página de consentimiento donde hago clic en "Aceptar": Agregar conexión

  4. Ahora LinkedIn puede acceder a mis contactos en Gmail: Agregar conexión

A continuación se muestra un diagrama de flujo del ejemplo anterior:

Agregar conexión

Paso 1: LinkedIn solicita un token del servidor de autorización de Gmail.

Paso 2: el servidor de autorización de Gmail autentica al propietario del recurso y muestra al usuario la página de consentimiento. (el usuario debe iniciar sesión en Gmail si aún no ha iniciado sesión)

Paso 3: el usuario concede la solicitud de LinkedIn para acceder a los datos de Gmail.

Paso 4: el servidor de autorización de Gmail responde con un token de acceso.

Paso 5: LinkedIn llama a la API de Gmail con este token de acceso.

Paso 6: el servidor de recursos de Gmail devuelve sus contactos si el token de acceso es válido. (El token será verificado por el servidor de recursos de Gmail)

Puede obtener más información sobre los detalles de OAuth aquí .

Owen Cao
fuente
Todas tus imágenes han desaparecido. ¿Hay alguna posibilidad de que puedas cargarlos en stack.imgur?
ChrisF
1
¿Cómo puede ser esto correcto? ¿No es este proceso iniciado por el usuario sentado frente al navegador, no por LinkedIn? Pero tienes eso como paso 3. Esto es lo que no entiendo.
Matt
17
La explicación más fácil. Gracias, nunca volveré a comprar donas
OverCoder
El paso 4 del linkedin regresa con un token de autorización. Esto debe proporcionarse en el quinto paso, donde obtendremos un token de acceso y un token de actualización que podría usarse más para los recursos protegidos.
amesh
@amesh Gracias, tienes razón, ese es el flujo del código de autorización, aquí acabo de decir de manera simplificada para mostrar la idea básica de OAuth 2.
Owen Cao
24

Figura 1, levantada de RFC6750 :

     +--------+                               +---------------+
     |        |--(A)- Authorization Request ->|   Resource    |
     |        |                               |     Owner     |
     |        |<-(B)-- Authorization Grant ---|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(C)-- Authorization Grant -->| Authorization |
     | Client |                               |     Server    |
     |        |<-(D)----- Access Token -------|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(E)----- Access Token ------>|    Resource   |
     |        |                               |     Server    |
     |        |<-(F)--- Protected Resource ---|               |
     +--------+                               +---------------+
8bitjunkie
fuente
13

Así es como funciona Oauth 2.0, bien explicado en este artículo

ingrese la descripción de la imagen aquí

Suraj
fuente
¿Puede describir OAUTH2 en términos de no usar Facebook u otros terceros, pero si usa una clave secreta y tokens TOTP con la aplicación del teléfono para proteger la aplicación web?
Al Grant
Facebook es el servidor de autorización en este ejemplo que emite token de acceso a cualquier cliente para que puedan acceder a las API de Facebook. Si desea proteger sus API, debe implementar su propio servidor de autorización. Luego, decide qué tipo de Grant desea usar para obtener el token de acceso. dime que quieres exactamente explicará.
Suraj
Estoy pensando en configurar con Springboot Security. El cliente (teléfono) y el secreto de intercambio de aplicaciones web en el registro: luego use el autenticador de Google para generar un código basado en tiempo / secreto para ingresar durante el inicio de sesión además de la contraseña.
Al Grant
¿Mi último comentario te ilumina más? Ver mi perfil para información de Twitter
Al Grant
Puede obtener el ID del cliente y el secreto en el registro. Luego, haga una solicitud de inicio de sesión con el ID del cliente a su aplicación web (servidor de autorización). la aplicación web valida la identificación del cliente y envía la OTP al teléfono. El teléfono realiza otra solicitud con el secreto del cliente a la aplicación web para intercambiar la OTP con el token de acceso. use este token accss para acceder a los recursos protegidos en la aplicación web. Creo que este sería el flujo de Oauth2 para el escenario dado. Avísame si te ayuda.
Suraj
10

Esta es una joya:

https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2

Muy breve resumen:

OAuth define cuatro roles:

  1. Dueño del recurso
  2. Cliente
  3. Servidor de recursos
  4. Servidor de autorizaciones

Usted (propietario del recurso) tiene un teléfono móvil. Tiene varias cuentas de correo electrónico diferentes, pero quiere todas sus cuentas de correo electrónico en una sola aplicación, por lo que no necesita seguir cambiando. Por lo tanto, su GMail (Cliente) solicita acceso (a través del Servidor de autorización de Yahoo) a sus correos electrónicos de Yahoo (Servidor de recursos) para que pueda leer ambos correos electrónicos en su aplicación GMail.

La razón por la que existe OAuth es porque no es seguro que GMail almacene su nombre de usuario y contraseña de Yahoo.

ingrese la descripción de la imagen aquí

Belfield
fuente
8

La otra respuesta es muy detallada y aborda la mayor parte de las preguntas planteadas por el OP.

Para elaborar, y específicamente para abordar la pregunta del OP de "¿Cómo protege OAuth 2 contra cosas como los ataques de repetición usando el token de seguridad?", Hay dos protecciones adicionales en las recomendaciones oficiales para implementar OAuth 2:

1) Los tokens generalmente tendrán un período de vencimiento corto ( http://tools.ietf.org/html/rfc6819#section-5.1.5.3 ):

Un tiempo de vencimiento corto para los tokens es un medio de protección contra las siguientes amenazas:

  • repetición...

2) Cuando el sitio A usa el token, la recomendación es que se presente no como parámetros de URL sino en el campo de encabezado de solicitud de autorización ( http://tools.ietf.org/html/rfc6750 ):

Los clientes DEBEN realizar solicitudes autenticadas con un token de portador utilizando el campo de encabezado de solicitud "Autorización" con el esquema de autorización HTTP "Portador". ...

El método "application / x-www-form-urlencoded" NO DEBE utilizarse, excepto en contextos de aplicación donde los navegadores participantes no tienen acceso al campo de encabezado de solicitud "Autorización". ...

El parámetro de consulta URI ... se incluye para documentar el uso actual; no se recomienda su uso, debido a sus deficiencias de seguridad

Será
fuente
3

Esta es quizás la explicación más simple de cómo funciona OAuth2 para los 4 tipos de concesión, es decir, 4 flujos diferentes donde la aplicación puede adquirir el token de acceso.

Semejanza

Todos los flujos de tipo de subvención tienen 2 partes:

  • Obtener token de acceso
  • Usar token de acceso

La segunda parte 'usar token de acceso' es la misma para todos los flujos

Diferencia

La primera parte del flujo 'obtener token de acceso' para cada tipo de concesión varía.

Sin embargo, en general, la parte 'obtener token de acceso' se puede resumir en 5 pasos:

  1. Registre previamente su aplicación (cliente) con el proveedor de OAuth, por ejemplo, Twitter, etc. para obtener la identificación / secreto del cliente
  2. Cree un botón de inicio de sesión social con la identificación del cliente y los ámbitos / permisos requeridos en su página para que cuando se haga clic en el usuario se redirija al proveedor de OAuth para que se autentique
  3. El proveedor de OAuth solicita al usuario que otorgue permiso a su aplicación (cliente)
  4. El proveedor de OAuth emite código
  5. La aplicación (cliente) adquiere el token de acceso

Aquí hay un diagrama de lado a lado que compara cómo cada flujo de tipo de concesión es diferente en función de los 5 pasos.

Este diagrama es de https://blog.oauth.io/introduction-oauth2-flow-diagrams/

ingrese la descripción de la imagen aquí

Cada uno tiene diferentes niveles de dificultad de implementación, seguridad y casos de uso. Dependiendo de sus necesidades y situación, tendrá que usar uno de ellos. ¿Cuál usar?

Credencial del cliente : si su aplicación solo sirve a un único usuario

Crendencial de contraseña del propietario del recurso : Esto debe usarse solo como último recurso ya que el usuario tiene que entregar sus credenciales a la aplicación, lo que significa que la aplicación puede hacer todo lo que el usuario pueda

Código de autorización : la mejor manera de obtener la autorización del usuario

Implícito : si su aplicación es móvil o de una sola página

Aquí hay más explicaciones sobre la elección: https://blog.oauth.io/choose-oauth2-flow-grant-types-for-app/

Nethsix
fuente