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.
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.
-
Um pago Kubernetes Cluster
-
Atualmente, o IBM Cloud Kubernetes Service Managed Istio não suporta o cumprimento de política. Para usar o Adaptador, você deve usar o Istio instalado manualmente.
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.
-
Se você estiver trabalhando com o IBM Cloud Kubernetes Service, certifique-se de efetuar login e configurar o contexto para seu cluster.
-
Verifique se você ativou a aplicação da política Istio. Caso contrário, ligue-o.
-
Inclua o repositório.
helm repo add appidentityandaccessAdapter https://raw.githubusercontent.com/ibm-cloud-security/app-identity-and-access-Adapter/master/helm/appidentityandaccessAdapter -
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 degit clone git@github.com:ibm-cloud-security/app-identity-and-access-Adapter.gitantes 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:
- Defina uma configuração.
- 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
OidcConfigque 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 discoveryUrlstring True Um terminal conhecido que fornece um documento JSON de informações de configuração do OIDC/OAuth 2.0. clientIdstring True Um identificador para o cliente que é usado para autenticação. clientSecretstring *Não Um segredo de texto sem formatação que é usado para autenticar o cliente. Se não fornecido, um clientSecretRefdeverá existir.clientSecretRefobjeto Não Um segredo de referência que é usado para autenticar o cliente. A referência pode ser usada no lugar do clientSecret.clientSecretRef.namestring True O nome do Segredo do Kubernetes que contém o clientSecret.clientSecretRef.keystring 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
JwtConfigque 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>
| 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. |
| 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. |
| 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. |
| 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