A ClusterNetworkPolicy permite definir posturas de segurança globais do GKE em todo o cluster. Este documento é destinado a administradores de cluster que precisam aplicar medidas de segurança obrigatórias ou estabelecer valores de referência de confiança zero.
Esse recurso depende de uma hierarquia de avaliação rigorosa que opera com uma precedência maior do que os recursos NetworkPolicy padrão com escopo de namespace. É possível
usar o recurso ClusterNetworkPolicy para implementar ações explícitas Negar,
Aceitar, ou
Passar. Essas ações permitem configurar políticas globais de permissão ou negação, delegar o controle de tráfego a namespaces específicos e restringir o tráfego de saída a blocos CIDR.
Antes de começar
Antes de configurar uma política de rede de cluster, verifique se você atende aos seguintes requisitos:
- Verifique se o cluster do GKE executa a versão 1.36.0-gke.4447000 ou mais recente.
- Verifique se o cluster usa o GKE Dataplane V2.
Portas e protocolos compatíveis
As regras da ClusterNetworkPolicy podem corresponder ao tráfego com base nos protocolos TCP, UDP ou SCTP. É possível especificar portas de destino das seguintes maneiras:
- Número de porta específico: use a configuração
destinationPort.numberpara segmentar uma única porta (por exemplo,80). - Intervalo de portas: use a configuração
destinationPort.rangepara segmentar um intervalo de portas (por exemplo,8000a9000). - Porta nomeada: use a configuração
destinationNamedPortpara segmentar um nome simbólico definido em uma especificação de pod.
Hierarquia de avaliação de políticas
Ao contrário das NetworkPolicies padrão e aditivas, uma ClusterNetworkPolicy (CNP) depende de uma hierarquia de avaliação rigorosa em que a primeira regra correspondente vence. O tráfego flui sequencialmente por um pipeline de três camadas:
- O nível: as regras de administrador são executadas primeiro, em cascata para NetworkPolicy, e, em seguida, para a linha de base.
- Prioridade da CNP: em um nível, as políticas são avaliadas com base na prioridade numérica explícita.
- Ordem das regras da CNP: em uma única política, as regras são processadas de cima para baixo, como uma lista de controle de acesso (ACL).

