Servicio central de autenticación que redirige al subdominio, usando la firma digital como token de autenticación

3

Estoy trabajando en una "prueba de concepto" de un servicio central de autenticación (no CAS). Mi comprensión de lo que debo hacer tiene agujeros y me preocupa que el "protocolo" no sea seguro.

Por qué / Qué

Los usuarios deben aterrizar en un servidor de autenticación central que realiza la verificación, creación y cambio de credenciales. Una vez verificado, el usuario será autorizado para su subdominio correcto y ningún otro. P.ej. El cliente Foo tiene varios empleados. Todos los empleados inician sesión a través del servidor central y luego se envían al subdominio de Foo. Los subdominios son para aislar grandes clientes y para equilibrar la carga bruta.

Cómo

Es operar como tal:

  1. El usuario aterriza en https://www.example.com/login
  2. El usuario proporciona el nombre de usuario, la contraseña y el subdominio (por ejemplo, foo )
  3. el servicio central de autenticación verifica las credenciales
  4. La respuesta contiene sig (y una marca de tiempo ??)
  5. El usuario construye una solicitud POST a https://foo.example.com/login con datos relevantes, que se describen más adelante.

Firma

donde sig se construye de esta manera:

  

El documento que se firmará es el ID del usuario y una marca de hora en formato yyyyMMddHHmmss unidas con una coma. Por ejemplo, para el ID 55555 y la marca de tiempo 20140620132430, la cadena del documento es 55555,20140620132430 .

El servidor central firma los documentos con su clave privada. Cada subdominio tiene la clave pública correspondiente para que puedan verificar que el firmante era el servidor central.

POST Data

Los datos relevantes pasados al servicio de inicio de sesión (o autenticación ??) del subdominio serían:

  1. ID de usuario
  2. marca de tiempo para el tiempo de generación de la solicitud. Verificado por el receptor para ser actual.
  3. Sitio (subdominio)
  4. sig (codificado en base64, no estoy seguro de por qué es importante ...).

No me queda claro si el cliente / usuario es el que construye el POST para el subdominio. El servidor central de autenticación tendría, por supuesto, todos los datos relevantes para enviar al subdominio y podría construir el POST en sí. Luego tengo que lidiar con cómo hacer que el usuario llegue al subdominio correcto con el token o cookie correcto o algo así.

Preguntas

  1. ¿Esto equivale a "rodar mi propio" protocolo de autenticación?

  2. ¿Un protocolo estándar existente cubrirá mi caso de uso?

  3. ¿Qué hay de malo en lo anterior? Sigo pensando que todo está mal, que es una respuesta potencialmente mala a la pregunta incorrecta; que deberíamos repensar para qué estamos tratando de usar subdominios.

  4. Si la idea básica es sólida, ¿me estoy perdiendo algo? ¿O cualquier otra cosa necesita una aclaración?

pregunta Mr. Mastodon Farm 15.10.2015 - 22:10
fuente

3 respuestas

1

He visto un esquema muy similar al tuyo utilizado en la práctica, aunque con un secreto MAC compartido donde tienes una clave pública / privada. No lo recomendaría, me parece incómodo. Perdóneme si voy muy lejos, pero viendo sus resultados, creo que no es un programador del lado del servidor. Parece que los programadores de subdominios del lado del servidor son sus principales clientes aquí; usted quiere ayudarlos con su servidor central de autenticación. Así que sugiero consultar a un programador de subdominios de este tipo e intentar comprender sus necesidades y hacer que su servicio sea muy fácil para ellos (sugerencia: el actual no lo es).

La falla principal es que esto es costoso, tanto en términos de tiempo de programación (en el servidor central y en los subdominios) como también computacionalmente.

Otra falla importante es que cuando el tiempo de espera expire, se necesitaría un código bastante complicado para permitir que el usuario vuelva a autenticarse y continuar sin perder su estado.

