Para controle de acesso dinâmico, integre um mecanismo Open Policy Agent (OPA) ao gateway de entrada. Isso permite personalizar políticas de autorização com base em identidades de usuário ou no conteúdo da requisição e controlar a comunicação entre serviços em tempo real. Essa abordagem impede acessos não autorizados, reduz riscos de violação de dados e aumenta a segurança das aplicações em uma instância do Service Mesh (ASM). Este tópico descreve como usar um mecanismo OPA para autenticar e autorizar requisições recebidas por um gateway de entrada. Neste exemplo, as requisições passam pelo gateway de entrada para acessar a aplicação HTTPBin.
Pré-requisitos
Um cluster Kubernetes gerenciado adicionado a uma instância do ASM, versão 1.15.3.25 ou posterior. Para obter instruções, consulte Adicionar um cluster a uma instância do ASM e Atualizar uma instância do ASM.
A aplicação httpbin implantada e acessível. Para obter instruções, consulte Implantar a aplicação httpbin.
A injeção automática de sidecar ativada para o namespace
default. Para obter instruções, consulte Configure uma política de injeção de sidecar.
Etapa 1: Implantar um mecanismo OPA
-
Crie um arquivo chamado
asm-opa.yamlcom o seguinte conteúdo.Este manifesto YAML implanta um Service, um Deployment e um Secret do OPA.
Tipo
Descrição
Deployment
-
No caminho da imagem
registry-vpc.cn-hangzhou.aliyuncs.com/acs/opa:0.46.1-istio-3-static, substituacn-hangzhoupelo ID da região do seu cluster. -
Este mecanismo de execução do OPA ativa o log de decisões por padrão (
--set=decision_logs.console=true) para simplificar a depuração.
Secret
O Secret define uma política do OPA com as seguintes regras:
-
Permitir requisições se o caminho for
health. -
Permitir requisições se o método for
HEAD. -
Permitir requisições se o nome de usuário for
alice.NotaO nome de usuário é extraído do cabeçalho
Authorization, que deve estar no formatoAuthorization: Basic ${base64_encoded_username:password}.
-
-
Execute o comando a seguir para implantar o OPA.
kubectl apply -f asm-opa.yaml
Etapa 2: Integrar o mecanismo OPA ao gateway de entrada usando o recurso de autorização externa
Faça login no console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique em no nome da instância do ASM. No painel de navegação à esquerda, escolha .
Na página Ingress Gateway, localize o gateway a ser integrado ao OPA e clique em Gateway Security.
No painel de navegação à esquerda do gateway, escolha .
-
Configure um serviço de autorização personalizado.
-
No assistente Custom Authorization Service Configuration, configure o OPA como serviço de autorização personalizado do gateway e clique em Next.
Ative a opção Enable Gateway Custom Authorization Service, selecione a aba Custom authorization service based on envoy.ext_authz (HTTP or gRPC), defina Protocol como GRPC, service address como
asm-opa.default.svc.cluster.local, service port como 9191 e timeout como 10 segundos. -
No assistente Matching Rules, configure as regras de correspondência para especificar quais requisições exigem autorização do OPA e clique em Submit.
Defina Matching Mode como Selected requests must be authorized, selecione Custom matching rules, ative HTTP Path (Path) e insira
/status/*.Uma mensagem confirmará que o Gateway Custom Authorization Service was created successfully e listará os recursos nativos do Istio criados: um ASMExtensionProvider (nome do recurso:
grpcextauth-asmsecuritypolicy-ingressgateway-extauthz) e uma AuthorizationPolicy (nome do recurso:ingressgateway-extauthz-ap-wg-gateway-istio-system-gateway-ingressgateway). Clique em View YAML para visualizar a configuração do recurso ou em Edit para modifique o serviço de autorização.
-
Etapa 3: Testar o acesso ao httpbin
-
Execute o comando a seguir para acessar o caminho
/.curl ${ASM_GATEWAY_IP}/ -I -X GETHTTP/1.1 200 OK server: istio-envoy date: Tue, 25 Jul 2023 08:30:58 GMT content-type: text/html; charset=utf-8 content-length: 9593 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 2A saída indica que a requisição foi permitida porque este caminho não exige autenticação.
-
Execute o comando a seguir para acessar o caminho
/status/201sem credenciais válidas.curl ${ASM_GATEWAY_IP}/status/201 -I -X GETSaída esperada:
HTTP/1.1 403 Forbidden date: Tue, 25 Jul 2023 08:31:18 GMT server: istio-envoy content-length: 0 x-envoy-upstream-service-time: 1A resposta
403 Forbiddenindica que a requisição foi negada devido à ausência de credenciais. -
Execute o comando a seguir para acessar o caminho
/status/201com credenciais válidas do usuárioalice.curl ${ASM_GATEWAY_IP}/status/201 -I -X GET --user alice:testpasswordSaída esperada:
HTTP/1.1 201 Created server: istio-envoy date: Tue, 25 Jul 2023 08:31:38 GMT content-type: text/html; charset=utf-8 access-control-allow-origin: * access-control-allow-credentials: true content-length: 0 x-envoy-upstream-service-time: 3A resposta
201 Createdconfirma que a requisição foi permitida, pois o usuárioalicetem autorização na política do OPA.
Etapa 4: Atualize a política do OPA
Atualize a política do OPA em tempo de execução chamando a API HTTP do mecanismo OPA.
-
Execute o comando a seguir para atualize a política. A nova política permite acesso apenas ao usuário
bobe nega acesso aalice.kubectl exec deployment/httpbin -c istio-proxy -- curl asm-opa:8181/v1/policies/policy/policy.rego -XPUT --data-binary 'package asm.authz import future.keywords import input.attributes.request.http as http_request import input.parsed_path default allow := false allow if { parsed_path[0] == "health" } allow if { http_request.method == "HEAD" } allow if { user_name == "bob" } user_name := parsed if { [_, encoded] := split(http_request.headers.authorization, " ") [parsed, _] := split(base64url.decode(encoded), ":") }' -
Execute o comando a seguir para testar o acesso como o usuário
bob.curl ${ASM_GATEWAY_IP}/status/201 -I -X GET --user bob:testpasswordSaída esperada:
HTTP/1.1 201 Created server: istio-envoy date: Tue, 25 Jul 2023 08:32:16 GMT content-type: text/html; charset=utf-8 access-control-allow-origin: * access-control-allow-credentials: true content-length: 0 x-envoy-upstream-service-time: 3A resposta
201 Createdmostra que o usuáriobobconsegue acessar o caminho com sucesso. -
Execute o comando a seguir para testar o acesso como o usuário
alice.curl ${ASM_GATEWAY_IP}/status/201 -I -X GET --user alice:testpasswordSaída esperada:
HTTP/1.1 403 Forbidden date: Tue, 25 Jul 2023 08:32:49 GMT server: istio-envoy content-length: 0 x-envoy-upstream-service-time: 1A resposta
403 Forbiddenconfirma que o acesso do usuárioaliceagora está negado, validando a atualização da política.