Para obter controle de acesso granular aos serviços no mesh, use o Open Policy Agent (OPA) e defina políticas Rego personalizadas que avaliem cada requisição. Por padrão, o Service Mesh (ASM) implanta o OPA como sidecar em cada pod da aplicação. No entanto, você pode executar o OPA como serviço independente (modo centralizado) para reduzir a sobrecarga de recursos e evitar reinicializações de pods. Este tópico descreve como implantar um mecanismo OPA centralizado e conectá-lo a uma política de segurança do ASM.
Modo sidecar versus modo centralizado
No modo sidecar, o ASM injeta um contêiner OPA em cada pod da aplicação. O proxy do Istio comunica-se com o OPA dentro do mesmo pod, o que mantém a latência baixa. Esse modo é ideal para serviços sensíveis à latência, mas apresenta algumas desvantagens:
Maior uso de recursos: Cada pod executa seu próprio contêiner OPA.
Necessidade de reiniciar pods: A injeção do OPA exige a reinicialização do pod da aplicação.
Roteamento menos flexível: Todas as requisições destinadas ao pod passam pela avaliação do OPA.
O modo centralizado resolve essas limitações ao implantar o OPA como serviço independente:
Menor consumo de recursos: Uma única instância do OPA atende a múltiplas cargas de trabalho.
Sem reinicialização de pods: Implante ou atualize o OPA sem interromper os pods da aplicação.
Aplicação seletiva: Aplique políticas do OPA apenas a caminhos de requisição específicos.

Pré-requisitos
Antes de começar, verifique se você tem:
Uma instância do ASM (v1.15.3.25 ou posterior) com um cluster Kubernetes gerenciado adicionado. Para mais informações, consulte Adicionar um cluster a uma instância do ASM e Atualizar uma instância do ASM.
A aplicação httpbin implantada e acessível. Para mais informações, consulte Implantar a aplicação httpbin.
Injeção automática de proxy sidecar ativada para o namespace
default. Para mais informações, consulte Ativar injeção automática de proxy sidecar.
Etapa 1: Implantar o OPA
-
Crie um arquivo chamado
asm-opa.yamlcom o conteúdo a seguir. Este manifesto cria três recursos:NotaO nome de usuário é extraído do cabeçalho
Authorizationno formatoAuthorization: Basic <Base64-encoded username:password>.NotaSubstitua o ID da região
cn-hangzhouno caminho da imagem pela região onde o cluster está implantado.Recurso
Descrição
Service
Expõe o OPA na porta 9191 (gRPC) e na porta 8181 (HTTP).
Deployment
Executa o contêiner OPA com o plugin gRPC de autorização externa do Envoy ativado. O log de decisões vem ativado por padrão (
--set=decision_logs.console=true) para auxiliar na depuração.Secret
Armazena uma política Rego que permite requisições correspondentes a qualquer uma destas condições: o caminho é
health, o método HTTP éHEADou o nome de usuário éalice. -
Conecte-se ao cluster Container Service for Kubernetes (ACK) e implante o OPA:
kubectl apply -f asm-opa.yaml
Etapa 2: Associar uma política de segurança do ASM ao OPA
Faça login no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Na página Mesh Management, clique em no nome da instância do ASM. No painel de navegação à esquerda, escolha Mesh Security Center > ASMSecurityPolicy.
Clique em Create. Na caixa de diálogo Create ASMSecurityPolicy, selecione o cartão Custom Authorization Service e clique em OK.
-
Configure o serviço de autorização personalizado. Após criar a política de segurança, o console exibe os detalhes da política:
Na página CreateCustom Authorization Service, insira os detalhes do serviço OPA da Etapa 1 e clique em Next.

Na etapa Workload and Match Rules, clique em Add Workload Group. Na caixa de diálogo New Workload Group, defina um Workload Group Name e clique em Add Workload.
Na caixa de diálogo Add Workload, selecione Workload Scope, defina Namespace como default e Workload Type como Service. Selecione httpbin na seção Select workloads, clique em no ícone
e clique em OK. 
Na seção Match Rule List da caixa de diálogo New Workload Group, defina Match Mode como The selected request must be authenticated e Matching Rules como Custom Matching Rules. Ative a chave Path, insira
/status/*e clique em OK.
Na etapa Workload and Match Rules, clique em envie.

Etapa 3: Verificar o controle de acesso
Substitua <IP-address-of-ASM-gateway> nos comandos a seguir pelo endereço IP real do gateway de entrada do ASM.
-
Envie uma requisição para o caminho raiz
/(sem autenticação obrigatória). Saída esperada: O status200 OKconfirma que o caminho raiz não exige autenticação, pois a regra de correspondência da política OPA visa apenas/status/*.curl <IP-address-of-ASM-gateway>/ -I -X GETHTTP/1.1 200 OK server: istio-envoy date: Tue, 25 Jul 2023 08:30:58 GMT content-type: text/html; charset=utf-8 content-length: 9593 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 2 -
Envie uma requisição para
/status/201sem credenciais. Saída esperada: O status403 Forbiddenconfirma que requisições não autenticadas para/status/*são rejeitadas.curl <IP-address-of-ASM-gateway>/status/201 -I -X GETHTTP/1.1 403 Forbidden date: Tue, 25 Jul 2023 08:31:18 GMT server: istio-envoy content-length: 0 x-envoy-upstream-service-time: 1 -
Envie uma requisição para
/status/201com credenciais válidas. Saída esperada: O status201 Createdconfirma que a política OPA permite a requisição do usuárioalice.curl <IP-address-of-ASM-gateway>/status/201 -I -X GET --user alice:testpasswordHTTP/1.1 201 Created server: istio-envoy date: Tue, 25 Jul 2023 08:31:38 GMT content-type: text/html; charset=utf-8 access-control-allow-origin: * access-control-allow-credentials: true content-length: 0 x-envoy-upstream-service-time: 3
Etapa 4: Atualizar a política OPA em tempo de execução
Use a API HTTP do OPA para atualizar políticas sem reimplementação. O exemplo a seguir altera o usuário permitido de alice para bob.
-
Envie a política atualizada pela API REST do OPA:
kubectl exec deployment/httpbin -c istio-proxy -- curl asm-opa:8181/v1/policies/policy/policy.rego -XPUT --data-binary 'package asm.authz import future.keywords import input.attributes.request.http as http_request import input.parsed_path default allow := false allow if { parsed_path[0] == "health" } allow if { http_request.method == "HEAD" } allow if { user_name == "bob" } user_name := parsed if { [_, encoded] := split(http_request.headers.authorization, " ") [parsed, _] := split(base64url.decode(encoded), ":") }' -
Verifique se o usuário
bobagora tem permissão. Saída esperada:curl <IP-address-of-ASM-gateway>/status/201 -I -X GET --user bob:testpasswordHTTP/1.1 201 Created server: istio-envoy date: Tue, 25 Jul 2023 08:32:16 GMT content-type: text/html; charset=utf-8 access-control-allow-origin: * access-control-allow-credentials: true content-length: 0 x-envoy-upstream-service-time: 3 -
Verifique se o usuário
aliceagora está bloqueado. Saída esperada: O status403 Forbiddenconfirma que o usuárioalicenão está mais autorizado após a atualização da política.curl <IP-address-of-ASM-gateway>/status/201 -I -X GET --user alice:testpasswordHTTP/1.1 403 Forbidden date: Tue, 25 Jul 2023 08:32:49 GMT server: istio-envoy content-length: 0 x-envoy-upstream-service-time: 1