Este tópico descreve como usar uma instância auto-hospedada do Keycloak como provedor de identidade (IdP) para ativar o single sign-on nas aplicações da sua service mesh. Ao configurar um Custom Authorization Service no ASM, você pode usar o protocolo OIDC para delegar autenticação e autorização ao Keycloak. Isso elimina a necessidade de cada aplicação implementar sua própria lógica de segurança. Após a autorização bem-sucedida, as solicitações são encaminhadas à aplicação com as informações do usuário provenientes do Keycloak.
Pré-requisitos
Instância do ASM criada. Para mais informações, consulte Criar uma instância do ASM.
Cluster gerenciado ACK criado. Para mais informações, consulte Criar um cluster gerenciado ACK.
Injeção automática de sidecar ativada para o namespace
default. Para mais informações, consulte Ativar injeção automática de sidecar.
Conceitos
|
Conceito |
Descrição |
|
IdP |
O provedor de identidade (IdP) é um serviço que cria, mantém e gerencia identidades de usuários, além de fornecer serviços de autenticação. Por exemplo, ao usar uma conta Google para entrar em uma aplicação de terceiros, o Google atua como IdP. |
|
OIDC |
OpenID Connect (OIDC) é um protocolo de autenticação construído sobre o framework OAuth 2.0. Para mais informações, consulte OpenID Connect. |
|
Scope |
No OIDC, os scopes definem quais atributos do usuário (como e-mail e dados de perfil) a aplicação pode acessar. Durante a autenticação, o IdP pode solicitar que o usuário conceda permissão para a aplicação acessar scopes específicos de seus dados. |
Procedimento
Etapa 1: Implantar a aplicação de demonstração e o Keycloak
-
Use o manifesto YAML abaixo para implantar a aplicação httpbin no namespace
defaultdo cluster gerenciado ACK. Execute o comandokubectl apply -n default -f xxx.yaml. -
Use o manifesto YAML abaixo para implantar a aplicação Keycloak no namespace
defaultdo cluster gerenciado ACK. Execute o comandokubectl apply -n default -f xxx.yaml.
Etapa 2: Expor a aplicação e o Keycloak via gateway
Neste exemplo, você acessa a aplicação de demonstração via HTTPS (porta 443) e o console do Keycloak via HTTP (porta 80).
Crie um certificado para o serviço HTTPS com o nome
myexample-credential. Para mais informações, consulte Habilitar serviços HTTPS seguros usando um ASM Ingress Gateway.-
Use o YAML abaixo para criar um Gateway e um VirtualService no cluster ASM e expor o Keycloak à rede pública.
-
No console do ASM, configure o Gateway para a instância correspondente. Para mais informações, consulte Gerenciar regras de gateway.
-
Aplique o VirtualService abaixo na instância do ASM. Para mais informações, consulte Gerenciar virtual services.
-
No navegador, acesse http://${ASM_INGRESS_GATEWAY_ADDRESS} para abrir a aplicação Keycloak.
Clique em Administration Console e faça login com as credenciais de administrador definidas durante a implantação do Keycloak.
Etapa 3: Configurar o Keycloak
No painel de navegação à esquerda do Keycloak, selecione Master na lista suspensa e clique em Create Realm.
Na página de configuração do novo realm, crie um cliente. Na aba General Settings, defina Client type como OpenID Connect e Client ID como oauth2proxy. Na aba Capability config, ative Client authentication, desative Authorization e, em Authentication flow, marque apenas as caixas Standard flow e Direct access grants.
Crie um usuário no realm. Defina Username como asm-test e ative Email verified. Em seguida, clique em Save.
Na página User details, clique na aba Credentials.
Defina uma senha para o usuário. Mude Temporary para Off e clique em Save.
Crie uma função de realm. Defina Role name como test-role e clique em Save.
Na página User details, selecione a aba Role mapping.
Na página Role mapping, clique em Assign role. Atribua a função
test-roleao usuário.Crie um client scope. Defina Name como test_scope e Protocol como OpenID Connect. Ative Display on consent screen e Include in token scope. Depois, clique em Save.
Na página Client Scope, clique na aba Mappers e adicione um mapper. Defina Mapper type como Audience e Name como test-mapper. Em Included Client Audience, selecione oauth2proxy e ative Add to access token. Por fim, clique em Save.
Clique na aba Scope, marque a caixa ao lado da função
test-rolee clique em Assign.Na página de configurações do cliente, clique na aba Client scopes e adicione o client scope
test_scopecomo escopo padrão.Adicione as Valid redirect URIs para o oauth2-proxy do cluster. Na aba Settings, na seção Access settings, insira
https://${ASM ingress gateway address}/oauth2/callbackno campo Valid redirect URIs e clique em Save.
Neste exemplo, apenas o serviço Keycloak usa o protocolo HTTP; todos os demais usam HTTPS. Portanto, o formato da redirect URI é https://${ASM_INGRESS_GATEWAY_ADDRESS}/oauth2/callback.
Configuração do Keycloak concluída. Anote as seguintes informações:
ID do novo realm: Test-oidc.
Client ID criado no realm: oauth2proxy.
client secret encontrada na subaba Credentials das configurações do cliente.
Etapa 4: Habilitar autorização personalizada e SSO OIDC
Faça login no console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique no nome da instância do ASM. No painel de navegação à esquerda, escolha .
-
Na página External Authorization Service, clique em Register External Authorization Service e selecione OIDC Authz and Authn Service. Configure os parâmetros do Serviço de Autenticação e Autorização de Identidade OIDC e clique em Create.
No painel Associate Custom Authorization Service, selecione OIDC Identity Authentication and Authorization Service como tipo e configure os parâmetros.
Insira as informações do cliente OIDC criado no Keycloak. Você pode usar o ASM ingress gateway como redirect URI para login. Para mais detalhes sobre o cookie secret, consulte Generating a Cookie Secret.
IdP OIDC Issuer URL: http://${ASM_INGRESS_GATEWAY_ADDRESS}/realms/${REALM_NAME_IN_KEYCLOAK}.
ClientID e Client Secret: Use os valores anotados na etapa anterior.
Scopes:
OpenIDé um escopo obrigatório. Você pode especificar outros scopes conforme necessário.
-
Crie um VirtualService com o YAML abaixo.
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: oauth2-vs namespace: istio-system spec: gateways: - ingressgateway hosts: - '*' http: - match: - uri: prefix: /oauth2 name: oauth2 route: - destination: host: asm-oauth2proxy-httpextauth-oidc.istio-system.svc.cluster.local port: number: 4180NotaSubstitua o valor do campo
hostna seçãoroutepelo nome do serviço oauth2-proxy no namespaceistio-systemdo seu cluster ACK.Para evitar conflitos de VirtualService, não configure outros VirtualServices com caminhos que tenham o prefixo /oauth2.
Etapa 5: Criar uma política de autorização
Na página Mesh Management, clique no nome da instância do ASM. No painel de navegação à esquerda, escolha .
Na página AuthorizationPolicy, clique em Create from YAML.
-
Na página Create, selecione um Namespaces e um Scenario Template, configure o manifesto YAML abaixo e clique em Create.
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: oidc namespace: istio-system spec: action: CUSTOM provider: name: httpextauth-oidc rules: - to: - operation: notPorts: - '80' selector: matchLabels: istio: ingressgatewayNotaEsta AuthorizationPolicy determina que todas as solicitações para portas diferentes da porta 80 exigem autorização.
Em
provider.name, informe o nome do serviço de autorização personalizada associado. Você encontra esse nome na lista da página Custom Authorization Service.
Etapa 6: Verificar a integração
-
No navegador, acesse http://${ASM_INGRESS_GATEWAY_ADDRESS}:80.
Resultado esperado: A página de login do OAuth2 Proxy é exibida com o botão Sign in with OpenID Connect, indicando que o single sign-on está ativo.
-
Clique em Sign in with OpenID Connect. Na página de login do Keycloak, insira as credenciais do usuário de teste criado na Etapa 3 e clique em Log In.
Resultado esperado: Após o login, a página httpbin.org aparece, mostrando categorias de API como HTTP Methods, Auth, Status codes e Request Inspection.
-
Clique em Request inspection e selecione .
Resultado esperado: Na seção Server response, o corpo da resposta contém as informações do cabeçalho da solicitação, incluindo o campo Authorization: Bearer {JWT}. Isso confirma que a solicitação carrega o token JWT emitido pelo Keycloak.
-
Decodifique o token JWT da etapa anterior (a string após
Bearer) usando um depurador de JWT. Para mais informações sobre depuradores de JWT, consulte JWT debugger.Resultado esperado: Após a decodificação bem-sucedida, o token revela que o algoritmo no HEADER é RS256 e o PAYLOAD contém claims como realm_access (informações de função), preferred_username (nome de usuário) e client_id (oauth2proxy). Isso confirma que o ASM verificou o JWT e que ele inclui as informações do usuário armazenadas no Keycloak.