Apps multinuvem com o Istio

Ao usar a Identidade do aplicativo e o Adaptador de acesso, será possível centralizar todo o seu gerenciamento de identidade em um único lugar.

O App Identity and Access Adapter não é suportado no momento.

Como as empresas usam nuvem de diversos provedores ou uma combinação de soluções dentro e fora do local, modelos de implementação heterogêneos podem ajudar a preservar a infraestrutura existente e evitar bloqueio de fornecedor. O Adaptador pode ser configurado para trabalhar com qualquer provedor de identidade compatível com OIDC, como o App ID. O serviço permite que o Adaptador controle as políticas de autenticação e autorização em todos os ambientes, incluindo os aplicativos front-end e back-end. E ele faz tudo isso sem nenhuma mudança em seu código ou a necessidade de reimplementar seu aplicativo.

Arquitetura multinuvem

Um ambiente de computação multicloud combina diversos ambientes de computação em nuvem e/ou privada em uma única arquitetura de rede. Distribuindo cargas de trabalho em vários ambientes, você pode localizar resiliência, flexibilidade e maior eficiência de custo melhoradas. Para alcançar os benefícios, é comum usar um aplicativo baseado em contêiner com uma camada de orquestração, como o Kubernetes.

de arquitetura do App Identity and Access Adapter*Implantação em várias nuvens - obtida com o App Identity and Access

Entendendo o Istio e o Adapter

O Istio é uma malha de serviços de software livre que cria camadas de forma transparente nos aplicativos distribuídos existentes que podem se integrar ao Kubernetes. Para reduzir a complexidade das implementações, o Istio fornece insights comportamentais e controle operacional sobre a malha de serviço como um todo. Quando o App ID é combinado com o Istio, ele se torna uma solução de identidade escalável e integrada para arquiteturas multinuvem que não requer nenhuma mudança de código do aplicativo customizado. Para obter mais informações, consulte O que é Istio.

O Istio usa um sidecar de proxy do Envoy para mediar todo o tráfego de entrada e saída para todos os serviços na malha de serviços. Ao usar o proxy, o Istio extrai informações sobre tráfego, também conhecido como telemetria, que são enviadas para o componente do Istio chamado Mixer para cumprimento das decisões de política. O App Identity and Access Adapter amplia a funcionalidade do Mixer, analisando a telemetria (atributos) com relação às políticas customizadas a fim de controlar o gerenciamento de identidade e acesso dentro e através da malha de serviços. As políticas de gerenciamento de acesso são vinculadas a serviços Kubernetes e podem ser ajustadas adequadamente a terminais em serviço específicos. Para obter mais informações sobre políticas e telemetria, consulte a documentação do site Istio.

No momento, devido a uma limitação do Istio, o App Identity and Access Adapter armazena informações de sessão do usuário internamente e não as persiste em réplicas ou por meio de configurações de failover. Ao utilizar o Adapter, limite suas cargas de trabalho a uma única réplica até que a limitação seja resolvida.

Protegendo apps front-end

Se você estiver usando um aplicativo baseado em navegador, poderá usar o fluxo Open ID Connect(OIDC) / OAuth 2.0 authorization_grant para autenticar seus usuários. Quando um usuário não autenticado é detectado, ele é redirecionado automaticamente para a página de autenticação. Após a conclusão da autenticação, o navegador é redirecionado para um terminal /oidc/callback implícito no qual o Adapter intercepta a solicitação. Em seguida, o Adapter obtém os tokens do provedor de identidade e redireciona o usuário novamente para a URL originalmente solicitada.

Para visualizar as informações de sessão do usuário, incluindo os tokens de sessão, é possível consultar o cabeçalho Authorization.

Authorization: Bearer <accessToken> <IDToken>

Também é possível efetuar logout de usuários autenticados. Quando um usuário autenticado acessa qualquer terminal protegido com oidc/logout anexado, conforme mostrado no exemplo a seguir, ele é desconectado.

https://myhost/path/oidc/logout

Se necessário, um token de atualização pode ser usado para adquirir automaticamente novos tokens de acesso e identidade sem que o usuário precise se autenticar novamente. Se o provedor de identidade configurado retornar um token de atualização, ele será persistido na sessão e usado para recuperar novos tokens quando o token de identidade expirar.

Protegendo apps back-end

