Autenticação de cluster da Identidade da carga de trabalho

Este documento descreve como configurar e usar a autenticação de cluster da Identidade da carga de trabalho para o Google Distributed Cloud connected. Em vez de chaves de conta de serviço, a autenticação de cluster da Identidade da carga de trabalho usa tokens de curta duração e a federação de identidade da carga de trabalho para permitir que as cargas de trabalho acessem Google Cloud recursos com segurança. As credenciais de curta duração são tokens de acesso OAuth 2.0. Por padrão, os tokens de acesso expiram após 1 hora.

Com a autenticação de cluster da Identidade da carga de trabalho, as cargas de trabalho podem usar a própria identidade do Kubernetes para acessar Google Cloud recursos diretamente ou representar uma conta de serviço do Google.

A autenticação de cluster da Identidade da carga de trabalho oferece dois benefícios principais em relação ao uso de chaves de conta de serviço:

  • Segurança aprimorada: as chaves de conta de serviço são um risco de segurança quando não são gerenciadas corretamente. Os tokens OAuth 2.0 e a federação de identidade da carga de trabalho são consideradas as práticas recomendadas para chaves de conta de serviço. Para mais informações sobre tokens de conta de serviço, consulte Credenciais de conta de serviço de curta duração Para mais informações sobre a federação de identidade da carga de trabalho, consulte Federação de identidade da carga de trabalho.

  • Menor manutenção: as chaves de conta de serviço exigem mais manutenção. A rotação e a proteção regulares dessas chaves podem criar um fardo administrativo.

Esta página é destinada a administradores, arquitetos e operadores que configuram, monitoram e gerenciam o ciclo de vida da infraestrutura de tecnologia subjacente. Para saber mais sobre papéis comuns e tarefas de exemplo referenciados no Google Cloud conteúdo, consulte Papéis e tarefas de usuário comuns do GKE e tarefas.

Gerenciamento de clusters

Este guia aborda a federação de identidade da carga de trabalho para seus aplicativos. A federação de identidade da carga de trabalho no nível do cluster é gerenciada automaticamente para clusters conectados do Distributed Cloud.

Os clusters conectados do Distributed Cloud são criados e gerenciados pelo Google pela API Distributed Cloud Edge Container, usando o gcloud edge-cloud container clusters create comando ou no Google Cloud console.

Os clusters conectados do Distributed Cloud são registrados automaticamente em uma frota no projeto em que foram criados. Não é necessário fazer nenhum registro manual de frota. O pool de federação de identidade da carga de trabalho fica disponível automaticamente e segue o formato PROJECT_ID.svc.id.goog.

Antes de começar

  • Antes de configurar a federação de identidade da carga de trabalho, verifique se as seguintes APIs no seu Google Cloud projeto estão ativadas. Para informações sobre como ativar as APIs, consulte Como ativar serviços:

    • iam.googleapis.com
    • sts.googleapis.com
    • iamcredentials.googleapis.com
    • gkehub.googleapis.com
  • Verifique se você tem as seguintes ferramentas de linha de comando instaladas:

    • A versão mais recente da Google Cloud CLI, que inclui gcloud, a ferramenta de linha de comando para interagir com Google Cloud.
    • kubectl

    Se você estiver usando o Cloud Shell como ambiente shell para interagir com Google Cloud, essas ferramentas estarão instaladas.

  • Verifique se você inicializou a CLI gcloud para usar com seu projeto.

  • Verifique se você tem os seguintes papéis do IAM no projeto. Esses papéis são necessários para realizar a configuração:

    • Proprietário (roles/owner) ou
    • Administrador de segurança do IAM (roles/iam.securityAdmin) e Administrador da conta de serviço (roles/iam.serviceAccountAdmin)

Nas seções a seguir, você cria contas de serviço e concede os papéis necessários para a autenticação de cluster da Identidade da carga de trabalho.

Recomendado: acesso direto a recursos da federação de identidade da carga de trabalho

