Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Fluxo OIDC do AWS Application Load Balancer — transações HTTP

By Devanshu KhannaAug 19, 20245 min read

Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.

O OpenID Connect (OIDC) é uma camada de identidade construída sobre o protocolo OAuth 2.0 que permite às aplicações autenticar usuários sem precisar gerenciar nem armazenar credenciais. O AWS Application Load Balancer (ALB) se integra aos provedores de identidade (IdPs) sociais mais comuns, a identidades corporativas e a qualquer IdP compatível com OIDC. Essa integração simplifica o processo de autenticação e reforça a segurança ao delegar o gerenciamento das sessões e dos tokens de autenticação a um provedor terceirizado confiável.

Embora o login seja transparente para o usuário final, identificar problemas pode ser desafiador quando a autenticação falha por causa dos saltos adicionais entre o usuário e a aplicação que ele está tentando acessar.

Este artigo busca dar visibilidade sobre como as transações HTTP se comportam, sob diferentes perspectivas, durante o fluxo de authorization code.

Se você quer saber como configurar a autenticação de usuário no seu ALB, recomendo a leitura da documentação oficial da AWS. A AWS também disponibiliza um site de demonstração onde você pode testar a funcionalidade de autenticação.

**Vamos detalhar o fluxo de autenticação passo a passo —**

O logging é essencial para manter a saúde, a segurança e a eficiência das aplicações na nuvem. Ele fornece os insights necessários para monitorar e diagnosticar problemas, garantindo que as aplicações rodem de forma estável e segura.

Para mergulhar fundo no fluxo de autenticação, coletei os seguintes logs:

  • Arquivo HAR do navegador do usuário.
  • Logs de acesso dos endpoints do IdP (Auth, Token, User-Info), do ALB e da aplicação de destino.

Antes de examinar as transações HTTP, recomendo se familiarizar com os diferentes componentes do OIDC e suas finalidades.

Pré-requisitos —

  • O IdP está configurado para executar o fluxo de authorization code grant com os escopos pretendidos. Um Client ID e um client secret também já foram gerados.
  • O ALB está configurado com uma listener rule que dispara a ação "authenticate" quando o caminho HTTP é /auth*. Defina os parâmetros da requisição de autenticação, incluindo o client ID, o client secret, o endpoint de autorização, o endpoint de token e o endpoint de user info. Esses parâmetros são usados pelo ALB para se comunicar com o IdP.

Etapa 1 — O usuário envia uma requisição HTTP para a sua aplicação por trás de um ALB com autenticação habilitada.

Navegador redirecionado para o endpoint Auth do IdP.

Logs de acesso do ALB para essa mesma transação —

h2 2024–07–11T18:47:52.382721Z app/demo/25be909a3f190764 109.78.96.82:54871 - -1 -1 -1 302–359 657 "GET https://demo.aws.doit.com:443/auth.html HTTP/2.0" arn:aws:elasticloadbalancing:eu-west-1:21112316:targetgroup/TG/1a24c5faad770fb2 "Root=1–669028d8–653487fd74af592f498329f8" "authenticate"
  • A ação de autenticação é disparada quando o usuário envia uma requisição HTTP GET ao ALB.
  • Se nenhum cookie de sessão de autenticação estiver presente nos cabeçalhos da requisição HTTP, o ALB devolve uma resposta HTTP 302 e o usuário é redirecionado para a URL informada no cabeçalho Location (o endpoint de autorização do IdP).
  • O redirect_uri é o destino para onde o navegador é redirecionado depois que o IdP concede o authorization code.

Etapa 2 — O usuário é redirecionado para o endpoint de autorização do IdP.

Requisição HTTP para o endpoint Auth.

  • O usuário envia uma requisição HTTP para o endpoint de autorização do IdP.
  • Em seguida, o endpoint de autorização do IdP redireciona o usuário para o endpoint de login do IdP (/login).
  • O endpoint de login é responsável pela autenticação do usuário.

Etapa 3 — O usuário acessa o endpoint de login.

Requisição HTTP para o endpoint de login.

  • O usuário envia uma requisição HTTP para o endpoint de login.
  • A página de login é carregada com os campos de nome de usuário e senha.

Etapa 4 — O usuário se autentica.

O usuário informa nome de usuário e senha.

  • O usuário insere as credenciais na página de login do IdP.
  • Após autenticação bem-sucedida, o usuário é redirecionado de volta para o endpoint de autorização do IdP.

Exemplo de payload de uma requisição POST —

csrf=izvsVKMB-GxnSvAK6McnPw6uNcZVCqqWxjeU&challenge=cbcab3062ca041399178171a4078d30b&email=user%40name.com&password=complex&submit=Log+in

Etapa 5 — O usuário recebe o authorization code do IdP.