O adaptador pode ser usado em colaboração com o OAuth 2.0 Fluxo do portador JWT para proteger APIs de serviço validando tokens de portador JWT. O fluxo de autorização do Bearer espera que uma solicitação contenha um Cabeçalho de autorização com um token de acesso válido e um token de identidade opcional. A estrutura do cabeçalho esperada é Authorization=Bearer {access_token} [{id_token}]. Os clientes não autenticados recebem de retorno um status de resposta HTTP 401 com uma lista dos escopos que são necessários para obter autorização. Se os tokens forem inválidos ou expirados, a estratégia de API retornará uma resposta HTTP 401 com um componente de erro opcional que dirá Www-Authenticate=Bearer scope="{scope}" error="{error}".

Para obter mais informações sobre tokens e como eles são usados, consulte Entendendo tokens.

Antes de Iniciar

Antes de iniciar, assegure-se de que tenha instalado os pré-requisitos a seguir.

Instalando o Adapter

Para instalar o gráfico, inicialize o Helm no seu cluster, defina as opções que deseja usar e, em seguida, execute o comando de instalação.

  1. Se você estiver trabalhando com o IBM Cloud Kubernetes Service, certifique-se de efetuar login e configurar o contexto para seu cluster.

  2. Verifique se você ativou a aplicação da política Istio. Caso contrário, ligue-o.

  3. Inclua o repositório.

    helm repo add appidentityandaccessAdapter https://raw.githubusercontent.com/ibm-cloud-security/app-identity-and-access-Adapter/master/helm/appidentityandaccessAdapter
    
  4. Instale o gráfico.

    helm install --name appidentityandaccessAdapter appidentityandaccessAdapter/appidentityandaccessAdapter
    

    É possível especificar uma tag de imagem durante a instalação configurando a sinalização image.tag. Por exemplo, --set image.tag=0.5.0. Também é possível instalar o gráfico localmente. Para isso, clone o repositório por meio da execução de git clone git@github.com:ibm-cloud-security/app-identity-and-access-Adapter.git antes de executar o comando de instalação.

Aplicando uma política de autorização e autenticação

Uma política de autenticação ou autorização é um conjunto de condições que deve ser atendido antes de uma solicitação poder acessar um acesso de recurso. Ao definir uma configuração de serviço do provedor de identidade e uma política que descreve quando um determinado fluxo deve ser usado, será possível controlar o acesso a qualquer recurso em sua malha de serviço. Para ver exemplos de CRDs, consulte o diretório de amostras.

Para criar uma política:

  1. Defina uma configuração.
  2. Registre o terminal.

Definindo uma configuração

Dependendo se você estiver protegendo aplicativos front-end ou back-end, crie uma configuração de política com uma das opções a seguir.

  • Para aplicativos front-end: os aplicativos baseados em navegador que requerem autenticação do usuário podem ser configurados para usar o fluxo de autenticação OIDC/OAuth 2.0. Para definir um CRD OidcConfig que contenha o cliente usado para facilitar o fluxo de autenticação com o Provedor de identidade, use o exemplo a seguir como um guia.

    apiVersion: "security.cloud.ibm.com/v1"
    kind: OidcConfig
    metadata:
       name:      oidc-provider-config
       namespace: sample-namespace
    spec:
       discoveryUrl: https://us-south.appid.cloud.ibm.com/oauth/v4/<tenantID>/.well-known/openid-configuration
       clientId:     <clientID>
       clientSecret: <randomlyGeneratedClientSecret>
       clientSecretRef:
             name: <nameOfKubeSecret>
             key: <keyInKubeSecret>
    
    Explicação dos componentes do arquivo de configuração YAML
    Campo Tipo Obrigatório Descrição
    discoveryUrl string True Um terminal conhecido que fornece um documento JSON de informações de configuração do OIDC/OAuth 2.0.
    clientId string True Um identificador para o cliente que é usado para autenticação.
    clientSecret string *Não Um segredo de texto sem formatação que é usado para autenticar o cliente. Se não fornecido, um clientSecretRef deverá existir.
    clientSecretRef objeto Não Um segredo de referência que é usado para autenticar o cliente. A referência pode ser usada no lugar do clientSecret.
    clientSecretRef.name string True O nome do Segredo do Kubernetes que contém o clientSecret.
    clientSecretRef.key string True O campo dentro do Segredo do Kubernetes que contém o clientSecret.
  • Para aplicativos de back-end: A especificação de token de portador OAuth 2.0 define um padrão para proteger APIs usando JSON Web Tokens(JWTs). Usando a configuração a seguir como um exemplo, defina um CRD JwtConfig que contenha o recurso de chave pública, que é usado para validar assinaturas de token.

    apiVersion: "security.cloud.ibm.com/v1"
    kind: JwtConfig
    metadata:
       name:      jwt-config
       namespace: sample-app
    spec:
       jwksUrl: https://us-south.appid.cloud.ibm.com/oauth/v4/<tenantID>/publickeys
    

