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:
Verificação baseada em cabeçalho: se a requisição contiver o cabeçalho
checkHeader, o serviço compara seu valor comallowedValue. Uma correspondência concede acesso.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:
Abra o console do ASM e acesse a página Define Custom Authorization Service.
Registre o serviço de autorização baseado em gRPC.
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
Implementar autorização personalizada usando o protocolo gRPC: configuração e instalação ponta a ponta.
Desenvolver um serviço de autorização personalizado baseado em HTTP: abordagem alternativa usando HTTP em vez de gRPC.