Com o acesso direto a recursos da federação de identidade da carga de trabalho, você usa a federação de identidade da carga de trabalho para conceder um papel do IAM a uma ServiceAccount do Kubernetes para que ela possa acessar Google Cloud recursos diretamente.

Identidade Finalidade Papéis
Conta de serviço do Kubernetes A identidade do Kubernetes que sua carga de trabalho usa. Conceda a essa identidade os papéis necessários para acessar os recursos necessários. Google Cloud Este exemplo concede o papel roles/storage.objectViewer e o roles/logging.admin papel. roles/storage.objectViewer
roles/logging.admin

Alternativa: identidade temporária de conta de serviço do IAM

Como alternativa, é possível configurar a ServiceAccount do Kubernetes para usar a identidade temporária de conta de serviço do IAM.

Conta de serviço Finalidade Papéis
Conta de serviço do Google A conta de serviço do Google que sua carga de trabalho no cluster representa. Conceda a essa conta de serviço os papéis necessários para acessar os recursos necessários Google Cloud. Depende dos recursos que estão sendo acessados.
Conta de serviço do Kubernetes Conceda a essa identidade a capacidade de representar a conta de serviço do Google. Essa concessão usa o papel roles/iam.workloadIdentityUser. roles/iam.workloadIdentityUser

Configurar contas de serviço

As seções a seguir contêm instruções para criar a ServiceAccount do Kubernetes necessária e conceder a ela os papéis necessários para a autenticação de cluster da Identidade da carga de trabalho usando o acesso direto a recursos da federação de identidade da carga de trabalho ou a representação de conta de serviço do Google.

Criar uma ServiceAccount do Kubernetes

No cluster, use o comando kubectl create para criar uma ServiceAccount do Kubernetes para seus pods. Também é possível usar qualquer ServiceAccount atual, incluindo a ServiceAccount padrão no namespace.

kubectl create serviceaccount KSA_NAME --namespace NAMESPACE

Substitua os seguintes valores:

  • KSA_NAME: um nome para sua ServiceAccount do Kubernetes

  • NAMESPACE: o namespace do cluster

Usar a federação de identidade da carga de trabalho para conceder acesso direto a recursos

Para conceder papéis do Identity and Access Management diretamente à identidade da ServiceAccount do Kubernetes, siga estas etapas.

  1. Use o comando gcloud projects describe para encontrar o número do projeto:

    gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    

    Substitua PROJECT_ID pelo ID do seu projeto.

  2. Use o comando gcloud projects add-iam-policy-binding para conceder os papéis necessários ao principal da identidade do Kubernetes:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="principal://iam.gserviceaccount.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
        --role=roles/storage.objectViewer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="principal://iam.gserviceaccount.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
        --role=roles/logging.admin
    

    Substitua os seguintes valores:

    • PROJECT_NUMBER: o número do projeto
    • NAMESPACE: o namespace do cluster
    • KSA_NAME: o nome da ServiceAccount do Kubernetes

Alternativa: usar a identidade temporária de conta de serviço do IAM para conceder acesso

Se você preferir que as cargas de trabalho representem uma conta de serviço do Google, siga estas etapas.

  1. Use o comando gcloud iam service-accounts create para criar uma conta de serviço do Google:

    gcloud iam service-accounts create my-app-sa \
        --project=PROJECT_ID
    

    Substitua PROJECT_ID pelo ID do seu projeto.

  2. Use o comando gcloud projects add-iam-policy-binding para conceder à conta de serviço do Google os papéis necessários:

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/storage.objectViewer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/logging.admin
    
  3. Use o comando gcloud iam service-accounts add-iam-policy-binding para conceder à ServiceAccount do Kubernetes a capacidade de representar a conta de serviço do Google:

    gcloud iam service-accounts add-iam-policy-binding my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/iam.workloadIdentityUser \
        --member="serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"
    

    Substitua os seguintes valores:

    • NAMESPACE: o namespace do cluster
    • KSA_NAME: o nome da ServiceAccount do Kubernetes
  4. Use o kubectl annotate comando para anotar a ServiceAccount do Kubernetes e vinculá-la à conta de serviço do Google:

    kubectl annotate serviceaccount \
        --namespace NAMESPACE KSA_NAME \
        iam.gke.io/gcp-service-account=my-app-sa@PROJECT_ID.iam.gserviceaccount.com
    