O diagrama anterior ilustra o fluxo de decisão da hierarquia de avaliação da CNP:
- Nível de administrador: o tráfego é avaliado primeiro em relação às regras
ClusterNetworkPolicyno nívelAdmin. Se houver uma correspondência de permissão ou negação, a avaliação será interrompida. Se não houver correspondência ou uma ação de aprovação, o tráfego vai para o nívelNetworkPolicy. - Nível de NetworkPolicy: o tráfego é avaliado em relação às políticas de namespace padrão. Se houver uma correspondência, o tráfego será permitido. Se não houver correspondência, o tráfego vai para o nível de linha de base.
- Nível de linha de base: o tráfego é avaliado em relação às
ClusterNetworkPolicyregras no nível de linha de base. Se houver uma correspondência de permissão ou negação, a avaliação será interrompida. Se não houver correspondência, o tráfego vai para o comportamento padrão. - Comportamento padrão do GKE: se nenhuma política corresponder em qualquer nível, o tráfego será sujeito a um comportamento de permissão implícito.
Ações de veredito: permitir, negar e passar
Ao corresponder a um pacote, cada regra aciona uma das três ações rigorosas:
- Negar: bloqueia imediatamente o tráfego.
- Aceitar: permite o tráfego. Ambas as ações interrompem instantaneamente o pipeline, que ignora todas as políticas restantes.
- Passar: transfere o controle para o próximo nível, permitindo que os engenheiros da plataforma deleguem decisões de tráfego específicas a políticas padrão de nível de namespace sem abrir mão do controle administrativo geral.
Configurar uma política global de negação
Para isolar um namespace sensível de todo o tráfego interno do cluster, aplique uma regra de negação não substituível. Essa política de negação padrão ajuda a garantir que qualquer tráfego de ou para o namespace sensível seja bloqueado no nível administrativo. Essa política atua como uma linha de base de proteção que não pode ser ignorada acidentalmente por regras de nível de namespace.
Salve o seguinte manifesto como
global-deny.yaml:apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: cluster-wide-deny-sensitive spec: tier: Admin priority: 10 subject: namespaces: matchLabels: kubernetes.io/metadata.name: sensitive-ns ingress: - action: Deny name: deny-all-ingress from: - namespaces: matchLabels: {} egress: - action: Deny name: deny-all-egress to: - namespaces: matchLabels: {}Aplique o manifesto ao cluster:
kubectl apply -f global-deny.yaml
Configurar uma política global de permissão
Uma política global de permissão pode ajudar a garantir que todos os pods possam acessar o serviço de DNS do cluster, independentemente de políticas de rede criadas pelo desenvolvedor.
Salve o seguinte manifesto como
global-allow-dns.yaml:apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: allow-kube-dns-admin spec: tier: Admin priority: 20 subject: namespaces: {} egress: - action: Accept name: allow-dns-egress to: - pods: namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: kube-dns protocols: - udp: destinationPort: number: 53 - tcp: destinationPort: number: 53Aplique o manifesto ao cluster:
kubectl apply -f global-allow-dns.yaml
Delegar tráfego a políticas de namespace
Delegue padrões de tráfego específicos a objetos NetworkPolicy padrão com escopo de namespace.
Salve o seguinte manifesto como
delegate-policy.yaml:apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: delegate-to-netpol spec: tier: Admin priority: 30 subject: namespaces: {} egress: - action: Pass name: delegate-web-traffic to: - namespaces: matchLabels: app: web-backend protocols: - tcp: destinationPort: number: 8080Aplique o manifesto ao cluster:
kubectl apply -f delegate-policy.yamlPara permitir o tráfego delegado no namespace de destino, salve o seguinte manifesto
NetworkPolicypadrão comoallow-web-backend.yaml:apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-web-backend namespace: backend-ns spec: podSelector: matchLabels: app: web-backend ingress: - from: - namespaceSelector: matchLabels: app: web-frontend ports: - protocol: TCP port: 8080Aplique o manifesto
NetworkPolicypadrão ao cluster:kubectl apply -f allow-web-backend.yaml
Configurar medidas de segurança de linha de base
Estabeleça uma postura de segurança padrão do GKE que os administradores de namespace possam substituir usando políticas de rede padrão.
Salve o seguinte manifesto de linha de base como
baseline-deny.yaml:apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: default-deny-baseline spec: tier: Baseline priority: 100 subject: namespaces: {} ingress: - action: Deny name: baseline-deny-all from: - namespaces: {}Aplique o manifesto de linha de base ao cluster:
kubectl apply -f baseline-deny.yamlSalve o seguinte manifesto de substituição do desenvolvedor como
developer-allow.yaml:apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-frontend-access namespace: my-app-ns spec: podSelector: matchLabels: app: frontend ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: ingress-nginxAplique o manifesto de substituição ao cluster:
kubectl apply -f developer-allow.yaml
Configurar políticas usando portas nomeadas
Para abstrair números de porta das políticas de segurança, faça referência a portas nomeadas definidas nas especificações do pod.
Salve o seguinte manifesto de implantação como
app-deployment.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: my-webapp spec: template: spec: containers: - name: web-container image: nginx ports: - name: http-web containerPort: 8080Aplique o manifesto de implantação ao cluster:
kubectl apply -f app-deployment.yamlSalve o seguinte manifesto de política como
named-port-policy.yaml:apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: allow-web-named-port spec: tier: Admin priority: 40 subject: namespaces: {} egress: - action: Accept to: - namespaces: matchLabels: app: my-webapp protocols: - tcp: destinationNamedPort: http-webAplique o manifesto de política ao cluster:
kubectl apply -f named-port-policy.yaml
Restringir a saída a blocos CIDR
Controle o acesso a recursos externos ou intranets corporativas especificando blocos CIDR.
Salve o seguinte manifesto como
cidr-policy.yaml:apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: allow-egress-to-intranet spec: tier: Admin priority: 60 subject: namespaces: {} egress: - action: Accept name: allow-intranet to: - networks: - 10.0.0.0/8 - 192.168.0.0/16Aplique o manifesto ao cluster:
kubectl apply -f cidr-policy.yaml
Configurar precedência de prioridade
Para controlar a ordem de avaliação quando várias políticas se aplicam aos mesmos pods, especifique uma prioridade. As prioridades variam de 0 a 1000, em que números mais baixos indicam maior precedência. Um único objeto ClusterNetworkPolicy pode conter um máximo de 100 regras de entrada e 100 regras de saída.
Salve o seguinte manifesto como
priority-policies.yaml:apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: deny-beta spec: tier: Admin priority: 10 subject: namespaces: matchLabels: team: alpha ingress: - action: Accept name: allow-beta-monitoring from: - pods: namespaceSelector: matchLabels: team: beta podSelector: matchLabels: app: monitoring - action: Deny name: deny-all-other-ingress-from-beta from: - namespaces: matchLabels: team: beta --- apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: allow-beta spec: tier: Admin priority: 50 subject: namespaces: matchLabels: team: alpha ingress: - action: Accept name: allow-all-ingress-from-beta from: - namespaces: matchLabels: team: betaAplique o manifesto ao cluster:
kubectl apply -f priority-policies.yaml
Resolver problemas
Para encontrar métodos de diagnóstico e resolução de erros de política, use os comandos a seguir.
Liste todas as políticas de rede de cluster no cluster:
kubectl get clusternetworkpolicies
Descreva uma política específica para inspecionar o status e o nível de avaliação:
kubectl describe clusternetworkpolicy/<policy-name>
O campo status.conditions na saída fornece informações sobre se a política foi reconciliada com sucesso pela implementação de rede do cluster.
Para monitorar fluxos de tráfego e decisões de política, use a observabilidade do GKE Dataplane V2.
A seguir
- Saiba mais sobre a observabilidade do GKE Dataplane V2.
- Consulte a documentação da API de política de rede do Kubernetes.