Vuelva a pensar en lo que hace su servicio. Mi contrapropuesta es que su servicio establece un estado del lado del servidor y lo entrega a los subdominios para que luego puedan usarlo internamente. El estado inicialmente consiste en user_id, authenticated_until, authorized_subdomains, pero, por supuesto, lo que no sea trivial que haga el subdominio, puede agregar sus propias cosas al mismo estado.

En la mayoría de los marcos que posiblemente pueda usar un subdominio, es probable que las sesiones se identifiquen con un token aleatorio (piense en algo como JSESSIONID o PHPSESSID ).

Solo una forma de exportar una sesión de central-auth a subdominio es:

  1. El subdominio expone enlace con restricción de IP y verificación de certificado de cliente y servidor. Esto no requiere programación, solo tareas de configuración del servidor web (host virtual). Los navegadores de usuario y cualquier otra persona nunca podrían hablar con este puerto.
  2. Un POST de servidor central para enlace el estado y un token aleatorio.
  3. Ahora el subdominio usa este token para su almacenamiento de sesión normal.

No creo que esto sea óptimo, requiere menos programación y menos subdominio que su diseño. Una vez que piense en un estado de sesión, se le ocurren muchas posibilidades y marcos existentes.

Sub-respuestas específicas:

  1. Estás proponiendo crear tu propio protocolo de autenticación.
  2. No puedo pensar en ningún protocolo existente que responda a su caso de uso (incorrecto).
  3. Sí, una "mala respuesta a la pregunta incorrecta", supongo.
  4. Cada solicitud HTTP dentro de la aplicación web del subdominio donde el usuario está trabajando requiere alguna autenticación. No solo la solicitud HTTP externa inicial, sino también cada interna. Nada aquí causaría la actualización de la marca de tiempo / sig cuando el usuario está haciendo su trabajo normal. Después de algunos minutos, el usuario está perdiendo su estado en la aplicación web de un subdominio, ya sea que el usuario esté activo o no. Están perdiendo sus variables / objetos de sesión del lado del servidor. Si soluciona esto y pasa su token de sesión a través del servidor central de autenticación, se anularán todas las demás ideas; entonces, en primer lugar, no necesita su firma y los cálculos de clave pública / privada de propiedad.
respondido por el kubanczyk 15.11.2015 - 21:37
fuente
1

Una cosa en la que puedo pensar que puede ser problemático (si el usuario está ENVIANDO al subdominio) es que no firma el subdominio al que el usuario intenta conectarse. Déjame intentar dar un ejemplo del problema:

Digamos que tengo credenciales (válidas) para foo.example.com . Envío (foo, username, password) a example.com/login y recupero (sig=signed(id, timestamp)) . Ahora POSTE a bar.example.com/login con (id, timestamp, sig) . bar.example.com/login verá sig , verificará que timestamp coincida con los datos firmados y luego ingrese el id que se firmó. Ahora estoy conectado a bar.example.com . Ups.

Por lo tanto, diría que no solo no es necesario que el usuario vea el sig , sino que otorgarle al usuario el sig es realmente un problema de seguridad. Si devuelve sig al usuario, debe hacer sig=signed(id, timestamp, subdomain) y el inicio de sesión del subdominio debe verificar que se trata del subdominio firmado.

    
respondido por el puzzlepalace 16.10.2015 - 01:07
fuente
0

Parece que el envío de usuario, pase y subdominio es la única autenticación que está realizando. Publicar en los otros dominios no me parece seguro en absoluto. He hecho esto en varios escenarios y para mí la validación del usuario y la contraseña, no importa cómo se haga esto es el servicio de "autenticación". Si desea segregar a los usuarios en diferentes subdominios, ¿por qué no utilizar la capacidad de proxy inverso de esencialmente un solo punto de entrada? Y, esto también puede actuar como un equilibrador de carga también. Estoy seguro al 99% de que puede lograr sus objetivos utilizando un servidor de proxy inverso y hacerlo de manera muy segura. He hecho esto para el estado de Carolina del Norte para una de las entidades gubernamentales.

    
respondido por el David Whitehurst 17.11.2015 - 02:43
fuente

Lea otras preguntas en las etiquetas