Utilizzo di Workload Identity con Google Cloud

Questa guida descrive come configurare l'identità del workload su GKE su AWS per controllare l'accesso dei workload alle risorse Google Cloud. Include un esempio di come accedere alle risorse Google Cloud del cluster utilizzando l'identità.

Per informazioni sull'utilizzo delle identità per i workload con gli account AWS IAM per controllare l'accesso alle risorse AWS, consulta Utilizzo di Workload Identity con AWS.

Panoramica

Workload Identity utilizza le Google Cloud autorizzazioni IAM per controllare l'accesso alle risorseGoogle Cloud . Con Workload Identity, puoi assegnare diversi ruoli IAM a ogni carico di lavoro. Questo controllo granulare delle autorizzazioni ti consente di seguire il principio del privilegio minimo. Senza l'identità del carico di lavoro, devi assegnare Google Cloud ruoli IAM al tuo GKE sui nodi AWS, concedendo a tutti i workload su questi nodi le stesse autorizzazioni del nodo stesso.

Prerequisiti

  • Crea un cluster utente con la versione Kubernetes 1.20 o successive.

  • Se il tuo VPC AWS utilizza un proxy o un firewall, inserisci nella lista consentita i seguenti URL:

    • securetoken.googleapis.com
    • iamcredentials.googleapis.com
    • sts.googleapis.com
  • Dalla directory anthos-aws, utilizza anthos-gke per cambiare contesto e passare al cluster di utenti.

    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    Sostituisci CLUSTER_NAME con il nome del cluster di utenti.

  • Attiva i quattro nuovi servizi richiesti per questa funzionalità con i seguenti comandi:

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

Componi i nomi del pool e del provider WI

Ogni Google Cloud progetto crea automaticamente un pool di identità per i carichi di lavoro gestiti con un nome nella forma PROJECT_ID.svc.id.goog. Analogamente, Google Cloud crea un provider di identità il cui nome segue il pattern https://gkehub.googleapis.com/projects/PROJECT_ID/locations/global/memberships/MEMBERSHIP_ID. Per ulteriori informazioni sui pool di identità del workload, consulta Componenti abilitati per il parco risorse. Componi questi nomi dall'ID progetto e dall'ID appartenenza, come mostrato di seguito:

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"

Sostituisci quanto segue:

  • USER_PROJECT_NAME con il nome del progetto scelto dall'utente
  • PROJECT_MEMBERSHIP_NAME con il nome dell'appartenenza al cluster

Crea un'associazione di criteri IAM

Crea un'associazione dei criteri per consentire a un account di servizio Kubernetes (KSA) di assumere il ruolo di un Google Cloud account di servizio (GSA).

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

Sostituisci quanto segue:

  • KUBERNETES_NAMESPACE con lo spazio dei nomi Kubernetes in cui è definito l'account di servizio Kubernetes
  • WORKLOAD_IDENTITY_TEST con un nome del carico di lavoro a tua scelta
  • KUBERNETES_SA_NAME con il nome dell'account di servizio Kubernetes associato all'applicazione

Crea una mappa di configurazione dell'SDK

Esegui lo script shell riportato di seguito per archiviare i dettagli dell'identità del workload in un ConfigMap. Quando un pod monta il ConfigMap, l'Google Cloud CLI può leggere i dettagli dell'identità del carico di lavoro.

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

Crea un account di servizio Kubernetes

Crea un KSA nel cluster di utenti con lo stesso nome e spazio dei nomi utilizzati nel binding 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

Creare un pod

Successivamente, crea un pod con la proiezione del token dell'account di servizio e il ConfigMap creati sopra.

  1. Crea il file YAML del pod di esempio.

    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. Applica il file YAML del pod al tuo cluster.

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

Utilizzo dell' Google Cloud identità del carico di lavoro

Versioni SDK supportate

Per utilizzare la Google Cloud funzionalità Workload Identity, devi compilare il codice con un SDK che la supporti. Per un elenco delle versioni dell'SDK che supportano Google Cloud Workload Identity, consulta Workload Identity del parco risorse.

Codice di esempio che utilizza l'identità per i carichi di lavoro

Questa sezione include codice Python di esempio che utilizza l' Google Cloud identità del carico di lavoro. L'account di servizio in questo esempio utilizza un'identità con i privilegi "Amministratore Cloud Storage" per elencare tutti i bucket Cloud Storage del progetto Google Cloud .

  1. Esegui una shell all'interno del pod.

    env HTTPS_PROXY=http://localhost:8118 \
    kubectl exec -it sample-pod -- bash
    
  2. Esegui uno script per elencare i bucket di archiviazione del progetto.

    # 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
    

    Sostituisci USER_PROJECT_NAME con il tuo Google Cloud progetto.

Per ulteriori informazioni