Skip to main content

Realm

Lo primero que podemos observar es el concepto de Realms.

alt text

Para entender qué es un realm necesitamos tener en cuenta que Keycloak trabaja con el concepto de multi-tenant. Cada tenant es como si fuera una instancia de keycloak destinada a una organización. Usuarios, grupos, aplicaciones, etc., se organizan en realms. Una empresa puede tener un único realm para todo o varios realms, depende de cómo prefieran organizar las cosas. Segregar o no segregar, ya sea por departamento, por squad, por tipo de aplicación, por producto, etc., es una cuestión de arquitectura y cada realm puede gestionarse separadamente por sus propios administradores.

El realm master es especial, usado para administrar el propio Keycloak. Un administrador del realm master puede configurar los otros realms también.

Vamos a crear nuestro primer realm. Yo lo llamaré devops.

alt text

Es totalmente posible usar un realm de Keycloak como proveedor de identidad para otro realm dentro del mismo Keycloak. Este enfoque se conoce como Identity Brokering interno. Esta integración aún requiere configuración manual, como si fueran dos sistemas distintos.

Al iniciar un realm también iniciamos un servidor de autorización OAuth2 y el proveedor de Identidad SAML. Al acceder a Real Settings>General de este realm podemos tener dos enlaces abajo para configuración del endpoint OpenID y SAML.

alt text

OpenID Endpoint Configuration: Es un JSON que expone automáticamente todas las URLs importantes y configuraciones del realm devops para que los clientes OIDC (OpenID Connect) consigan integrarse con Keycloak sin necesidad de configurar todo manualmente. Sirve para que las aplicaciones (clientes OIDC) descubran dinámicamente:

  • Endpoints de autenticación
  • Endpoints de token
  • Endpoints de logout
  • Endpoints de JWKS (claves públicas de firma)
  • Supported scopes, claims, grant types, etc

Este enlace en realidad es https://keycloak.puziol.com.br/realms/devops/.well-known/openid-configuration y tiene la intención de ser público y no expone ninguna información sensible, solo sirve como un informe de:

{
"issuer": "https://keycloak.puziol.com.br/realms/devops",
"authorization_endpoint": "https://keycloak.puziol.com.br/realms/devops/protocol/openid-connect/auth",
"token_endpoint": "https://keycloak.puziol.com.br/realms/devops/protocol/openid-connect/token",
"userinfo_endpoint": "https://keycloak.puziol.com.br/realms/devops/protocol/openid-connect/userinfo",
"jwks_uri": "https://keycloak.puziol.com.br/realms/devops/protocol/openid-connect/certs",
...
}

¿Quién usa esto? Aplicaciones web/móvil que se autentican mediante OIDC, bibliotecas (passport.js, Spring Security, Dex, etc.), el propio Keycloak (al configurar identity brokering con otro IdP), etc. Con esto sabemos exactamente qué mensajes deben enviarse a esos endpoints para obtener el token.

Haciendo una analogía, .well-known/openid-configuration es para OpenID lo que swagger.json es para una API REST.

Ya en el caso del enlace SAML 2.0 Identity Provider Metadata describe en XML el proveedor de IdP de keycloak en este realm para uso con SAML 2.0. Es usado por Service Providers (SP) para configurar automáticamente la confianza con Keycloak.

Este XML incluye:

  • entityID: identificador único del IdP
  • URLs de:
    • Single Sign-On (SSO)
    • Single Logout (SLO)
    • Información de binding (HTTP-Redirect, POST, etc.)
    • Certificados públicos usados para firmar respuestas/assertions

Nuestro xml

<!--  -->
<md:IDPSSODescriptor WantAuthnRequestsSigned="true" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
<md:KeyDescriptor use="signing">
<ds:KeyInfo>
<ds:KeyName>DDLZ-ZDCmQddCrDNfaPcwxiJOdKsZLWExxkajG0bBjo</ds:KeyName>
<ds:X509Data>
<ds:X509Certificate>MIICmzCCAYMCBgGW+n640TANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZkZXZvcHMwHhcNMjUwNTIzMDAxMzUxWhcNMzUwNTIzMDAxNTMxWjARMQ8wDQYDVQQDDAZkZXZvcHMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC74T6+gdPNOYl7RTRFU6rid/ofj13RbI9ZtfmlykR1qXNoIiT+ndy/14BFsRDJIY7dEOa7SOJUiR77M4LslAPYaIhszZ6RRuJ4u+WW5UQpZ8BLtaG7B4c5k/EHPkBfVitQUnj4Ss0gM53fkBIWg6b1A9eM6BRdawpTxXb0o2v4z6wsEOzbrHrbsz7DHOB792/tqzd+gIo35oAg9mGtI5s3Cu2SyoPJZg9YY2Q2cCRXA+auZ+rYEAAGIeLdO7s+/qJ3dblVy/3D08ZSvExoFuY2/3lzEzqp6b0XmBwwqGIHdWwX61+s4ZarrXdWR/km5Z6dueZbt03wchG3qexWrK3XAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAFt/VbuSqp2mBmW28BFJ9HACU+Idd37TBnTuUJERAgAZHoRrbRVtBUd1Harc2Xn7ZfbNno+AiHbeg+rzEf3Spa9qqUGW5PIvCLtvxFec/d/VatF5EHndi8ReEIqz6vgQdagjt6m61rywj30FoQanbimnTsJxjCp/03pZxx/0F7+Q+gR7TWbq+SAxqlL6DPz+a6uDjrfcmRKCFrX3oNl6j5/yJ4JJGzhx3+AKxzyidw5YP8+EuRwerXpUtXDV/gQCF5hnLAEA4lDRLtOqqrMSgpJ34m/+IZfx69WEvPtu3KMcL8DkBUmFj8lxcQPb7Sdu2ZMCRKd3r2WEK/mGYlgBwzE=</ds:X509Certificate>
<!-- -->
<md:ArtifactResolutionService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://keycloak.puziol.com.br/realms/devops/protocol/saml/resolve" index="0"/>
<md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://keycloak.puziol.com.br/realms/devops/protocol/saml"/>
<md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://keycloak.puziol.com.br/realms/devops/protocol/saml"/>
<md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="https://keycloak.puziol.com.br/realms/devops/protocol/saml"/>
<md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://keycloak.puziol.com.br/realms/devops/protocol/saml"/>
<md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat>
<md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</md:NameIDFormat>
<md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</md:NameIDFormat>
<md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</md:NameIDFormat>
<md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://keycloak.puziol.com.br/realms/devops/protocol/saml"/>
<md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://keycloak.puziol.com.br/realms/devops/protocol/saml"/>
<md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://keycloak.puziol.com.br/realms/devops/protocol/saml"/>
<md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="https://keycloak.puziol.com.br/realms/devops/protocol/saml"/>
</md:IDPSSODescriptor>
</md:EntityDescriptor>

Al crear otro realm tenemos otros endpoints tanto para OpenID como para SAML. Los enlaces son los mismos, solo cambiaría el realm.

  • https://keycloak.puziol.com.br/realms/outrorealm/.well-known/openid-configuration
  • https://keycloak.puziol.com.br/realms/outrorealm/protocol/saml/descriptor

Pero ¿el certificado es el mismo en el caso de SAML? No. Sería otro certificado completamente diferente. Haz tu prueba.

Para entender mejor sobre lo que vamos a hablar de aquí en adelante recomiendo las lecturas: