Como proteger metadados de cluster


Visão geral

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, veja se você realizou as seguintes tarefas:

Defina as configurações padrão da gcloud usando um dos métodos a seguir:

  • Use gcloud init se quiser orientações para definir os padrões.
  • Use gcloud config para definir individualmente a região, a zona e o ID do projeto.

Como usar o gcloud init

Se você receber o erro One of [--zone, --region] must be supplied: Please specify location, conclua esta seção.

  1. Execute gcloud init e siga as instruções:

    gcloud init

    Se você estiver usando SSH em um servidor remoto, utilize a sinalização --console-only para impedir que o comando inicie um navegador:

    gcloud init --console-only
  2. Siga as instruções para autorizar a gcloud a usar sua conta do Google Cloud.
  3. Crie uma nova configuração ou selecione uma atual.
  4. Escolha um projeto do Google Cloud.
  5. Escolha uma zona padrão do Compute Engine para clusters zonais ou uma região para clusters regionais ou de Autopilot.

Como usar o gcloud config

  • Defina o ID do projeto padrão:
    gcloud config set project PROJECT_ID
  • Se você estiver trabalhando com clusters zonais, defina a zona do Compute padrão:
    gcloud config set compute/zone COMPUTE_ZONE
  • Se você estiver trabalhando com clusters de Autopilot ou regionais, defina a região do Compute padrão:
    gcloud config set compute/region COMPUTE_REGION
  • Atualize gcloud para a versão mais recente:
    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.

No Kubernetes v1.9.3 e posterior, é possível ativar a ocultação de metadados para impedir que 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.

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 ferramenta de linha de comando gcloud para gerar um novo cluster com a ocultação de metadados ativada.

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.

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, execute um comando curl a partir de um pod:

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

A saída 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