Pular para o conteúdo principal

Realm

A primeira coisa que podemos observar é o conceito de Realms.

alt text

Para entender o que é um realm precisamos ter em mente que o Keycloak trabalha com o conceito de multi tenant. Cada tenant é como se fosse uma instância do keycloak destinada a uma organização. Usuários, grupos, aplicativos, etc, são organizados em realms. Uma empresa pode ter um único realm para tudo ou vários realms, depende de como preferem organizar as coisas. Segregar ou não segregar, seja por departamento, por squad, por tipo de aplicação, por produto, etc, é uma questão de arquitetura e cada realm pode ser gerenciado separamente por seus próprios administradores.

O realm master é especial, usado para administrar o próprio Keycloak. Um administrador do realm master pode configurar os outros realms também.

Vamos criar nosso primeiro realm. Eu vou chamá-lo de devops.

alt text

É totalmente possível usar um realm do Keycloak como provedor de identidade para outro realm dentro do mesmo Keycloak. Essa abordagem é conhecida como Identity Brokering interno. Essa integração ainda exige configuração manual, como se fossem dois sistemas distintos.

Ao iniciarmos um realm também iniciamos um servidor de autorização Oauth2 e o provedor de Identidade Saml. Ao acessar o Real Settings>General deste realm podemos temos dois links abaixo para configuração do endpoint OpenID e Saml.

alt text

OpenID Endpoint Configuration: É um JSON que expõe automaticamente todas as URLs importantes e configurações do realm devops para clientes OIDC (OpenID Connect) conseguirem se integrar com o Keycloak sem precisar configurar tudo na mão. Serve para que aplicativos (clientes OIDC) descubram dinamicamente:

  • Endpoints de autenticação
  • Endpoints de token
  • Endpoints de logout
  • Endpoints de JWKS (chaves públicas de assinatura)
  • Supported scopes, claims, grant types, etc

Esse link na verdade é https://keycloak.puziol.com.br/realms/devops/.well-known/openid-configuration e tem a intensão de ser público e não expõe nenhuma informação sensível, só serve como um 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",
...
}

Quem usa isso? Aplicações web/mobile que se autenticam via OIDC, bibliotecas (passport.js, Spring Security, Dex, etc), o próprio Keycloak (quando configurando identity brokering com outro IdP), etc. Com isso sabemos exatamente quais mensagens devem ser enviadas a esses endpoints para obter o token.

Fazendo uma analogia, .well-known/openid-configuration é para o OpenID o que o swagger.json é para uma API REST.

Já no caso do link SAML 2.0 Identity Provider Metadata ele descreve em XML o provedor de IdP do keycloak neste realm para uso com o SAML 2.0. É usado por Service Providers (SP) para configurar automaticamente a confiança com o Keycloak.

Esse XML inclui:

  • entityID: identificador único do IdP
  • URLs de:
    • Single Sign-On (SSO)
    • Single Logout (SLO)
    • Informações de binding (HTTP-Redirect, POST, etc)
    • Certificados públicos usados para assinar respostas/assertions

Nosso 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>

Criando outro realm temos outros endpoints tanto para OpenID e para o SAML. Os links são os mesmo mudariam somente o realm.

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

Porém o certificado é o mesmo no caso do SAML? Não. Seria um outro certificado completamente diferente. Faça seu teste.

Para entender melhor sobre o que vamos falar daqui pra frente recomendo as leituras: