Como proteger metadados de cluster


O Google Kubernetes Engine (GKE) usa metadados de instância para configurar máquinas virtuais (VMs) de nó, mas alguns desses metadados são potencialmente confidenciais e precisam ser protegidos de cargas de trabalho em execução no cluster.

Antes de começar

Antes de começar, verifique se você realizou as tarefas a seguir:

  • Ativar 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 gcloud components update.

Configurar conta de serviço de nó

As credenciais da conta de serviço de cada nó continuam sendo expostas às cargas de trabalho. Por padrão, os nós usam a conta de serviço padrão do Compute Engine. Configure uma conta de serviço com privilégios mínimos para os nós usarem em vez da conta de serviço padrão do Compute Engine. Em seguida, anexe essa conta de serviço aos nós, para que um invasor não possa contornar as proteções de metadados do GKE usando a API Compute Engine para acessar as instâncias de VM subjacentes diretamente.

Para mais informações, consulte Usar as contas de serviço do nó com privilégio mínimo.

Para criar uma conta de serviço de nó com privilégios mínimos, execute as seguintes etapas:

  1. Crie uma nova conta de serviço do Identity and Access Management (IAM) e salve o endereço de e-mail em uma variável de ambiente:

    gcloud iam service-accounts create NODE_SA_NAME \
        --display-name="DISPLAY_NAME"
    export NODE_SA_EMAIL=$(gcloud iam service-accounts list --format='value(email)' \
        --filter='displayName:DISPLAY_NAME')
    

    Substitua:

    • NODE_SA_NAME: o nome da nova conta de serviço do nó.
    • DISPLAY_NAME: o nome de exibição da nova conta de serviço.

    O endereço de e-mail da conta de serviço do nó tem o formato NODE_SA_NAME@PROJECT_ID.iam.gserviceaccount.com.

  2. Configure a conta de serviço com os papéis e as permissões mínimas para executar os nós do GKE:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$NODE_SA_EMAIL \
        --role=roles/monitoring.metricWriter
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$NODE_SA_EMAIL \
        --role=roles/monitoring.viewer
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$NODE_SA_EMAIL \
        --role=roles/logging.logWriter
    

    Substitua PROJECT_ID pelo ID do projeto do Google Cloud.

    Além disso, se o cluster extrai imagens particulares do Artifact Registry, adicione o papel roles/artifactregistry.reader:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$NODE_SA_EMAIL \
        --role=roles/artifactregistry.reader
    

Ocultação de metadados

A ocultação de metadados do GKE protege alguns metadados do sistema potencialmente confidenciais das cargas de trabalho do usuário em execução no cluster.

É possível ativar a ocultação de metadados para impedir que os pods de usuário acessem determinados metadados de VM nos nós do cluster, como credenciais do kubelet e informações de instância de VM. A ocultação de metadados protege especificamente o acesso a kube-env, que contém credenciais do Kubelet, e ao token de identidade da instância da VM.

Os firewalls de ocultação de metadados transitam de pods de usuários (não executados em HostNetwork) para o servidor de metadados do cluster, permitindo apenas consultas seguras. O firewall impede que pods de usuário utilizem credenciais do Kubelet para ataques de escalonamento de privilégios ou utilizem a identidade de VM para ataques de escalonamento de instância.

Só é possível ativar a ocultação de metadados ao criar um novo cluster ou ao adicionar um novo pool de nós a um cluster existente.

Limitações

  • A ocultação de metadados protege apenas o acesso a kube-env e o token de identidade da instância do nó.
  • A ocultação de metadados não restringe o acesso à conta de serviço do nó.
  • A ocultação de metadados não restringe o acesso a outros metadados de instância relacionados.
  • A ocultação de metadados não restringe o acesso a outras APIs de metadados legadas.
  • A ocultação de metadados não restringe o tráfego dos pods em execução na rede do host (hostNetwork: true na especificação do pod).

Como criar um novo cluster ou pool de nós com ocultação de metadados

Depois de criar uma conta de serviço, use a Google Cloud CLI para criar um novo cluster ou pool de nós com a ocultação de metadados ativada.

Criar um novo cluster

Para criar um cluster com a ocultação de metadados ativada, execute o seguinte comando:

gcloud beta container clusters create CLUSTER_NAME \
  --workload-metadata-from-node=SECURE \
  --service-account=$NODE_SA_EMAIL

Substitua CLUSTER_NAME pelo nome do novo bucket.

A sinalização --workload-metadata-from-node usa estes valores:

  • SECURE: ativar a ocultação de metadados.
  • EXPOSED ou UNSPECIFIED: desativa a ocultação de metadados.

Criar um novo pool de nós

Para criar um pool de nós com a ocultação de metadados ativada, execute o seguinte comando:

gcloud beta container node-pools create NODE_POOL_NAME \
  --cluster=CLUSTER_NAME \
  --workload-metadata-from-node=SECURE \
  --service-account=$NODE_SA_EMAIL

Substitua NODE_POOL_NAME pelo nome do novo pool de nós.

Verificar metadados do token de identidade ocultos da carga de trabalho do cluster

Ao ocultar metadados, não é possível solicitar uma assinatura pelo token de identidade de instância do nó. Para verificar se as solicitações informam explicitamente os usuários de metadados ocultos, faça o seguinte:

  1. Abra uma sessão de shell em um novo pod:

    kubectl run metadata-concealment -it --image=google/cloud-sdk:slim -- /bin/bash
    
  2. No pod, tente conseguir um endpoint oculto:

    curl -H "Metadata-Flavor: Google" \
    'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://www.example.com'
    

    O resultado será assim:

    This metadata endpoint is concealed.
    

Desativação e transição de APIs de metadados legados

O uso dos endpoints v0.1 e v1beta1 do servidor de metadados do Compute Engine foi suspenso e encerrado em 30 de setembro de 2020.

Para a programação de desativação, consulte Suspensão de uso dos endpoints dos servidores de metadados v0.1 e v1beta1.

A seguir