Cómo convertirse en proveedor de servicios SAML

80

Actualmente, mi empresa desarrolla una aplicación web Java. Un par de nuestros clientes tienen servidores SAML internos (¿proveedores de identidad?) Y han solicitado que nos integremos con ellos. Recientemente he estado leyendo y jugando con OpenAM. Después de unos 3 días de esto, tengo una comprensión general del mismo, pero todavía hay algunas lagunas en mi conocimiento. Mi esperanza es que alguien pueda aclararme esto.

Así que así es como imagino el flujo de trabajo de un usuario que inicia sesión.

Definamos el servidor SAML de nuestros clientes como https://their.samlserver.com . Entonces, un usuario acude a nuestra aplicación web en busca de un recurso que está protegido. Digamos que la URL es http://my.app.com/something .

Entonces, si estoy en lo cierto, my.app.com es lo que SAML define como proveedor de servicios . Nuestra aplicación se da cuenta de que este usuario necesita iniciar sesión. A continuación, presentamos una página como esta al usuario ...

<script>JQuery Script to auto submit this form on ready</script>
<form method="post" action="https://their.samlserver.com/Post/Servlet">
    <input type="hidden" name="SAMLRequest" value="someBase64Data" />
    <input type="submit" value="Submit" />
</form>

Y esa someBase64Datadebería ser base64una versión codificada de esto ...

<samlp:AuthnRequest
  xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
  xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
  ID="identifier_1"
  Version="2.0"
  IssueInstant="2004-12-05T09:21:59Z"
  AssertionConsumerServiceIndex="0">
 <saml:Issuer>http://my.app.com</saml:Issuer>
 <samlp:NameIDPolicy
   AllowCreate="true"
   Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>
</samlp:AuthnRequest>

Así que mi primer par de preguntas.

¿Cuál se supone que es el valor de ID ?

¿Y por qué puedo declararme Emisor ?

¿El proveedor de identidad me conoce? Tal vez este sea el círculo de confianza que he estado viendo en OpenAM . Y si sabe de mí, ¿cómo sabe de mí y qué necesita saber?

Entonces, una vez que se reenvía al usuario esa página, se lo lleva a una página proporcionada por el IDP https://their.samlserver.com . Se autentican en esa página y el IDP hace su magia para validar la autenticación y buscar al usuario. Una vez que la autenticación es exitosa, el IDP devuelve un <samlp:Response>definido aquí .

Algunas preguntas más.

Primero, ¿cómo <samlp:Response>puedo volver a mi aplicación web para poder verificarla?

¿Y qué debería buscar en esa respuesta para validar que fue exitosa? ¿Cómo se ve una falla?

Actualmente usamos la dirección de correo electrónico (LDAP) para identificar a los usuarios, por lo que probablemente lo tomaremos de la respuesta y lo usaremos de la misma manera que lo hacemos ahora. ¿Algo más que deba tener en cuenta en esa respuesta?

Entonces, ahora que hemos verificado la validez de esa respuesta, podemos otorgarle al usuario una sesión como lo hacemos actualmente. Pero cuando quieren cerrar la sesión, ¿existe un flujo de trabajo para eso? ¿Tengo que notificar al IDP que el usuario se ha ido?

Y finalmente, hay un par de temas que se han tratado en mi lectura y no estoy seguro de cómo encajan en este flujo de trabajo. Son Círculo de confianza , Fichas y Artefactos .

Gracias por la ayuda a todos. He encontrado mucha información en los últimos días, y es posible que pueda juntarlos después de jugar un poco más. Pero todavía tengo que encontrar un artículo de flujo de trabajo sencillo "Aquí está la publicación". Tal vez sea porque estoy equivocado sobre cómo funciona esto. Tal vez sea porque esto no es tan popular. Pero realmente quería asegurarme de tener el flujo de trabajo para no perderme un paso crucial en algo tan importante como la autenticación del usuario.

Staros
fuente
3
Estoy pasando por el mismo problema en este momento (investigando cómo crear un proveedor de servicios SAML v2 federado liviano que interactúe con Ping Identity). ¿Te importaría comentar cómo te fue? ¿Terminaste usando un fedlet o escribiendo tu propio código? ¡Gracias!
theglauber
1
Estoy teniendo un entorno algo similar. Tengo una aplicación web basada en Java que se ejecuta en Tomcat, ahora tengo que hacer SSO usando SAML. No tengo idea sobre estas tecnologías más que el conocimiento teórico. ¿Alguien puede ayudarme a configurar desde cero?
Jerry

Respuestas:

46

En respuesta a sus preguntas específicas:

1.) ¿Cuál se supone que es el valor de "ID"?

  • Debe ser un identificador único para la solicitud SAML. La especificación SAML 2.0 establece que es realmente específico de la implementación cómo se hace, pero hace las siguientes recomendaciones:

