O Service Mesh (ASM) oferece suporte à autorização externa, que delega decisões de controle de acesso a um serviço gRPC personalizado implantado e gerenciado por você. Esse recurso é útil quando as políticas de autorização integradas não atendem aos seus requisitos — por exemplo, na integração com um sistema de autenticação interno ou na aplicação de regras específicas de negócio.
Este tutorial implanta um serviço de autorização gRPC de exemplo, registra-o no ASM, cria uma política de autorização e verifica o fluxo de ponta a ponta. O serviço de exemplo permite solicitações que incluem o cabeçalho x-ext-authz: allow e nega todas as outras.
Como funciona
Ao ativar a autorização externa no ASM, o fluxo da solicitação ocorre da seguinte maneira:
Um cliente envia uma solicitação para um serviço de destino (por exemplo, httpbin).
O proxy sidecar intercepta a solicitação e envia uma verificação de autorização para o seu serviço gRPC externo.
O serviço externo avalia a solicitação e retorna uma decisão de permissão ou negação.
Se permitida, a solicitação segue para o serviço de destino. Se negada, o proxy retorna um erro imediatamente ao cliente.
As verificações de autorização são acionadas apenas para solicitações que correspondem às regras definidas na sua política de autorização. Solicitações para caminhos ou serviços não cobertos pela política passam diretamente, sem verificação externa.
Pré-requisitos
Antes de começar, certifique-se de ter:
Um cluster do Container Service for Kubernetes (ACK) adicionado à sua instância do ASM. Para mais informações, consulte Adicionar um cluster a uma instância do ASM.
kubectl configurado para se conectar ao seu cluster ACK. Para mais informações, consulte Obter o arquivo kubeconfig de um cluster e usar kubectl para se conectar ao cluster.
Etapa 1: Implantar o serviço de autorização externa
Implante um serviço de autorização baseado em gRPC no seu cluster ACK. Este serviço implementa a API ext_authz do Envoy e gerencia as verificações de autorização para solicitações recebidas.
O serviço de exemplo usado aqui permite solicitações que contêm o cabeçalho x-ext-authz: allow e nega todo o restante. Use este exemplo como está ou personalize-o conforme sua própria lógica. O código-fonte está disponível no GitHub.
-
Crie um arquivo chamado ext-authz.yaml com o seguinte conteúdo:
O Service expõe duas portas: HTTP na porta 8000 e gRPC na porta 9000. Este tutorial utiliza a porta gRPC (9000).
-
Implante o serviço:
kubectl apply -f ext-authz.yamlSaída esperada:
service/ext-authz created deployment.apps/ext-authz created -
Verifique se o serviço está em execução:
kubectl logs "$(kubectl get pod -l app=ext-authz -n default -o jsonpath={.items..metadata.name})" -n default -c ext-authzSaída esperada:
2023/12/20 08:15:39 Starting gRPC server at [::]:9000 2023/12/20 08:15:39 Starting HTTP server at [::]:8000Os servidores gRPC e HTTP devem estar em execução. Se nenhuma saída aparecer, aguarde alguns segundos para o pod iniciar e tente novamente.
-
Confirme a porta gRPC do serviço ext-authz:
Faça login no console do ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, localize o cluster e clique no nome dele. No painel à esquerda, escolha Network > Services.
Na página Services, clique em ext-authz.
A seção Endpoint exibe a porta gRPC. Neste exemplo, a porta é 9000.
Etapa 2: Implantar aplicativos de exemplo
Implante os aplicativos httpbin e sleep. O httpbin atua como o serviço de destino que recebe solicitações, enquanto o sleep funciona como o cliente que as envia.
-
Crie um arquivo chamado httpbin.yaml com o seguinte conteúdo:
-
Implante o httpbin:
kubectl apply -f httpbin.yaml -
Crie um arquivo chamado sleep.yaml com o seguinte conteúdo:
-
Implante o sleep:
kubectl apply -f sleep.yaml
Etapa 3: Registrar o serviço de autorização externa no ASM
Registre o serviço ext-authz implantado na Etapa 1 como um provedor de autorização personalizado na sua instância do ASM. Isso informa ao plano de controle do mesh para onde rotear as verificações de autorização.
Faça login no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Na página Mesh Management, clique no nome da sua instância do ASM. No painel de navegação à esquerda, escolha Mesh Security Center > Custom Authorization Service. Clique em Define Custom Authorization Service.
-
Na página Register Custom Authorization Service, clique na aba Custom authorization service (HTTP or gRPC protocol) implemented based on envoy.ext_authz. Configure os seguintes parâmetros e clique em Create.
Parâmetros obrigatórios
Parâmetro
Descrição
Valor de exemplo
Protocol
Protocolo utilizado pelo serviço de autorização.
GRPC
Name
Nome para este registro de serviço de autorização.
testService Address
Endpoint do serviço no formato
<Nome do Serviço>.<Namespace>.svc.<Domínio do Cluster>.ext-authz.default.svc.cluster.localPort(1 - 65535)
Porta gRPC do serviço de autorização.
9000Timeout(second)
Tempo máximo de espera por uma resposta de autorização. Se o serviço não responder dentro desse período, a solicitação será tratada como não autorizada (a menos que você ative a opção de ignorar abaixo).
10Parâmetros opcionais
Parâmetro
Descrição
Skip authentication while authorization service is unavailable
Quando ativado, as solicitações são permitidas se o serviço de autorização estiver inacessível. Quando desativado, as solicitações são negadas.
Error code returned by asm proxy while Auth-Service is not available
Código de erro HTTP personalizado retornado aos chamadores quando o serviço de autorização está indisponível. Disponível apenas quando Skip authentication while authorization service is unavailable está desativado.
Carry origin request body within auth request
Quando ativado, o corpo da solicitação original é encaminhado ao serviço de autorização. Defina um comprimento máximo de corpo. Se Allow send incomplete message to Auth-Service também estiver ativado, corpos que excederem o comprimento máximo serão truncados em vez de rejeitados.
Etapa 4: Criar uma política de autorização
Crie uma política de autorização para definir quais solicitações exigem uma verificação de autorização externa.
Faça login no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Na página Mesh Management, clique no nome da sua instância do ASM. No painel de navegação à esquerda, escolha Mesh Security Center > AuthorizationPolicy. Clique em Create.
-
Na página Create, configure os seguintes parâmetros e clique em Create.
Parâmetro
Descrição
Valor de exemplo
Name
Nome da política de autorização.
test1Policy Type
Tipo da política de autorização.
Custom Authorization Service
Custom Authorization Service
Serviço de autorização externa a ser utilizado.
grpcextauth-test(GRPC)
Namespace
Namespace onde a política se aplica. Definido na aba Workload Scope.
defaultEffective Scope
Indica se a política se aplica a um serviço específico ou a todo o namespace.
Service
Workload
Carga de trabalho alvo desta política.
httpbinRequest Matching Rules
Condições da solicitação que acionam uma verificação de autorização. Ative Paths na seção Add Request Target.
/headersCom essa configuração, apenas solicitações para o caminho
/headersno serviço httpbin passam pela verificação de autorização externa. Solicitações para outros caminhos (como/ip) não são afetadas.
Etapa 5: Verificar o fluxo de autorização
Teste a configuração enviando solicitações do pod sleep para o serviço httpbin. Os três cenários a seguir confirmam que a autorização funciona corretamente.
Cenário 1: Solicitação para um caminho desprotegido
Envie uma solicitação para /ip, que não é coberto pela política de autorização:
kubectl exec "$(kubectl get pod -l app=sleep -n default -o jsonpath={.items..metadata.name})" -c sleep -n default -- curl "http://httpbin.default:8000/ip" -s -o /dev/null -w "%{http_code}\n"
Saída esperada:
200
O código de status 200 confirma que a verificação de autorização externa não foi acionada para este caminho.
Cenário 2: Solicitação negada pelo serviço de autorização
Envie uma solicitação para /headers com o cabeçalho x-ext-authz: deny:
kubectl exec "$(kubectl get pod -l app=sleep -n default -o jsonpath={.items..metadata.name})" -c sleep -n default -- curl "http://httpbin.default:8000/headers" -H "x-ext-authz: deny" -s
Saída esperada:
denied by ext_authz for not found header `x-ext-authz: allow` in the request
A solicitação chega ao serviço de autorização externa, mas o serviço a rejeita porque o cabeçalho obrigatório x-ext-authz: allow não está presente.
Cenário 3: Solicitação permitida pelo serviço de autorização
Envie uma solicitação para /headers com o cabeçalho x-ext-authz: allow:
kubectl exec "$(kubectl get pod -l app=sleep -n default -o jsonpath={.items..metadata.name})" -c sleep -n default -- curl "http://httpbin.default:8000/headers" -H "x-ext-authz: allow" -s
Saída esperada:
{
"headers": {
"Accept": "*/*",
"Host": "httpbin.default:8000",
"User-Agent": "curl/8.5.0",
"X-Envoy-Attempt-Count": "1",
"X-Ext-Authz": "allow",
"X-Ext-Authz-Check-Result": "allowed",
"X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/default/sa/httpbin;Hash=c3e5364e87add0f4f69e6b0d029f5961b404c8f209bf9004b3d21a82cf67****;Subject=\"\";URI=spiffe://cluster.local/ns/default/sa/sleep"
}
}
O cabeçalho X-Ext-Authz-Check-Result: allowed na resposta confirma que o serviço de autorização aprovou a solicitação. A resposta também inclui a identidade SPIFFE tanto do cliente (sleep) quanto do servidor (httpbin), o que demonstra que o TLS mútuo está ativo entre os serviços.
Esses três cenários confirmam que a política de autorização está funcionando conforme o esperado: apenas solicitações para /headers com o cabeçalho x-ext-authz: allow têm passagem permitida.