Usar a Workload Identity com Google Cloud

Este guia descreve como configurar o Workload Identity no GKE on AWS para controlar o acesso da carga de trabalho aos recursos da GCP. Inclui um exemplo de como aceder aos recursos do cluster através da identidade. Google Cloud

Para obter informações sobre a utilização de identidades de cargas de trabalho com contas do AWS IAM para controlar o acesso a recursos da AWS, consulte o artigo Utilizar a identidade de cargas de trabalho com a AWS.

Vista geral

O Workload Identity usa Google Cloud autorizações de IAM para controlar o acesso aos Google Cloud recursos. Com o Workload Identity, pode atribuir diferentes funções da IAM a cada carga de trabalho. Este controlo detalhado das autorizações permite-lhe seguir o princípio do privilégio mínimo. Sem a Workload Identity, tem de atribuir funções do IAM aos nós do GKE no AWS, concedendo a todas as cargas de trabalho nesses nós as mesmas autorizações que o próprio nó. Google Cloud

Pré-requisitos

  • Crie um cluster de utilizadores com a versão v1.20 ou posterior do Kubernetes.

  • Se a sua VPC da AWS usar um proxy ou uma firewall, adicione os seguintes URLs à lista de autorizações:

    • securetoken.googleapis.com
    • iamcredentials.googleapis.com
    • sts.googleapis.com
  • No diretório do anthos-aws, use anthos-gke para mudar o contexto para o cluster de utilizadores.

    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    Substitua CLUSTER_NAME pelo nome do cluster de utilizadores.

  • Ative os quatro novos serviços necessários para esta funcionalidade com os seguintes comandos:

    gcloud services enable securetoken.googleapis.com
    gcloud services enable iam.googleapis.com
    gcloud services enable iamcredentials.googleapis.com
    gcloud services enable sts.googleapis.com
    

Componha os nomes do Workload Identity Pool e do fornecedor

Cada Google Cloud projeto cria automaticamente um conjunto de identidade de carga de trabalho gerido com um nome no formato PROJECT_ID.svc.id.goog. Da mesma forma, Google Cloud cria um fornecedor de identidade cujo nome segue o padrão https://gkehub.googleapis.com/projects/PROJECT_ID/locations/global/memberships/MEMBERSHIP_ID. Para mais informações sobre Workload Identity Pools, consulte o artigo Componentes ativados para a frota. Componha estes nomes a partir do ID do projeto e do ID de membro, conforme mostrado aqui:

export PROJECT_ID=USER_PROJECT_NAME
export CLUSTER_MEMBERSHIP_ID=PROJECT_MEMBERSHIP_NAME
export IDP="https://gkehub.googleapis.com/projects/${PROJECT_ID}/locations/global/memberships/${CLUSTER_MEMBERSHIP_ID}"
export WI_POOL="${PROJECT_ID}.svc.id.goog"

Substitua o seguinte:

  • USER_PROJECT_NAME com o nome do projeto do utilizador escolhido pelo utilizador
  • PROJECT_MEMBERSHIP_NAME com o nome de membro do cluster

Crie uma associação de políticas IAM

Crie uma associação de políticas para permitir que uma conta de serviço do Kubernetes (KSA) se faça passar por uma conta de serviço (GSA). Google Cloud

export K8S_NAMESPACE=KUBERNETES_NAMESPACE
export KSA_NAME=KUBERNETES_SA_NAME
export GCP_SA_EMAIL="WORKLOAD_IDENTITY_TEST@${PROJECT_ID}.iam.gserviceaccount.com"
gcloud iam service-accounts add-iam-policy-binding \
  --role roles/iam.workloadIdentityUser \
  --member "serviceAccount:$WI_POOL[$K8S_NAMESPACE/$KSA_NAME]" $GCP_SA_EMAIL

Substitua o seguinte:

  • KUBERNETES_NAMESPACE com o espaço de nomes do Kubernetes onde a conta de serviço do Kubernetes está definida
  • WORKLOAD_IDENTITY_TEST com um nome de carga de trabalho à sua escolha
  • KUBERNETES_SA_NAME com o nome da conta de serviço do Kubernetes anexada à aplicação

Crie um mapa de configuração do SDK

Execute o script de shell abaixo para armazenar os detalhes da identidade da carga de trabalho num ConfigMap. Quando um pod monta o ConfigMap, a CLI do Google Cloud pode ler os detalhes da identidade da carga de trabalho.

cat << EOF > cfmap.yaml
kind: ConfigMap
apiVersion: v1
metadata:
  namespace: ${K8S_NAMESPACE}
  name: my-cloudsdk-config
data:
  config: |
    {
      "type": "external_account",
      "audience": "identitynamespace:${WI_POOL}:${IDP}",
      "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/${GCP_SA_EMAIL}: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"
      }
    }
EOF

env HTTPS_PROXY=http://localhost:8118 \
  kubectl apply -f cfmap.yaml

Crie uma conta de serviço do Kubernetes

Crie um KSA no cluster de utilizadores com o mesmo nome e espaço de nomes que foram usados na associação do IAM.

cat << EOF > k8s-service-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: ${KSA_NAME}
  namespace: ${K8S_NAMESPACE}
EOF

env HTTPS_PROXY=http://localhost:8118 \
  kubectl apply -f k8s-service-account.yaml

Crie um grupo

Em seguida, crie um Pod com a projeção do token da conta de serviço e o ConfigMap criado acima.

  1. Crie o ficheiro YAML do pod de amostra.

    cat << EOF > sample-pod.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: sample-pod
      namespace: ${K8S_NAMESPACE}
    spec:
      serviceAccountName: ${KSA_NAME}
      containers:
      - command:
        - /bin/bash
        - -c
        - while :; do echo '.'; sleep 500 ; done
        image: google/cloud-sdk
        name: cloud-sdk
        env:
          - name: GOOGLE_APPLICATION_CREDENTIALS
            value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json
        volumeMounts:
        - name: gcp-ksa
          mountPath: /var/run/secrets/tokens/gcp-ksa
          readOnly: true
      volumes:
      - name: gcp-ksa
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              path: token
              audience: ${WI_POOL}
              expirationSeconds: 172800
          - configMap:
              name: my-cloudsdk-config
              optional: false
              items:
               - key: "config"
                 path: "google-application-credentials.json"
    EOF
    
  2. Aplique o YAML do pod ao seu cluster.

    env HTTPS_PROXY=http://localhost:8118 \
     kubectl apply -f sample-pod.yaml
    

Usar o Google Cloud Workload Identity

Versões do SDK suportadas

Para usar a Google Cloud funcionalidade de identidade da carga de trabalho, tem de criar o seu código com um SDK que a suporte. Para ver uma lista das versões do SDK que suportam o Google Cloud Workload Identity, consulte o artigo Workload Identity da frota.

Exemplo de código que usa a Workload Identity

Esta secção inclui código Python de exemplo que usa a identidade da carga de trabalho. Google Cloud A conta de serviço neste exemplo usa uma identidade com privilégios de "Administrador do Cloud Storage" para listar todos os contentores do Cloud Storage do projeto Google Cloud .

  1. Execute um shell no agrupamento.

    env HTTPS_PROXY=http://localhost:8118 \
    kubectl exec -it sample-pod -- bash
    
  2. Execute um script para listar os contentores de armazenamento do projeto.

    # execute these commands inside the Pod
    pip install --upgrade google-cloud-storage
    
    cat << EOF > sample-list-bucket.py
    from google.cloud import storage
    storage_client = storage.Client()
    buckets = storage_client.list_buckets()
    
    for bucket in buckets:
      print(bucket.name)
    EOF
    
    env GOOGLE_CLOUD_PROJECT=USER_PROJECT_NAME \
     python3 sample-list-bucket.py
    

    Substitua USER_PROJECT_NAME pelo seu Google Cloud projeto.

Para mais informações