El mecanismo por el cual una entidad del sistema SAML asegura que el identificador es único se deja a la implementación. En el caso de que se emplee una técnica aleatoria o pseudoaleatoria, la probabilidad de que dos identificadores elegidos aleatoriamente sean idénticos DEBE ser menor o igual a 2 ^ -128 y DEBE ser menor o igual a 2 ^ -160 de longitud. Este requisito PUEDE cumplirse codificando un valor elegido aleatoriamente entre 128 y 160 bits de longitud.

2.) ¿Cómo le conoce el IdP?

  • Su SP debe estar registrado con el IdP. Para lograr esto, la especificación SAML define un formato para "Metadatos SAML" que le dice al IdP dónde están sus receptores SAML, cuáles son sus certificados, atributos que intercambia, etc. OpenAM probablemente dicta algunos requisitos mínimos para configurar un SP confiable. Esto varía en cada producto.

3.) ¿Dónde está la respuesta y qué verificar?

  • La Respuesta irá a la URL de su Servicio al consumidor de afirmaciones (ACS), que normalmente se define en los metadatos SAML que intercambia desde su SP con el IdP para la configuración inicial. Cuando recibe una respuesta SAML, debe verificar muchas cosas, pero lo más importante es que el código de estado SAML debe ser "correcto", los ID de inResponseTo deben coincidir con los de la solicitud enviada y debe validar la firma digital en la afirmación. Para eso, deberá confiar en el certificado de verificación público del IdP y probablemente también desee realizar una verificación de revocación.

4.) ¿Qué pasa con Cerrar sesión?

  • SAML 2.0 también define un perfil para Single LogOut (SLO). Esto no solo lo desconectará del SP, sino también del IdP y potencialmente de cualquier otro SP con el que haya establecido una sesión. Tiene un flujo de solicitud / respuesta similar al inicio de sesión único (SSO) y, por lo tanto, cosas similares para configurar y verificar (códigos de estado, firmas, etc.).

En resumen, esto puede ser bastante complejo de implementar desde cero. Es mejor usar bibliotecas y / o productos probados y verdaderos como sugiere Ian. Empresas como la suya han invertido cientos de horas de tiempo de desarrollo para implementar de acuerdo con las especificaciones y la interoperabilidad de prueba con otros proveedores.

Scott T.
fuente
2
¿Por qué debería haber un ID en la solicitud saml? No lo entiendo.
Ashwin
1
Se requiere como parte de la especificación principal de SAML 2.0. Consulte docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf . AuthnRequest es de tipo AuthnRequestType (sección 3.4.1) que es una extensión de RequestAbstractType (sección 3.2.1) que tiene un atributo de ID obligatorio. Uno de los beneficios clave del ID en la solicitud es que la respuesta puede hacer referencia a él para que el SP pueda mapear los dos juntos para evitar la repetición.
Scott T.
Dices que se proporciona una identificación para evitar un ataque de repetición. Si estoy usando una conexión ssl / https entre el Proveedor de servicios y el IDProvider, se puede evitar el ataque de repetición.
Ashwin
1
SSL / HTTPS entre SP e IdP no tiene sentido para evitar ataques de repetición, ya que normalmente se utilizan enlaces de "canal frontal" (navegador).
Scott T.
@Ashwin: la identificación está ahí para que cuando reciba la respuesta, tenga la misma identificación y pueda saber que la respuesta que está recibiendo fue en relación con su solicitud, en lo que respecta a evitar la reproducción, entiendo que muchas marcas de tiempo tanto en las solicitudes como en las respuestas en SAML y las identificaciones solo son viables junto con la autorización por períodos de tiempo limitados.
Tío Iroh
3

Si solo está tratando de configurar una sola aplicación Java como proveedor de servicios, debería considerar usar un Fedlet de Oracle (como independiente) o ForgeRock (incluido con OpenAM). ForgeRock Fedlet tiene algunos problemas para interactuar con Shibboleth 2.2.1 como proveedor de identidad, pero me parece algo más sencillo de configurar y más informativo.

Cada uno tiene instrucciones explícitas contenidas en el README para ayudarlo a implementar. Una vez que el Fedlet está configurado y comunicándose con el IDP, la página de éxito le muestra todo el código que necesita para integrar el SSO federado en su aplicación. Hace el trabajo de fondo de enviar y recibir AuthnRequests y Responses.

La respuesta de Scott responde bastante bien a las preguntas que tenías, pero creo que intentar escribir el código por tu cuenta que genere el SAML es reinventar la rueda. El Fedlet fue diseñado precisamente con este caso de uso en mente.

usuario538917
fuente