Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Desenvolver um serviço de autorização personalizado baseado em gRPC

Última atualização: Jun 28, 2026

O Service Mesh (ASM) oferece suporte a serviços de autorização personalizados baseados nos protocolos HTTP e gRPC. Um serviço de autorização baseado em gRPC recebe uma mensagem CheckRequest do Envoy via gRPC, inspeciona os atributos da requisição e retorna uma decisão de permissão ou negação. Este tópico descreve como implementar esse serviço e registrá-lo no ASM.

Para obter a arquitetura geral dos serviços de autorização personalizados, consulte Desenvolver um serviço de autorização personalizado baseado em HTTP.

Ao contrário de um serviço de autorização personalizado baseado em HTTP, o serviço baseado em gRPC não possui configurações relacionadas a cabeçalhos. Todos os cabeçalhos de requisição são incorporados diretamente na mensagem CheckRequest do Envoy via gRPC.

Pré-requisitos

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

  • Um cluster do Container Service for Kubernetes (ACK) em execução e conectado ao ASM

  • Um ambiente de desenvolvimento Go configurado localmente

  • Familiaridade com a API de autorização externa do Envoy

Implementar o servidor de autorização

O ASM é compatível com o Istio open source. O Istio fornece uma implementação de referência que abrange tanto a autorização personalizada via HTTP quanto via gRPC. A lógica específica do gRPC reside na struct extAuthzServerV3:

type extAuthzServerV3 struct{}
func (s *extAuthzServerV3) Check(_ context.Context, request *authv3.CheckRequest) (*authv3.CheckResponse, error)
func (s *extAuthzServerV3) allow(request *authv3.CheckRequest) *authv3.CheckResponse
func (s *extAuthzServerV3) deny(request *authv3.CheckRequest) *authv3.CheckResponse
func (s *extAuthzServerV3) logRequest(allow string, request *authv3.CheckRequest)

Essa struct implementa a interface AuthorizationServer do Envoy, que exige um único método:

type AuthorizationServer interface {
    // Performs authorization check based on the attributes associated with the
    // incoming request, and returns status `OK` or not `OK`.
    Check(context.Context, *CheckRequest) (*CheckResponse, error)
}

Lógica principal de autorização

O método Check extrai os atributos da requisição, avalia-os e retorna uma resposta de permissão ou negação:

// Check implements gRPC v3 check request.
func (s *extAuthzServerV3) Check(_ context.Context, request *authv3.CheckRequest) (*authv3.CheckResponse, error) {
    attrs := request.GetAttributes()

    // Determine whether to allow or deny the request.
    allow := false
    checkHeaderValue, contains := attrs.GetRequest().GetHttp().GetHeaders()[checkHeader]
    if contains {
        allow = checkHeaderValue == allowedValue
    } else {
        allow = attrs.Source != nil && strings.HasSuffix(attrs.Source.Principal, "/sa/"+*serviceAccount)
    }

    if allow {
        return s.allow(request), nil
    }

    return s.deny(request), nil
}

A decisão segue dois caminhos:

  1. Verificação baseada em cabeçalho: se a requisição contiver o cabeçalho checkHeader, o serviço compara seu valor com allowedValue. Uma correspondência concede acesso.

  2. Fallback baseado em identidade: caso o cabeçalho esteja ausente, o serviço verifica se a identidade de origem (attrs.Source.Principal) termina com /sa/<serviceAccount>. Isso permite requisições provenientes de uma conta de serviço específica do Kubernetes.

Referência de campos do CheckRequest

Para obter a lista completa de campos em authv3.CheckRequest, consulte:

Versão da API

O Envoy descontinuou as APIs v2. Implemente apenas a API gRPC v3, conforme demonstrado na assinatura do método Check acima.

Registrar e aplicar o serviço de autorização

Após implantar o serviço de autorização no cluster ACK:

  1. Abra o console do ASM e acesse a página Define Custom Authorization Service.

  2. Registre o serviço de autorização baseado em gRPC.

  3. Crie uma política de autorização que especifique qual proxy do mesh utilizará o serviço de autorização.

Para obter etapas detalhadas, consulte Implementar autorização personalizada usando o protocolo gRPC.

Próximos passos