Uso de la identidad de la carga de trabajo con Google Cloud

Esta guía describe cómo configurar la identidad de la carga de trabajo en GKE en AWS para controlar el acceso de la carga de trabajo a los recursos de GCP. Incluye un ejemplo de cómo acceder. Google Cloud recursos de su clúster utilizando la identidad.

Para obtener información sobre el uso de identidades de carga de trabajo con cuentas de AWS IAM para controlar el acceso a los recursos de AWS, consulte Uso de identidad de carga de trabajo con AWS .

Descripción general

Usos de la identidad de la carga de trabajo Google Cloud Permisos de IAM para controlar el acceso aGoogle Cloud Recursos. Con la identidad de la carga de trabajo, puede asignar diferentes roles de IAM a cada carga de trabajo. Este control preciso de permisos le permite seguir el principio del mínimo privilegio . Sin la identidad de la carga de trabajo, debe asignar Google Cloud Funciones de IAM para sus nodos de GKE en AWS, lo que otorga a todas las cargas de trabajo en esos nodos los mismos permisos que el nodo mismo.

Prerrequisitos

  • Cree un clúster de usuarios con Kubernetes versión v1.20 o posterior.

  • Si su VPC de AWS utiliza un proxy o firewall, incluya en la lista de permitidos las siguientes URL:

    • securetoken.googleapis.com
    • iamcredentials.googleapis.com
    • sts.googleapis.com
  • Desde su directorio anthos-aws , use anthos-gke para cambiar el contexto a su clúster de usuarios.

    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    Reemplace CLUSTER_NAME con el nombre de su clúster de usuarios.

  • Habilite los cuatro nuevos servicios necesarios para esta función con los siguientes 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
    

Componer los nombres de los proveedores y del pool de WI

Cada Google Cloud El proyecto crea automáticamente un grupo de identidades de carga de trabajo administrada con un nombre como PROJECT_ID.svc.id.goog . De forma similar,Google Cloud Crea un proveedor de identidad cuyo nombre sigue el patrón https://gkehub.googleapis.com/projects/PROJECT_ID/locations/global/memberships/MEMBERSHIP_ID . Para obtener más información sobre los grupos de identidades de carga de trabajo, consulte Componentes habilitados para Fleet . Cree estos nombres a partir del ID de proyecto y el ID de membresía, como se muestra a continuación:

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"

Reemplace lo siguiente:

  • USER_PROJECT_NAME con el nombre del proyecto de usuario elegido por el usuario
  • PROJECT_MEMBERSHIP_NAME con el nombre de membresía del clúster

Crear un enlace de política de IAM

Cree un enlace de política para permitir que una cuenta de servicio de Kubernetes (KSA) se haga pasar por una Google Cloud cuenta de servicio (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

Reemplace lo siguiente:

  • KUBERNETES_NAMESPACE con el espacio de nombres de Kubernetes donde se define la cuenta de servicio de Kubernetes
  • WORKLOAD_IDENTITY_TEST con un nombre de carga de trabajo de su elección
  • KUBERNETES_SA_NAME con el nombre de la cuenta de servicio de Kubernetes asociada a la aplicación

Crear un mapa de configuración del SDK

Ejecute el siguiente script de shell para almacenar la información de identidad de la carga de trabajo en un ConfigMap. Cuando un pod monta el ConfigMap, la CLI de Google Cloud puede leer la información de identidad de la carga de trabajo.

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

Crear una cuenta de servicio de Kubernetes

Cree una KSA en su clúster de usuarios con el mismo nombre y espacio de nombres que se utilizó en el enlace de 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

Crear un pod

A continuación, cree un Pod con la proyección del token de la cuenta de servicio y el ConfigMap creado anteriormente.

  1. Cree el archivo yaml de muestra de Pod.

    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 el YAML del Pod a su clúster.

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

Usando Google Cloud identidad de la carga de trabajo

Versiones del SDK compatibles

Para utilizar el Google Cloud Función de identidad de carga de trabajo, debe compilar su código con un SDK compatible. Para obtener una lista de las versiones del SDK compatiblesGoogle Cloud Identidad de la carga de trabajo, consulte Identidad de la carga de trabajo de la flota .

Código de ejemplo que utiliza la identidad de la carga de trabajo

Esta sección incluye un ejemplo de código Python que utiliza Google Cloud Identidad de la carga de trabajo. La cuenta de servicio en este ejemplo usa una identidad con privilegios de "Administrador de almacenamiento en la nube" para enumerar todos los... Google Cloud depósitos de almacenamiento en la nube del proyecto.

  1. Ejecutar un shell dentro del Pod.

    env HTTPS_PROXY=http://localhost:8118 \
    kubectl exec -it sample-pod -- bash
    
  2. Ejecute un script para enumerar los depósitos de almacenamiento del proyecto.

    # 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
    

    Reemplace USER_PROJECT_NAME con su Google Cloud proyecto.

Para más información