É possível melhorar a segurança do plano de controle do Google Kubernetes Engine (GKE) ao desativar os endereços IP externo das instâncias de máquina virtual (VM) do plano de controle. Neste documento, mostramos aos engenheiros de segurança como controlar o tráfego de saída do servidor de API do Kubernetes e como evitar possíveis interrupções nos webhooks de admissão.
Você já precisa conhecer os seguintes conceitos:
- Acesso a fontes externas do servidor de API
- Visão geral da rede do GKE
- Arquitetura de cluster do GKE
Níveis de restrição
É possível especificar um dos seguintes níveis de restrição ao criar ou atualizar um cluster:
- Sem tráfego (
NONE): desative o endereço IP externo de cada instância de VM do plano de controle e direcione todo o tráfego de saída do servidor da API para um buraco negro. Esse nível de restrição tem os seguintes efeitos:- O GKE bloqueia o tráfego de saída direto do servidor de API para servidores webhook de admissão que são executados fora do cluster. Todos os webhooks de admissão que usam um URL ou endereço IP para entrar em contato com o servidor de webhook são afetados.
- O GKE bloqueia qualquer tráfego de saída direto do servidor de API para serviços externos, incluindo a Internet e serviços doGoogle Cloud . O tráfego para autenticação do GKE e para componentes do sistema, como o servidor de metadados, não é afetado.
- Outros tipos de tráfego de saída, como tráfego crítico do sistema ou tráfego dos seus nós, não são afetados.
- O GKE usa uma ValidatingAdmissionPolicy para rejeitar a
criação ou atualizações de ValidatingWebhookConfigurations ou
MutatingWebhookConfigurations que usam o campo
clientConfig.url.
- Todo o tráfego (
VIA_CONTROL_PLANE): mantenha o endereço IP externo de cada instância do plano de controle e deixe o servidor da API usar o endereço IP para o tráfego de saída. Essa é a opção padrão no GKE.
Limitações
Se você desativar o tráfego de saída definindo o nível de restrição como NONE, o
cluster não poderá usar endereços IP públicos de uso particular (PUPI).
Antes de começar
Antes de começar, verifique se você realizou as tarefas a seguir:
- Ative a API Google Kubernetes Engine. Ativar a API Google Kubernetes Engine
- Se você quiser usar a Google Cloud CLI para essa tarefa,
instale e, em seguida,
inicialize a
CLI gcloud. Se você instalou a CLI gcloud anteriormente, instale a versão
mais recente executando o comando
gcloud components update. Talvez as versões anteriores da CLI gcloud não sejam compatíveis com a execução dos comandos neste documento.
- Verifique se você tem um cluster do GKE Autopilot ou Standard que executa a versão 1.35.1-gke.1396000 ou mais recente. Também é possível criar um cluster do Autopilot.
- Se você tiver servidores de webhook externos, verifique se está usando uma referência de serviço para entrar em contato com eles. Quando você desativa o tráfego de saída do servidor de API, todos os webhooks que usam um URL para entrar em contato com o servidor de webhook falham. Os webhooks gerenciados pelo GKE não são afetados.
Personalizar o tráfego de saída do servidor de API
É possível personalizar o nível de restrição para o tráfego de saída do servidor de API ao criar ou atualizar um cluster. Para atualizar um cluster atual, use
a flag --control-plane-egress:
gcloud container clusters update CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--control-plane-egress=CONTROL_PLANE_EGRESS_MODE
Substitua:
CLUSTER_NAME: o nome do cluster.CONTROL_PLANE_LOCATION: a região ou zona do plano de controle do cluster, comous-central1ouus-central1-a.CONTROL_PLANE_EGRESS_MODE: o nível de restrição para o tráfego de saída do seu servidor de API. Use um dos seguintes valores:NONE: desative o endereço IP externo das instâncias de VM do plano de controle e bloqueie todo o tráfego de saída não essencial do servidor da API. O GKE impede a criação de novas configurações de webhook que usam o campoclientConfig.url.VIA_CONTROL_PLANE: mantenha o endereço IP externo das instâncias de VM do plano de controle e permita o tráfego de saída do servidor da API. Esse é o valor padrão.
Verificar a restrição de tráfego de saída
Para verificar se o GKE bloqueia o tráfego de saída do seu servidor de API, use um dos seguintes métodos:
Verifique a configuração do cluster:
gcloud container clusters describe CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --format='value(controlPlaneEgress)'A saída é uma das seguintes:
NONE: o tráfego de saída está restrito.VIA_CONTROL_PLANE: o tráfego de saída não é restrito.
Para verificar o efeito das mudanças em novos webhooks, tente criar uma configuração de webhook que use o campo
clientConfig.url:cat <<EOF | kubectl apply -f - apiVersion: admissionregistration.k8s.io/v1 kind: MutatingWebhookConfiguration metadata: name: test-webhook-config webhooks: - name: my-webhook.example.com clientConfig: url: "https://my-webhook.example.com:9443/my-webhook-path"O resultado será o seguinte:
ValidatingAdmissionPolicy 'gke-restrict-webhook-url' denied request: Egress traffic from the API server through the control plane is disabled. As a result, direct API server calls to external webhook servers are blocked. To connect to external webhooks, update any webhook configurations that use clientConfig.url to use clientConfig.service instead.Essa saída indica que uma ValidatingAdmissionPolicy do GKE impede que você crie ou atualize configurações de webhook com o campo
clientConfig.url. Se você excluir a ValidatingAdmissionPolicy, será possível criar ou atualizar a configuração, mas as solicitações de admissão não chegarão ao servidor de webhook.Para verificar o efeito das mudanças nos webhooks atuais do cluster, tente enviar uma solicitação direta para um endereço IP fora do cluster:
- Ative os registros do
API_SERVERpara o cluster. Exclua a
gke-restrict-webhook-urlValidatingAdmissionPolicy:kubectl delete validatingadmissionpolicy gke-restrict-webhook-urlAo excluir a ValidatingAdmissionPolicy, é possível criar ou atualizar configurações de webhook com o campo
clientConfig.url. O cluster recria automaticamente a ValidatingAdmissionPolicy, então esse bypass é temporário.No campo
clientConfig.urlde um ValidatingWebhookConfiguration ou MutatingWebhookConfiguration, especifique um endereço IP ou URL para enviar solicitações. Você pode usar um valor de exemplo, comohttp://example.comou203.0.113.100.Verifique se há uma mensagem de erro como esta nos registros do servidor da API:
Error from server (InternalError): error when creating "STDIN": Internal error occurred: failed calling webhook WEBHOOK_NAME": failed to call webhook: Post "WEBHOOK_URL": proxyconnect tcp: dial tcp: lookup master-internet-access-unavailable.localhost on 169.254.169.254:53: no such hostEssa saída indica que, mesmo que o ValidatingAdmissionPolicy seja excluído, as solicitações de admissão não poderão alcançar um servidor webhook usando o endereço IP ou o URL do servidor.
- Ative os registros do
Depois de desativar os endereços IP externo das instâncias de VM do plano de controle,
o GKE bloqueia o tráfego para todos os webhooks que usam um URL para entrar em contato com
servidores de webhook externos. Use o campo clientConfig.service na configuração do webhook para definir uma rota alternativa que o servidor da API possa usar.
Para mais informações, consulte
Configuração de webhook externo.