Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Integre um mecanismo OPA a um gateway de entrada

Última atualização: Jun 28, 2026

Para controle de acesso dinâmico, integre um mecanismo Open Policy Agent (OPA) ao gateway de entrada. Isso permite personalizar políticas de autorização com base em identidades de usuário ou no conteúdo da requisição e controlar a comunicação entre serviços em tempo real. Essa abordagem impede acessos não autorizados, reduz riscos de violação de dados e aumenta a segurança das aplicações em uma instância do Service Mesh (ASM). Este tópico descreve como usar um mecanismo OPA para autenticar e autorizar requisições recebidas por um gateway de entrada. Neste exemplo, as requisições passam pelo gateway de entrada para acessar a aplicação HTTPBin.

Pré-requisitos

Etapa 1: Implantar um mecanismo OPA

  1. Crie um arquivo chamado asm-opa.yaml com o seguinte conteúdo.

    Este manifesto YAML implanta um Service, um Deployment e um Secret do OPA.

    Tipo

    Descrição

    Deployment

    • No caminho da imagem registry-vpc.cn-hangzhou.aliyuncs.com/acs/opa:0.46.1-istio-3-static, substitua cn-hangzhou pelo ID da região do seu cluster.

    • Este mecanismo de execução do OPA ativa o log de decisões por padrão (--set=decision_logs.console=true) para simplificar a depuração.

    Secret

    O Secret define uma política do OPA com as seguintes regras:

    • Permitir requisições se o caminho for health.

    • Permitir requisições se o método for HEAD.

    • Permitir requisições se o nome de usuário for alice.

      Nota

      O nome de usuário é extraído do cabeçalho Authorization, que deve estar no formato Authorization: Basic ${base64_encoded_username:password}.

    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. Execute o comando a seguir para implantar o OPA.

    kubectl apply -f asm-opa.yaml

Etapa 2: Integrar o mecanismo OPA ao gateway de entrada usando o recurso de autorização externa

  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 ASM Gateways > Ingress Gateway.

  3. Na página Ingress Gateway, localize o gateway a ser integrado ao OPA e clique em Gateway Security.

  4. No painel de navegação à esquerda do gateway, escolha Gateway Security > External Authorization Service.

  5. Configure um serviço de autorização personalizado.

    1. No assistente Custom Authorization Service Configuration, configure o OPA como serviço de autorização personalizado do gateway e clique em Next.

      Ative a opção Enable Gateway Custom Authorization Service, selecione a aba Custom authorization service based on envoy.ext_authz (HTTP or gRPC), defina Protocol como GRPC, service address como asm-opa.default.svc.cluster.local, service port como 9191 e timeout como 10 segundos.

    2. No assistente Matching Rules, configure as regras de correspondência para especificar quais requisições exigem autorização do OPA e clique em Submit.

      Defina Matching Mode como Selected requests must be authorized, selecione Custom matching rules, ative HTTP Path (Path) e insira /status/*.

      Uma mensagem confirmará que o Gateway Custom Authorization Service was created successfully e listará os recursos nativos do Istio criados: um ASMExtensionProvider (nome do recurso: grpcextauth-asmsecuritypolicy-ingressgateway-extauthz) e uma AuthorizationPolicy (nome do recurso: ingressgateway-extauthz-ap-wg-gateway-istio-system-gateway-ingressgateway). Clique em View YAML para visualizar a configuração do recurso ou em Edit para modifique o serviço de autorização.

Etapa 3: Testar o acesso ao httpbin

  1. Execute o comando a seguir para acessar o caminho /.

    curl ${ASM_GATEWAY_IP}/ -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

    A saída indica que a requisição foi permitida porque este caminho não exige autenticação.

  2. Execute o comando a seguir para acessar o caminho /status/201 sem credenciais válidas.

    curl ${ASM_GATEWAY_IP}/status/201 -I -X GET

    Saída esperada:

    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

    A resposta 403 Forbidden indica que a requisição foi negada devido à ausência de credenciais.

  3. Execute o comando a seguir para acessar o caminho /status/201 com credenciais válidas do usuário alice.

    curl ${ASM_GATEWAY_IP}/status/201 -I -X GET --user alice:testpassword

    Saída esperada:

    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

    A resposta 201 Created confirma que a requisição foi permitida, pois o usuário alice tem autorização na política do OPA.

Etapa 4: Atualize a política do OPA

Atualize a política do OPA em tempo de execução chamando a API HTTP do mecanismo OPA.

  1. Execute o comando a seguir para atualize a política. A nova política permite acesso apenas ao usuário bob e nega acesso a alice.

    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. Execute o comando a seguir para testar o acesso como o usuário bob.

    curl ${ASM_GATEWAY_IP}/status/201 -I -X GET --user bob:testpassword

    Saída esperada:

    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

    A resposta 201 Created mostra que o usuário bob consegue acessar o caminho com sucesso.

  3. Execute o comando a seguir para testar o acesso como o usuário alice.

    curl ${ASM_GATEWAY_IP}/status/201 -I -X GET --user alice:testpassword  

    Saída esperada:

    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

    A resposta 403 Forbidden confirma que o acesso do usuário alice agora está negado, validando a atualização da política.