Configurar a carga de trabalho

Atualize a especificação do pod para usar a ServiceAccount do Kubernetes e montar o volume de token projetado. Como os clusters conectados do Distributed Cloud estão fora do Google CloudGoogle Cloud, também é necessário fornecer um arquivo de configuração de credenciais e definir a GOOGLE_APPLICATION_CREDENTIALS variável de ambiente `GOOGLE_APPLICATION_CREDENTIALS` para apontar para esse arquivo. Google Cloud As bibliotecas de cliente no pod usam essas credenciais para trocar o token do Kubernetes por um Google Cloud token de acesso pela API Security Token Service.

  1. Gere o arquivo credential-configuration.json. Escolha o comando com base no uso do acesso direto a recursos da federação de identidade da carga de trabalho ou da identidade temporária de conta de serviço do IAM.

    Acesso direto a recursos da federação de identidade da carga de trabalho

    Use o comando gcloud iam workload-identity-pools create-cred-config:

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/providers/attestor \
        --credential-source-file=/var/run/secrets/tokens/gcp-ksa/token \
        --credential-source-type=text \
        --output-file=credential-configuration.json
    

    Usar a identidade temporária de conta de serviço do IAM para conceder acesso

    Use o comando gcloud iam workload-identity-pools create-cred-config:

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/providers/attestor \
        --service-account=my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/secrets/tokens/gcp-ksa/token \
        --credential-source-type=text \
        --output-file=credential-configuration.json
    

    Substitua PROJECT_NUMBER pelo Google Cloud número do projeto. Para encontrar o número do projeto, execute gcloud projects describe PROJECT_ID --format="value(projectNumber)".

  2. Use o kubectl create configmap comando para criar um ConfigMap do Kubernetes para armazenar o arquivo de configuração:

    kubectl create configmap CREDENTIAL_CONFIG_MAP \
        --namespace NAMESPACE \
        --from-file=credential-configuration.json
    

    Substitua os seguintes valores:

    • CREDENTIAL_CONFIG_MAP: um nome para seu ConfigMap, que contém o arquivo de configuração de credenciais

    • NAMESPACE: o namespace do cluster

  3. Atualize a especificação do pod com o seguinte conteúdo YAML:

    spec:
      serviceAccountName: KSA_NAME
      containers:
      - name: MY_CONTAINER
        image: MY_IMAGE
        env:
        - name: GOOGLE_APPLICATION_CREDENTIALS
          value: /var/run/secrets/tokens/gcp-creds/credential-configuration.json
        volumeMounts:
        - mountPath: /var/run/secrets/tokens/gcp-ksa
          name: gcp-ksa
        - mountPath: /var/run/secrets/tokens/gcp-creds
          name: gcp-creds
          readOnly: true
      volumes:
      - name: gcp-ksa
        projected:
          defaultMode: 0420
          sources:
          - serviceAccountToken:
              path: token
              audience: PROJECT_ID.svc.id.goog
              expirationSeconds: 3600
      - name: gcp-creds
        configMap:
          name: CREDENTIAL_CONFIG_MAP
    

    Substitua os seguintes valores:

    • KSA_NAME: um nome para sua ServiceAccount do Kubernetes

    • MY_CONTAINER: o nome do contêiner

    • MY_IMAGE: o nome da imagem

Limitações

Os seguintes recursos e capacidades não são compatíveis quando você usa a federação de identidade da carga de trabalho para o Distributed Cloud connected:

  • Usar um servidor proxy para o processo de troca de tokens

Para informações sobre como usar a federação de identidade da carga de trabalho com o VPC Service Controls, consulte Configurar a integração do VPC Service Controls.

A seguir