Use o Workload Identity com Google Cloud

A identidade de carga de trabalho permite-lhe atribuir identidades distintas e detalhadas, bem como autorização, a cada aplicação no seu cluster. O Workload Identity é a forma recomendada para as aplicações em execução no GKE no AWS acederem aos serviçosGoogle Cloud . Para mais informações, consulte o artigo Identidade da carga de trabalho.

Este tópico descreve como usar o Workload Identity para se ligar aos serviçosGoogle Cloud a partir das suas cargas de trabalho.

Configure uma Google Cloud conta de serviço

Nesta secção, cria uma Google Cloud conta de serviço (GSA) com autorizações limitadas para aceder aos Google Cloud serviços.

Obtenha o Workload Identity Pool e o fornecedor

Para configurar a identidade da carga de trabalho, tem de ter os valores do URI do fornecedor de identidade do cluster e dos Workload Identity Pools.

  1. Determine o Workload Identity Pool para o seu cluster:

    Todos os clusters do GKE têm um fornecedor de identidade criado no Workload Identity Pool PROJECT_ID.svc.id.goog. Para obter o nome do conjunto de identidades do cluster, use a Google Cloud CLI:

    gcloud container aws clusters describe CLUSTER_NAME \
        --location=GOOGLE_CLOUD_LOCATION \
        --format='value(workloadIdentityConfig.workloadPool)'
    

    Substitua o seguinte:

    • CLUSTER_NAME com o nome do seu cluster.
    • GOOGLE_CLOUD_LOCATION com o nome da Google Cloud localização que gere o seu cluster

    O resultado inclui o nome do pool de identidades do cluster. Guarde este valor. Vai precisar dele mais tarde.

  2. Determine o Fornecedor de identidade para o seu cluster.

    Para encontrar o nome do fornecedor de identidade do seu cluster, use a CLI Google Cloud:

    gcloud container aws clusters describe CLUSTER_NAME \
        --location=GOOGLE_CLOUD_LOCATION \
        --format='value(workloadIdentityConfig.identityProvider)'
    

    Substitua o seguinte:

    • CLUSTER_NAME
    • GOOGLE_CLOUD_LOCATION

    O resultado inclui o nome do fornecedor de identidade do seu cluster. Guarde este valor. Vai precisar dele mais tarde.

Crie uma Google Cloud conta de serviço

Para criar uma Google Cloud conta de serviço (GSA), conceder-lhe autorizações e adicionar uma associação de política de IAM à GSA, siga estes passos:

  1. Crie o GSA com a CLI Google Cloud:

    gcloud iam service-accounts create GSA_NAME --project=PROJECT_ID
    

    Substitua o seguinte:

    • GSA_NAME: o nome do GSA para a sua aplicação.
    • PROJECT_ID: o projeto da Google Cloud GSA.
  2. Adicione uma associação do IAM para permitir que o GSA aceda aos serviços.

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role IAM_ROLE
    

    Substitua o seguinte:

    • GSA_NAME: o nome do GSA para a sua aplicação
    • PROJECT_ID: o ID do projeto para o GSA
    • IAM_ROLE: a função de IAM a conceder à GSA

    Neste exemplo, vamos usar a função roles/compute.viewer, que permite o acesso só de leitura aos serviços de computação:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/compute.viewer
    
  3. Conceda autorizações à sua conta de serviço do Kubernetes (KSA) para se fazer passar pela GSA. Para o fazer, adicione uma associação de políticas IAM com a função roles/iam.workloadIdentityUser:

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

    Substitua o seguinte:

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE: o namespace do Kubernetes para a aplicação
    • KSA_NAME: a KSA a usar para a aplicação

Implemente uma aplicação de exemplo

Nesta secção, implementa uma aplicação de exemplo que acede à API Compute Engine. Para usar este exemplo, a sua conta de serviço tem de ter a função de roles/compute.viewerIAM concedida. Para implementar a aplicação de exemplo, siga estes passos:

  1. Copie o seguinte manifesto para um ficheiro com o nome workload-identity-sample.yaml:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: KSA_NAME
      namespace: NAMESPACE
    automountServiceAccountToken: false
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: cloud-sdk-config
      namespace: NAMESPACE
    data:
      config: |
        {
          "type": "external_account",
          "audience": "identitynamespace:PROJECT_ID.svc.id.goog:IDENTITY_PROVIDER",
          "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/GSA_NAME@PROJECT_ID.iam.gserviceaccount.com:generateAccessToken",
          "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
          "token_url": "https://sts.googleapis.com/v1/token",
          "credential_source": {
            "file": "/var/run/secrets/tokens/gcp-ksa/token"
          }
        }
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: cloud-sdk-example
      namespace: NAMESPACE
    spec:
      serviceAccount: KSA_NAME
      containers:
      - name: cloud-sdk
        image: gcr.io/google.com/cloudsdktool/cloud-sdk:latest
        command:
        - /bin/bash
        - -c
        - 'set -eu -o pipefail; while true; do gcloud compute zones list --filter="name ~ us-central1-*"; sleep 5; done'
        env:
        - name: CLOUDSDK_AUTH_CREDENTIAL_FILE_OVERRIDE
          value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json
        - name: CLOUDSDK_CORE_PROJECT
          value: PROJECT_ID
        volumeMounts:
        - name: gcp-ksa
          mountPath: /var/run/secrets/tokens/gcp-ksa
          readOnly: true
      volumes:
      - name: gcp-ksa
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              audience: PROJECT_ID.svc.id.goog
              expirationSeconds: 86400
              path: token
          - configMap:
              name: cloud-sdk-config
              optional: false
              items:
              - key: config
                path: google-application-credentials.json
    

    Substitua o seguinte:

    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
    • GSA_NAME
    • IDENTITY_PROVIDER com o nome do Fornecedor de identidade do seu cluster.
  2. Aplique o manifesto ao cluster

    kubectl apply -f workload-identity-sample.yaml
    
  3. Verifique se a aplicação de exemplo está a funcionar e consulte os registos do pod:

    kubectl logs -f cloud-sdk-example -n NAMESPACE
    

    Substitua o seguinte:

    • NAMESPACE

    Se o Pod conseguir aceder à API Google Cloud Compute, verá um resultado semelhante ao seguinte:

    NAME           REGION       STATUS  NEXT_MAINTENANCE  TURNDOWN_DATE
    us-central1-c  us-central1  UP
    us-central1-a  us-central1  UP
    us-central1-f  us-central1  UP
    us-central1-b  us-central1  UP
    

Limpar

  1. Elimine a aplicação de exemplo

    kubectl delete -f manifest.yaml
    
  2. Remova a associação da política IAM da conta de serviço da Google Cloud

    gcloud iam service-accounts remove-iam-policy-binding \
        GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --member serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE//KSA_NAME] \
        roles/iam.workloadIdentityUser
    

    Substitua o seguinte:

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
  3. Remova a vinculação da política IAM do projeto

    gcloud projects remove-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/compute.viewer
    

    Substitua o seguinte:

    • GSA_NAME
    • PROJECT_ID
  4. Elimine a conta de serviço do Google Cloud

    gcloud iam service-accounts delete \
       GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
    

    Substitua o seguinte:

    • GSA_NAME
    • PROJECT_ID

O que se segue?