Questa guida descrive come configurare Workload Identity su GKE su AWS per controllare l'accesso dei workload alle risorse Google Cloud. Include un esempio di come accedere alle Google Cloud risorse dal cluster utilizzando l'identità.
Per informazioni sull'utilizzo delle identità dei 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 autorizzazioni Google Cloud IAM per controllare l'accesso alle Google Cloud risorse. Con Workload Identity, puoi assegnare ruoli IAM diversi a ogni workload. Questo controllo granulare delle autorizzazioni ti consente di seguire il principio del privilegio minimo. Senza Workload Identity, devi assegnare Google Cloud ruoli IAM ai nodi GKE su AWS, concedendo a tutti i workload su questi nodi le stesse autorizzazioni del nodo stesso.
Prerequisiti
Crea un cluster utente con la versione di Kubernetes v1.20 o successive.
Se il VPC AWS utilizza un proxy o un firewall, aggiungi all'elenco consentiti i seguenti URL:
securetoken.googleapis.comiamcredentials.googleapis.comsts.googleapis.com
Dalla directory
anthos-aws, utilizzaanthos-gkeper passare al contesto del cluster utente. Sostituisci CLUSTER_NAME con il nome del cluster utente.cd anthos-aws env HTTPS_PROXY=http://localhost:8118 \ anthos-gke aws clusters get-credentials CLUSTER_NAME
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à dei workload
gestito con un nome nel formato PROJECT_ID.svc.id.goog. Allo stesso modo,
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à dei workload, consulta
Componenti abilitati per il parco risorse.
Componi questi nomi dall'ID progetto e dall'ID appartenenza come mostrato qui:
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 utente scelto dall'utente
- PROJECT_MEMBERSHIP_NAME con il nome dell'appartenenza del cluster
Crea un'associazione di criteri IAM
Crea un'associazione di criteri per consentire a un account di servizio Kubernetes (KSA) di rappresentare un Google Cloud service account (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 il account di servizio Kubernetes
- WORKLOAD_IDENTITY_TEST con un nome di workload a tua scelta
- KUBERNETES_SA_NAME con il nome del service account Kubernetes collegato all'applicazione
Crea una mappa di configurazione dell'SDK
Esegui lo script shell riportato di seguito per archiviare i dettagli di Workload Identity in un ConfigMap. Quando un pod monta il ConfigMap, Google Cloud CLI può leggere i dettagli di Workload Identity.
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 utente con lo stesso nome e spazio dei nomi utilizzati nell'associazione 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
Crea un pod
Poi, crea un pod con la proiezione del token del account di servizio e il ConfigMap creati sopra.
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" EOFApplica il file YAML del pod al cluster.
env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f sample-pod.yaml
Utilizzodi Google Cloud Workload Identity
Versioni SDK supportate
Per utilizzare la Google Cloud funzionalità di Workload Identity, devi creare il tuo 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 campione che utilizza Workload Identity
Questa sezione include un codice Python di esempio che utilizza Google Cloud workload identity. Il account di servizio in questo esempio utilizza un'identità con "Amministratore Cloud Storage" privilegi per elencare tutti i bucket Cloud Storage del Google Cloud progetto.
Esegui una shell all'interno del pod.
env HTTPS_PROXY=http://localhost:8118 \ kubectl exec -it sample-pod -- bash
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
- Workload Identity del parco risorse
- Federazione delle identità per i workload
- Accedi alle risorse da un provider di identità OIDC (i cluster Kubernetes sono provider di identità OIDC)
- Utilizzo di Workload Identity con AWS