Os proxies sidecar e os gateways de saída no Service Mesh (ASM) aplicam controle de saída granular e baseado em identidade, recurso indisponível no Kubernetes NetworkPolicy. Ao rotear o tráfego de saída por um gateway de saída e aplicar uma política de autorização DENY, você bloqueia requisições HTTP de um namespace específico para um endpoint externo com base na identidade do namespace, nas contas de serviço e em outros atributos.
Este tópico apresenta um exemplo completo: negar todo o tráfego HTTP dos serviços no namespace demo-frontend para www.aliyun.com.
Casos de uso
Auditoria centralizada de saída: Roteie todo o tráfego de saída por um único gateway de saída para registro em log e aplicação de políticas.
Controle de acesso no escopo do namespace: Permita ou negue acesso a sites externos com base no namespace de origem ou na identidade do serviço.
Defesa em profundidade: Adicione autorização no nível da aplicação sobre o Kubernetes NetworkPolicy para garantir segurança de saída com confiança zero.
Como funciona
O tráfego flui por três componentes:
Proxy sidecar -- Intercepta requisições de saída das cargas de trabalho e as encaminha para o gateway de saída.
Gateway de saída -- Funciona como ponto de saída centralizado onde as políticas de autorização são avaliadas.
Política de autorização -- Regra DENY no gateway de saída que bloqueia requisições originadas no namespace
demo-frontend.
Workload (demo-frontend) --> Sidecar proxy --> Egress gateway --> External website
|
Authorization policy
(DENY applied here)
Pré-requisitos
Antes de começar, verifique se você tem:
Um cluster adicionado à instância ASM. Para mais informações, consulte Adicionar um cluster a uma instância ASM
Um namespace chamado
demo-frontendcom injeção automática de proxy sidecar ativada. Para mais informações, consulte Gerencie namespaces globais
Etapa 1: Implantar um serviço de teste
Implante um serviço sleep no namespace demo-frontend como carga de trabalho de teste para verificar o controle de tráfego de saída.
Obtenha o arquivo kubeconfig e conecte-se ao cluster com kubectl. Para mais informações, consulte Obter o arquivo kubeconfig de um cluster e usar kubectl para conectar-se ao cluster.
-
Crie um arquivo chamado
sleep.yamlcom o seguinte conteúdo: -
Aplique o arquivo:
kubectl apply -f sleep.yaml -n demo-frontend -
Verifique se um proxy sidecar foi injetado no pod sleep:
Faça login no console ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do cluster desejado. No painel de navegação à esquerda, escolha Workloads > Pods.
Na página Pods, selecione demo-frontend na lista suspensa Namespace e clique no nome do pod do serviço sleep.
Na aba Container, confirme a presença de um contêiner chamado istio-proxy. Isso confirma a injeção do proxy sidecar.
Etapa 2: Crie um gateway de saída
Um gateway de saída centraliza o tráfego de saída para que as políticas de autorização possam controlar quais namespaces ou serviços acessam endpoints externos.
Crie um gateway de saída chamado egressgateway. Para obter instruções, consulte Criar um gateway de saída.
Etapa 3: Restringir o tráfego de saída apenas a serviços registrados
Por padrão, os serviços em uma instância ASM podem acessar todos os endpoints externos. Para impor controle de saída, altere a política de tráfego de saída para REGISTRY_ONLY. Após essa alteração, apenas os serviços externos registrados como entradas de serviço estarão acessíveis.
Defina a política de tráfego de saída
Faça login no console ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Na página Mesh Management, clique no nome da instância ASM. No painel de navegação à esquerda, escolha Dataplane Component Management > Sidecar Proxy Setting.
Na aba global, clique em Outbound Traffic Policy, defina o parâmetro Outbound Traffic Policy como REGISTEY_ONLY e clique em Update Settings.
Registrar o site externo como uma entrada de serviço
Registre www.aliyun.com para que os serviços no mesh ainda possam alcançá-lo antes que a política de autorização negue o acesso.
Na página de detalhes da instância ASM, escolha Cluster & Workload Management > External Service(ServiceEntry) no painel de navegação à esquerda. Clique em Create from YAML.
-
Selecione istio-system na lista suspensa Namespace e cole o seguinte YAML:
O campo
resolutiondeve ser definido comoDNS. Se definido comoNONE, o gateway roteia o tráfego de volta para si mesmo em um loop infinito, pois o IP de destino corresponde ao próprio IP de serviço do gateway. Com a resoluçãoDNS, o gateway resolve o hostname externo para um endereço IP e encaminha o tráfego para esse endereço.apiVersion: networking.istio.io/v1beta1 kind: ServiceEntry metadata: name: aliyuncom-ext namespace: istio-system spec: hosts: - www.aliyun.com location: MESH_EXTERNAL ports: - name: http number: 80 protocol: HTTP - name: tls number: 443 protocol: TLS resolution: DNS Clique em Create.
Verifique o acesso externo
Antes de prosseguir, confirme que o serviço sleep consegue alcançar www.aliyun.com por meio da entrada de serviço:
Faça login no console ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do cluster. No painel de navegação à esquerda, escolha Workloads > Pods.
Na página Pods, selecione demo-frontend na lista suspensa Namespace. Localize o pod sleep e clique em Terminal > sleep na coluna Actions.
-
Execute o comando a seguir. Uma resposta
301confirma que a entrada de serviço está funcionando e que o site externo está acessível.curl -I http://www.aliyun.com
Etapa 4: Roteare o tráfego pelo gateway de saída
Crie um gateway Istio, uma regra de destino e um serviço virtual para rotear o tráfego do namespace demo-frontend pelo gateway de saída até www.aliyun.com.
Crie um gateway Istio
Crie um gateway Istio no namespace istio-system. Para mais informações, consulte Gerencie gateways Istio.
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: istio-egressgateway
namespace: istio-system
spec:
selector:
istio: egressgateway
servers:
- port:
number: 80
name: http
protocol: HTTPS
tls:
mode: ISTIO_MUTUAL
hosts:
- '*'
O campo mode está definido como ISTIO_MUTUAL, o que ativa a Segurança de Camada de Transporte mútua (mTLS). Os serviços no mesh precisam concluir a autenticação mTLS antes de enviar tráfego pelo gateway de saída.
Crie uma regra de destino
Crie uma regra de destino no namespace demo-frontend. Para mais informações, consulte Gerencie regras de destino.
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: target-egress-gateway
namespace: demo-frontend
spec:
host: istio-egressgateway.istio-system.svc.cluster.local
subsets:
- name: target-egress-gateway-mTLS
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
tls:
mode: ISTIO_MUTUAL
Essa regra de destino aplica mTLS ao tráfego do namespace demo-frontend para o gateway de saída.
Crie um serviço virtual
Crie um serviço virtual no namespace demo-frontend. Para mais informações, consulte Gerencie serviços virtuais.
A seção http define duas regras de correspondência que formam um caminho de roteamento de dois saltos:
|
Regra |
Gateway |
Finalidade |
|
Primeira |
|
Os proxies sidecar em |
|
Segunda |
|
O gateway de saída encaminha o tráfego para o endpoint externo ( |
Etapa 5: Crie uma política de autorização
Aplique uma política de autorização DENY no gateway de saída para bloquear todo o tráfego do namespace demo-frontend.
Faça login no console ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Na página Mesh Management, clique no nome da instância ASM. No painel de navegação à esquerda, escolha Mesh Security Center > AuthorizationPolicy. Clique em Create.
-
Na página Create, configure os seguintes parâmetros:
Parâmetro
Valor
Name
Um nome para a política de autorização
Policy Type
DENY
ASM Gateway
Na aba Gateway Scope, selecione egressgateway
Request Matching Rules
Na seção Add Request Source, ative Namespaces e defina o valor como
demo-frontend Clique em Create.
Quando várias políticas de autorização têm como alvo a mesma carga de trabalho, o Istio as avalia nesta ordem: CUSTOM > DENY > ALLOW. Uma requisição que corresponda a uma política DENY é rejeitada independentemente de quaisquer políticas ALLOW. Se não existirem políticas ALLOW, todas as requisições não negadas são permitidas por padrão.
Etapa 6: Verifique a política de autorização
Confirme que os serviços no namespace demo-frontend não conseguem mais acessar www.aliyun.com.
Faça login no console ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do cluster desejado. No painel de navegação à esquerda, escolha Workloads > Pods.
Na página Pods, selecione demo-frontend na lista suspensa Namespace. Localize o nome do pod do serviço sleep e clique em Terminal > sleep na coluna Actions.
-
Execute o comando a seguir. Saída esperada: A resposta
403 Forbiddenconfirma que a política de autorização bloqueia o tráfego de saída do namespacedemo-frontendparawww.aliyun.com. O cabeçalhoserver: envoyconfirma a aplicação pelo proxy Envoy do gateway de saída.curl -I http://www.aliyun.comHTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Thu, 12 Oct 2023 07:14:09 GMT server: envoy x-envoy-upstream-service-time: 4
Considerações de segurança
As políticas de autorização impõem controle de saída por meio de proxies sidecar e do gateway de saída. Observe as seguintes limitações:
Desvio do sidecar: Se uma carga de trabalho contornar seu proxy sidecar (por exemplo, um pod privilegiado sem injeção de sidecar), ela poderá acessar serviços externos diretamente sem passar pelo gateway de saída. A política de autorização não se aplica ao tráfego desviado.
Medidas complementares: Para impedir que o tráfego saia do mesh sem passar pelo gateway de saída, adicione imposição no nível de infraestrutura. Use objetos Kubernetes NetworkPolicy ou regras de firewall para negar todo o tráfego de saída que não se origine do gateway de saída.