Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Use an ASM security policy to access an external OPA engine

Última atualização: Jul 02, 2026

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.

OPA deployment modes

Pré-requisitos

Antes de começar, verifique se você tem:

Etapa 1: Implantar o OPA

  1. Crie um arquivo chamado asm-opa.yaml com o conteúdo a seguir. Este manifesto cria três recursos:

    Nota

    O nome de usuário é extraído do cabeçalho Authorization no formato Authorization: Basic <Base64-encoded username:password>.

    Nota

    Substitua o ID da região cn-hangzhou no 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 é HEAD ou o nome de usuário é alice.

    Visualize o conteúdo de asm-opa.yaml

       apiVersion: v1
       kind: Service
       metadata:
         name: asm-opa
         labels:
           app: opa
       spec:
         ports:
           - name: grpc
             port: 9191
             targetPort: 9191
             protocol: TCP
           - name: http
             port: 8181
             targetPort: 8181
             protocol: TCP
         selector:
           app: opa
       ---
       kind: Deployment
       apiVersion: apps/v1
       metadata:
         name: opa
         labels:
           app: opa
       spec:
         replicas: 1
         selector:
           matchLabels:
             app: opa
         template:
           metadata:
             labels:
               app: opa
             annotations:
               sidecar.istio.io/inject: "false"
           spec:
             containers:
               - name: opa
                 image: registry-vpc.cn-hangzhou.aliyuncs.com/acs/opa:0.46.1-istio-3-static
                 securityContext:
                   runAsUser: 1111
                 volumeMounts:
                   - readOnly: true
                     mountPath: /policy
                     name: opa-policy
                 args:
                   - "run"
                   - "--server"
                   - "--addr=0.0.0.0:8181"
                   - "--diagnostic-addr=0.0.0.0:8282"
                   - "--set=plugins.envoy_ext_authz_grpc.addr=:9191"
                   - "--set=plugins.envoy_ext_authz_grpc.path=asm/authz/allow"
                   - "--set=decision_logs.console=true"
                   - "--ignore=.*"
                   - "/policy/policy.rego"
                 ports:
                   - containerPort: 9191
                     protocol: TCP
                 resources:
                   limits:
                     cpu: "0"
                     memory: "0"
             volumes:
               - name: opa-policy
                 secret:
                   secretName: opa-policy
       ---
       apiVersion: v1
       kind: Secret
       metadata:
         name: opa-policy
       type: Opaque
       stringData:
         policy.rego: |
           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 == "alice"
           }
    
           user_name := parsed if {
             [_, encoded] := split(http_request.headers.authorization, " ")
             [parsed, _] := split(base64url.decode(encoded), ":")
           }
  2. 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

  1. Faça login no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

  2. 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.

  3. Clique em Create. Na caixa de diálogo Create ASMSecurityPolicy, selecione o cartão Custom Authorization Service e clique em OK.

  4. 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:

    1. Na página CreateCustom Authorization Service, insira os detalhes do serviço OPA da Etapa 1 e clique em Next. Create custom authorization service

    2. 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.

    3. 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 add icon e clique em OK. Add workload

    4. 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. New workload group

    5. Na etapa Workload and Match Rules, clique em envie.

    ASM security policy created

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.

  1. Envie uma requisição para o caminho raiz / (sem autenticação obrigatória). Saída esperada: O status 200 OK confirma 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 GET
       HTTP/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
  2. Envie uma requisição para /status/201 sem credenciais. Saída esperada: O status 403 Forbidden confirma que requisições não autenticadas para /status/* são rejeitadas.

       curl <IP-address-of-ASM-gateway>/status/201 -I -X GET
       HTTP/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
  3. Envie uma requisição para /status/201 com credenciais válidas. Saída esperada: O status 201 Created confirma que a política OPA permite a requisição do usuário alice.

       curl <IP-address-of-ASM-gateway>/status/201 -I -X GET --user alice:testpassword
       HTTP/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.

  1. 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), ":")
       }'
  2. Verifique se o usuário bob agora tem permissão. Saída esperada:

       curl <IP-address-of-ASM-gateway>/status/201 -I -X GET --user bob:testpassword
       HTTP/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
  3. Verifique se o usuário alice agora está bloqueado. Saída esperada: O status 403 Forbidden confirma que o usuário alice nã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:testpassword
       HTTP/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