Authorization code concedido.

  • O endpoint de autorização do IdP redireciona o usuário de volta para a aplicação cliente com um authorization code.
  • Os valores originais do parâmetro state são preservados para manter uma relação 1:1 entre a requisição e o callback.

Etapa 6 — O usuário retorna ao ALB com o authorization code.

Usuário redirecionado de volta para /auth com o cookie de autenticação.

Logs de acesso do ALB para essa mesma transação —

h2 2024-07-11T18:48:27.805659Z app/demo/25be909a3f190764 109.78.96.82:54871 - -1 -1 -1 302 - 423 847 "GET https://demo.aws.doit.com:443/oauth2/idpresponse?code=ory_ac_9j6SCghDyFOexN03pTRP_GSJ5RHduhCLE-L74D2IlSs.zMsOhvXLbIrs0WQLtb43tkUnRZm0lWoI5T0IlNjnoO0&scope=openid&state=Y06EN0RLaODTpBbHGEpfK29AZJcLIpftyWwbyQN8EeiFyOtbN07H2nTXTGUa3DDYX5UgeMDsqP9psViZhPy41Y%2FVkNoJc5%2B6jb8po%2BLXQtcgxRgk9s5T0LgWt53mOEOjxL4nBVQ9Z9X1Sm%2BcZNO%2BFAIlh%2B6t99WKKj3vz1bekHiwdLWp18GUo9cp3eUkPWXbSBXprXOUHk2QlPK9xd7sG3AHyj4urRv3lc97AR4DRrVIECUMOsNP5BlYW6%2FGAg%3D%3D HTTP/2.0" "Root=1-669028fb-6e750f6c5c7fdde45853b7f6" "authenticate"
  • O usuário apresenta o authorization code ao ALB.
  • O ALB responde com um código HTTP 302 e redireciona o usuário de volta para a URI original: https://demo.aws.doit.com/auth.html.
  • Antes de gerar a resposta, o ALB faz requisições de backchannel para os seguintes endpoints:

Endpoint Token do IdP, para trocar o código por um IdToken.

Requisição POST para o endpoint Token.

Endpoint UserInfo, para trocar o access token pelas claims do usuário.

Requisição para o endpoint UserInfo.

As claims do usuário, o access token e o refresh token são codificados em base64 e criptografados dentro do cookie AWSELBAuthSessionCookie.

Etapa 7 — O usuário requisita a URI original com o AWSELBAuthSessionCookie definido.

O usuário é autenticado pelo ALB e a requisição chega ao backend.

Logs de acesso do ALB para essa mesma transação —

h2 2024-07-11T18:48:27.824183Z app/demo/25be909a3f190764 109.78.96.82:54871 172.31.11.119:80 0.007 0.001 0.000 200 200 596 3307 "GET https://demo.aws.doit.com:443/auth.html HTTP/2.0" "arn:aws:elasticloadbalancing:eu-west-1:211125377316:targetgroup/healthyTG/1a24c5faad770fb2 "Root=1-669028fb-156c503c2fe1fcdb60e4a5ad" 2024-07-11T18:48:27.815000Z "authenticate,forward" "172.31.11.119:80" "200"
  • As condições da regra do ALB para a ação "authenticate" são atendidas e o cookie de autenticação também está presente.
  • O ALB valida o cookie e encaminha as informações do usuário aos targets nos cabeçalhos HTTP X-AMZN-OIDC-*.

Cabeçalhos X-AMZN_OIDC* observados no target —

Cabeçalhos X-AMZN_OIDC*.

x-amzn-oidc-accesstoken - O access token vindo do endpoint Token.

x-amzn-oidc-identity - O campo subject (sub) vindo do endpoint UserInfo.

x-amzn-oidc-data - As claims do usuário, no formato JSON Web Token (JWT).

As claims do usuário no formato JWT incluem header, payload e assinatura, todos codificados em base64 URL. O ALB usa ES256 (ECDSA com P-256 e SHA256) para gerar a assinatura do JWT.

JWT decodificado —

O header do JWT é um objeto JSON que traz o issuer, os detalhes do signer e o key ID. O payload do JWT é um objeto JSON com as claims do usuário recebidas do endpoint UserInfo do IdP.

O target (Apache) autoriza o usuário com base nas claims e devolve uma resposta HTTP 200 OK ao usuário, passando pelo ALB.

Conclusão —

Este artigo traz um olhar aprofundado sobre como ocorrem as transações HTTP durante o fluxo de authorization code do OIDC ao usar o AWS Application Load Balancer (ALB). Detalhamos cada etapa, da requisição HTTP inicial do usuário até a autenticação e a autorização finais, destacando as principais interações HTTP e os detalhes de logging essenciais para diagnosticar e entender o processo.

Se quiser saber mais ou tiver interesse nos nossos serviços, fale com a gente. Você pode entrar em contato por aqui.