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:
Verificación basada en encabezados: si la solicitud contiene el encabezado
checkHeader, el servicio compara su valor conallowedValue. Una coincidencia otorga el acceso.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:
Abra la consola de ASM y vaya a la página Define Custom Authorization Service.
Registre el servicio de autorización basado en gRPC.
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
Implementar autorización personalizada mediante el protocolo gRPC: configuración e implementación integral de extremo a extremo.
Desarrollar un servicio de autorización personalizado basado en HTTP: enfoque alternativo que utiliza HTTP en lugar de gRPC.