No modo Ambient Mesh, os ztunnels processam o tráfego de Camada 4 em cada nó, enquanto os proxies waypoint tomam as decisões de Camada 7. Ao implantar um proxy waypoint para um serviço, o ztunnel encaminha todo o tráfego desse serviço para o waypoint e deixa de aplicar suas próprias políticas de autorização. Qualquer política de autorização de Camada 7 deve ter como alvo o proxy waypoint, e não o pod da aplicação.
Este documento demonstra cenários comuns de autorização de Camada 7 em proxies waypoint no Service Mesh (ASM) v1.18, incluindo controle de acesso baseado em IP, namespace, host e método HTTP.
Como a autorização funciona com proxies waypoint
Sem um proxy waypoint, os ztunnels aplicam autorização apenas na Camada 4 (portas, endereços IP, identidades). Após implantar um proxy waypoint para um serviço:
-
O ztunnel delega todas as decisões de autorização desse serviço ao proxy waypoint e permite que o tráfego do waypoint passe incondicionalmente.
-
As políticas de autorização que usam
selectorpara corresponder ao pod da aplicação (direcionadas ao ztunnel) são ignoradas. -
As políticas de autorização devem usar
selectorcom o rótuloistio.io/gateway-namepara direcionar ao proxy waypoint.
O proxy waypoint pode então aplicar políticas de Camada 7 com base em atributos HTTP, como hosts, caminhos, métodos e cabeçalhos. Quando uma solicitação é negada, o waypoint retorna RBAC: access denied com status HTTP 403.
Pré-requisitos
Antes de começar, verifique se você tem:
-
Uma instância do ASM executando v1.18
-
Um gateway de entrada e aplicações de amostra implantadas com recursos básicos verificados. Para obter detalhes, consulte os pré-requisitos e a Etapa 1 em Primeiros passos
Limitações
| Restrição | Detalhes |
|---|---|
| Sem autorização personalizada | O campo action não pode ser definido como CUSTOM. Os proxies waypoint não são compatíveis com serviços de autorização externos. |
Sem ipBlocks na origem |
O campo ipBlocks não é compatível com a especificação source. Use remoteIpBlocks para corresponder a endereços IP de clientes. |
| Políticas do ztunnel ignoradas | Após um proxy waypoint ser implantado para um serviço, o ztunnel correspondente permite que todo o tráfego do waypoint passe. As políticas de autorização devem estar vinculadas ao proxy waypoint. |
Implantar um proxy waypoint
Implante um proxy waypoint para o serviço productpage antes de executar os exemplos.
-
Implante o proxy waypoint:
istioctl x waypoint apply --service-account bookinfo-productpage -
Verifique se o pod do proxy waypoint está em execução:
kubectl get pod --show-labels | grep waypointSaída esperada:
bookinfo-productpage-istio-waypoint-6c579dd48d-l**** 1/1 Running 0 91s gateway.istio.io/managed=istio.io-mesh-controller,istio.io/gateway-name=bookinfo-productpage,pod-template-hash=6c579dd48d,service.istio.io/canonical-name=bookinfo-productpage-istio-waypoint,service.istio.io/canonical-revision=latest,sidecar.istio.io/inject=false
Exemplo 1: Políticas direcionadas ao ztunnel não têm efeito quando um proxy waypoint está implantado
Uma configuração incorreta comum é aplicar uma política de autorização a um ztunnel quando um proxy waypoint já está implantado para o serviço. Como o ztunnel cede as decisões ao proxy waypoint, a política é completamente ignorada. Este exemplo demonstra primeiro a abordagem incorreta e depois mostra como corrigi-la.
Direcionar ao ztunnel (incorreto)
-
Crie um arquivo
productpage-viewer.yamlcom o seguinte conteúdo.Esta política usa
selectorpara corresponder ao podproductpage(ztunnel) e nega o acesso à porta 9080:apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: app: productpage action: DENY rules: - to: - operation: ports: - "9080" -
Aplique a política:
kubectl apply -f productpage-viewer.yaml -
Teste o acesso de diferentes origens.
Pelo gateway de
sleep:kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage" | grep -o "<title>.*</title>"Saída:
<title>Simple Bookstore App</title>Pelo gateway de
notsleep:kubectl exec deploy/notsleep -- curl -s "http://$GATEWAY_HOST/productpage" | grep -o "<title>.*</title>"Saída:
<title>Simple Bookstore App</title>Acesso direto de
sleep:kubectl exec deploy/sleep -- curl -s http://productpage:9080/| grep -o "<title>.*</title>"Saída:
command terminated with exit code 56Acesso direto de
notsleep:kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"Saída:
<title>Simple Bookstore App</title>Apesar da política DENY na porta 9080, a maioria das solicitações foi bem-sucedida. Compare com a mesma política em Autenticação e autorização de Camada 4 - Exemplo 2, onde nenhum proxy waypoint está implantado e a política bloqueia o tráfego conforme esperado.
Quando um proxy waypoint está implantado, todas as políticas de autorização direcionadas ao ztunnel são ignoradas. Direcione ao proxy waypoint.
Direcionar ao proxy waypoint (correto)
-
Atualize o arquivo
productpage-viewer.yamlpara direcionar ao proxy waypoint alterando o rótuloselectore reaplique:apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: istio.io/gateway-name: bookinfo-productpage action: DENY rules: - to: - operation: ports: - "9080"kubectl apply -f productpage-viewer.yaml -
Teste o acesso novamente.
Pelo gateway de
sleep:kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage"Saída:
RBAC: access denied%Pelo gateway de
notsleep:kubectl exec deploy/notsleep -- curl -s "http://$GATEWAY_HOST/productpage"Saída:
RBAC: access denied%Acesso direto de
sleep:kubectl exec deploy/sleep -- curl -s http://productpage:9080/Saída:
RBAC: access denied%Acesso direto de
notsleep:kubectl exec deploy/notsleep -- curl -s http://productpage:9080/Saída:
RBAC: access denied%Todas as solicitações agora são negadas. O proxy waypoint retorna
RBAC: access denied%com um código de status HTTP 403. Isso difere do erro de nível de conexão em Autenticação e autorização de Camada 4, onde os ztunnels aplicam políticas na Camada 4. -
Limpe os recursos:
kubectl delete authorizationpolicy productpage-viewer
Exemplo 2: Negar acesso de um endereço IP específico
As políticas de autorização do proxy waypoint não são compatíveis com ipBlocks. Use remoteIpBlocks para corresponder ao endereço IP original do cliente. Configure o campo remoteIpBlocks para corresponder a solicitações que passam pelo gateway.
-
Crie um arquivo
productpage-viewer.yamlque nega o endereço IP do podsleep:apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: istio.io/gateway-name: bookinfo-productpage action: DENY rules: - from: - source: remoteIpBlocks: - "${sleep Pod IP}"Substitua
${sleep Pod IP}pelo endereço IP real do podsleep. -
Aplique a política:
kubectl apply -f productpage-viewer.yaml -
Teste o acesso do pod
sleep.Pelo gateway:
kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage"Saída:
RBAC: access denied%Acesso direto:
kubectl exec deploy/sleep -- curl -s http://productpage:9080/ -ISaída:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Fri, 19 Jul 2024 08:17:08 GMT server: istio-envoyO acesso pelo gateway e o acesso direto do pod
sleepsão negados. -
Remova as políticas:
kubectl delete authorizationpolicy productpage-viewer
Exemplo 3: Negar acesso de um namespace específico
Este exemplo bloqueia todo o tráfego originado do namespace istio-system. Como o gateway de entrada é executado em istio-system, as solicitações roteadas pelo gateway são negadas, enquanto as solicitações diretas de pod para pod de outros namespaces ainda são bem-sucedidas.
-
Crie um arquivo
productpage-viewer.yaml:apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: istio.io/gateway-name: bookinfo-productpage action: DENY rules: - from: - source: namespaces: - istio-system -
Aplique a política:
kubectl apply -f productpage-viewer.yaml -
Teste o acesso.
Pelo gateway de
sleep:kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage"Saída:
RBAC: access denied%Pelo gateway de
notsleep:kubectl exec deploy/notsleep -- curl -s "http://$GATEWAY_HOST/productpage"Saída:
RBAC: access denied%Acesso direto de
sleep:kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"Saída:
<title>Simple Bookstore App</title>Acesso direto de
notsleep:kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"Saída:
<title>Simple Bookstore App</title>O tráfego roteado pelo gateway é negado porque o gateway é executado no namespace
istio-system. O acesso direto de pods em outros namespaces (comodefault) não é afetado. -
Exclua a política:
kubectl delete authorizationpolicy productpage-viewer
Exemplo 4: Negar solicitações pelo cabeçalho host
Este exemplo nega solicitações cujo cabeçalho host seja test.com na porta 9080. Solicitações com outros valores de host passam normalmente.
-
Crie um arquivo
productpage-viewer.yaml:apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: istio.io/gateway-name: bookinfo-productpage action: DENY rules: - to: - operation: hosts: ["test.com"] ports: ["9080"] -
Aplique a política:
kubectl apply -f productpage-viewer.yaml -
Teste o acesso.
Solicitação com
Host: test.com:kubectl exec deploy/sleep -- curl -s http://$GATEWAY_HOST/productpage -H "Host: test.com"Saída:
RBAC: access denied%Solicitação com
Host: test1.com:kubectl exec deploy/sleep -- curl -s http://$GATEWAY_HOST/productpage -H "Host: test1.com" -ISaída:
HTTP/1.1 200 OK content-type: text/html; charset=utf-8 content-length: 5290 server: istio-envoy date: Tue, 15 Aug 2023 03:39:29 GMT x-envoy-upstream-service-time: 18Apenas o host
test.comé negado. Outros valores de host passam normalmente. -
Remova os recursos criados:
kubectl delete authorizationpolicy productpage-viewer
Exemplo 5: Negar um método HTTP específico em um caminho específico
Este exemplo bloqueia solicitações HEAD para o caminho /productpage. Solicitações GET para o mesmo caminho e solicitações HEAD para outros caminhos são permitidas.
-
Crie um arquivo
productpage-viewer.yaml:apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: istio.io/gateway-name: bookinfo-productpage action: DENY rules: - to: - operation: methods: ["HEAD"] paths: ["/productpage"] -
Aplique a política:
kubectl apply -f productpage-viewer.yaml -
Teste o acesso.
Solicitação HEAD para
/productpage:kubectl exec deploy/sleep -- curl -s http://$GATEWAY_HOST/productpage -ISaída:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Tue, 15 Aug 2023 03:59:37 GMT server: istio-envoy x-envoy-upstream-service-time: 0Solicitação GET para
/productpage:kubectl exec deploy/sleep -- curl -s http://$GATEWAY_HOST/productpage -XGET -ISaída:
HTTP/1.1 200 OK content-type: text/html; charset=utf-8 content-length: 5290 server: istio-envoy date: Tue, 15 Aug 2023 03:39:29 GMT x-envoy-upstream-service-time: 18Solicitação HEAD para
/api/v1/products:kubectl exec deploy/sleep -- curl -s http://$GATEWAY_HOST/api/v1/products -ISaída:
HTTP/1.1 200 OK content-type: text/html; charset=utf-8 content-length: 5290 server: istio-envoy date: Tue, 15 Aug 2023 03:39:29 GMT x-envoy-upstream-service-time: 18Apenas as solicitações HEAD para
/productpagesão negadas. A política não afeta outros métodos ou caminhos. -
Exclua os recursos:
kubectl delete authorizationpolicy productpage-viewer
Próximas etapas
-
Autenticação e autorização de Camada 4 -- Configurar políticas de autorização que os ztunnels aplicam na Camada 4
-
Primeiros passos -- Implantar as aplicações de amostra usadas nestes exemplos