Registrando terminais do aplicativo

Registre os terminais do aplicativo dentro de um CRD Policy para validar solicitações recebidas e cumprir regras de autenticação. Cada Policy se aplica exclusivamente ao namespace do Kubernetes no qual o objeto vive e pode especificar os serviços, caminhos e métodos que deseja proteger.

apiVersion: "security.cloud.ibm.com/v1"
kind: Policy
metadata:
  name:      samplepolicy
  namespace: sample-app
spec:
  targets:
    -
      serviceName: <svcSampleApp>
      paths:
        - exact: /web/home
          method: ALL
          policies:
            - policyType: oidc
              config: <oidcProviderConfig>
              rules:
                - claim: scope
                  match: ALL
                  source: access_token
                  values:
                    - appid_default
                    - openid
                - claim: amr
                  match: ANY
                  source: id_token
                  values:
                    - cloud_directory
                    - google

        - exact: /web/user
          method: GET
          policies:
            - policyType: oidc
              config: <oidcProviderConfig>
              redirectUri: https://github.com/ibm-cloud-security/app-identity-and-access-Adapter
        - prefix: /
          method: ALL
          policies:
            -
              policyType: jwt
              config: <jwtConfig>
Compreensão dos componentes do objeto de serviço
Objeto de serviço Tipo Obrigatório Descrição
serviceName string True O nome do serviço Kubernetes no namespace de Política que deseja proteger.
paths array[Path Object] True Uma lista de objetos de caminho que define os terminais que deseja proteger. Se não especificado, todos os caminhos serão protegidos.
Compreensão dos componentes do objeto de caminho
Objeto de caminho Tipo Obrigatório Descrição
exact or prefix string True O caminho no qual você deseja aplicar as políticas. As opções incluem exact e prefix. O exact corresponde aos terminais fornecidos exatamente com o último / aparado. O prefix corresponde aos terminais que começam com o prefixo de rota que você fornece.
method enum Não O método de HTTP protegido. Opções válidas ALL, GET, PUT, POST, DELETE, PATCH - Padronizado para ALL:
policies array[Policy] Não As políticas de OIDC/JWT que você deseja aplicar.
Compreensão dos componentes do objeto de política
Objeto de política Tipo Obrigatório Descrição
policyType enum True O tipo de política de OIDC. As opções incluem: jwt ou oidc.
config string True O nome da configuração do provedor que você deseja usar.
redirectUri string Não A URL para a qual você deseja que o usuário seja redirecionado após a autenticação bem-sucedida: a URL de solicitação original.
rules array[Rule] Não O conjunto de regras que você deseja usar para validação de token.
Compreensão dos componentes do objeto de política
Objeto de regra Tipo Obrigatório Descrição
claim string True A solicitação que você deseja validar.
match enum Não Os critérios necessários para validação de solicitação. As opções incluem: ALL, ANY ou NOT. O padrão é configurado para ALL.
source enum Não O token em que você deseja aplicar a regra. As opções incluem: access_token ou id_token. O padrão é configurado para access_token.
values array[string] True O conjunto de valores necessário para validação.

Excluindo o Adapter

Para remover o Adaptador e todos os CRDs associados, você deve excluir o gráfico de Helm e as chaves de assinatura e criptografia associadas.

helm delete --purge appidentityandaccessAdapter
kubectl delete secret appidentityandaccessAdapter-keys -n istio-system

Configurando a criação de log

Por padrão, os logs são estilizados como JSON e fornecidos em um nível de visibilidade info para fornecer a facilidade de integração com sistemas de criação de log externos. Para atualizar a configuração de criação de log, é possível usar o gráfico do Helm. Os níveis de criação de log suportados incluem a faixa [-1, 7] como mostrado no núcleo Zap. Para obter mais informações sobre os níveis, consulte a documentação principal do Zap.

Adaptador

Para ver os logs do Adapter, é possível usar kubectl ou acessar o pod appidentityandaccessAdapter por meio do console do Kubernetes.

alias Adapter_logs="kubectl -n istio-system logs -f $(kubectl -n istio-system get pods -lapp=appidentityandaccessAdapter -o jsonpath='{.items[0].metadata.name}')"
Adapter_logs | jq

Mixer

Se o Adaptador não parecer receber as solicitações, verifique os logs do Mixer para assegurar que ele tenha se conectado com sucesso ao Adaptador.

alias mixer_logs="kubectl -n istio-system logs -f $(kubectl -n istio-system get pods -lapp=telemetry -o jsonpath='{.items[0].metadata.name}') -c mixer"
mixer_logs | jq