Service Mesh (ASM) prend en charge les services d'autorisation personnalisés basés sur les protocoles HTTP et gRPC. Un service d'autorisation basé sur gRPC reçoit un message gRPC CheckRequest d'Envoy, inspecte les attributs de la requête et renvoie une décision d'autorisation ou de refus. Ce guide vous explique comment implémenter un tel service et l'enregistrer auprès d'ASM.
Pour consulter l'architecture globale des services d'autorisation personnalisés, reportez-vous à la rubrique Développer un service d'autorisation personnalisé basé sur HTTP.
Contrairement à un service d'autorisation personnalisé basé sur HTTP, un service basé sur gRPC ne nécessite aucune configuration liée aux en-têtes. Tous les en-têtes de requête sont intégrés directement dans le message gRPC CheckRequest envoyé par Envoy.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Un cluster Container Service for Kubernetes (ACK) en cours d'exécution et connecté à ASM
Un environnement de développement Go configuré localement
Une connaissance de l'API d'autorisation externe d'Envoy
Implémenter le serveur d'autorisation
ASM est compatible avec Istio open source. Istio fournit une implémentation de référence qui couvre à la fois l'autorisation personnalisée HTTP et gRPC. La logique spécifique à gRPC réside dans la structure 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)
Cette structure implémente l'interface Envoy AuthorizationServer, qui requiert une seule méthode :
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)
}
Logique d'autorisation principale
La méthode Check extrait les attributs de la requête, les évalue et renvoie une réponse d'autorisation ou de refus :
// 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 décision suit deux voies possibles :
Vérification basée sur les en-têtes : si la requête contient l'en-tête
checkHeader, le service compare sa valeur àallowedValue. Une correspondance accorde l'accès.Solution de secours basée sur l'identité : si l'en-tête est absent, le service vérifie si l'identité source (
attrs.Source.Principal) se termine par/sa/<serviceAccount>. Cela autorise les requêtes provenant d'un compte de service Kubernetes spécifique.
Référence des champs CheckRequest
Pour obtenir la liste complète des champs dans authv3.CheckRequest, consultez les ressources suivantes :
Version de l'API
Envoy a déprécié les API v2. Implémentez uniquement l'API gRPC v3, comme indiqué dans la signature de la méthode Check ci-dessus.
Enregistrer et appliquer le service d'autorisation
Après avoir déployé le service d'autorisation dans votre cluster ACK :
Accédez à la console ASM et ouvrez la page Define Custom Authorization Service.
Enregistrez le service d'autorisation basé sur gRPC.
Créez une politique d'autorisation qui spécifie quel proxy du maillage utilise le service d'autorisation.
Pour obtenir des instructions détaillées, reportez-vous à la section Implémenter une autorisation personnalisée à l'aide du protocole gRPC.
Étapes suivantes
Implémenter une autorisation personnalisée à l'aide du protocole gRPC : configuration et mise en place de bout en bout.
Développer un service d'autorisation personnalisé basé sur HTTP : approche alternative utilisant HTTP au lieu de gRPC.