Todos los productos
Search
Centro de documentos

Alibaba Cloud Service Mesh:Desarrollar un servicio de autorización personalizado basado en gRPC

Última actualización: Sep 21, 2026

Service Mesh (ASM) admite servicios de autorización personalizados basados en los protocolos HTTP y gRPC. Un servicio de autorización basado en gRPC recibe un mensaje gRPC CheckRequest de Envoy, inspecciona los atributos de la solicitud y devuelve una decisión de permiso o denegación. Esta guía le muestra cómo implementar dicho servicio y registrarlo en ASM.

Para conocer la arquitectura general de los servicios de autorización personalizados, consulte Desarrollar un servicio de autorización personalizado basado en HTTP.

A diferencia de un servicio de autorización personalizado basado en HTTP, un servicio basado en gRPC no tiene configuraciones relacionadas con encabezados. Todos los encabezados de la solicitud se integran directamente en el mensaje gRPC CheckRequest proveniente de Envoy.

Requisitos previos

Antes de empezar, asegúrese de contar con lo siguiente:

  • Un clúster de Container Service for Kubernetes (ACK) en ejecución y conectado a ASM

  • Un entorno de desarrollo de Go configurado de manera local

  • Conocimientos sobre la API de autorización externa de Envoy

Implementar el servidor de autorización

ASM es compatible con Istio de código abierto. Istio proporciona una implementación de referencia que abarca la autorización personalizada tanto por HTTP como por gRPC. La lógica específica de gRPC reside en la estructura 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)

Esta estructura implementa la interfaz AuthorizationServer de Envoy, la cual requiere un ú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 autorización

El método Check extrae los atributos de la solicitud, los evalúa y devuelve una respuesta de permiso o denegación:

// 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
}

La decisión sigue dos rutas:

  1. Verificación basada en encabezados: si la solicitud contiene el encabezado checkHeader, el servicio compara su valor con allowedValue. Una coincidencia otorga el acceso.

  2. Alternativa basada en identidad: si el encabezado está ausente, el servicio comprueba si la identidad de origen (attrs.Source.Principal) termina con /sa/<serviceAccount>. Esto permite las solicitudes provenientes de una cuenta de servicio específica de Kubernetes.

Referencia de campos de CheckRequest

Para consultar la lista completa de campos de authv3.CheckRequest, revise los siguientes recursos:

Versión de la API

Envoy dejó obsoletas las API de la versión 2. Implemente únicamente la API gRPC v3, tal como se muestra en la firma del método Check anterior.

Registrar y aplicar el servicio de autorización

Una vez que despliegue el servicio de autorización en su clúster de ACK, siga estos pasos:

  1. Abra la consola de ASM y vaya a la página Define Custom Authorization Service.

  2. Registre el servicio de autorización basado en gRPC.

  3. Cree una política de autorización que especifique qué proxy de la malla de servicios utiliza el servicio de autorización.

Para conocer los pasos detallados, consulte Implementar autorización personalizada mediante el protocolo gRPC.

Pasos siguientes