Usar Workload Identity con AWS

Workload Identity te permite asignar identidades distintas y detalladas, así como autorizaciones, a cada aplicación de tu clúster. Workload Identity es la forma recomendada de que las aplicaciones que se ejecutan en GKE en AWS accedan a los servicios de AWS y Google Cloud . Para obtener más información, consulta Workload Identity.

En este tema se explica cómo crear un proveedor de OIDC, aprovisionar cuentas de servicio y probar una carga de trabajo de ejemplo mediante Workload Identity. Esta página está dirigida a administradores de identidades y cuentas, operadores y desarrolladores que quieran crear y gestionar políticas relacionadas con los permisos de los usuarios. Para obtener más información sobre los roles habituales y las tareas de ejemplo a las que hacemos referencia en el contenido, consulta Roles y tareas habituales de los usuarios de GKE. Google Cloud

Crear un proveedor de OIDC de gestión de identidades y accesos de AWS para tu clúster

Para usar Workload Identity con tu clúster, primero debes crear un proveedor de OIDC de AWS IAM que haga referencia a tu clúster. Si ya tienes un proveedor de OIDC de IAM para tu clúster, puedes saltarte esta sección.

Para crear el proveedor, siga estos pasos:

  1. Determina el URI de la entidad emisora de OIDC de tu clúster:

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

    Haz los cambios siguientes:

    • CLUSTER_NAME: el nombre de tu clúster
    • GOOGLE_CLOUD_LOCATION: el nombre de la Google Cloud ubicación desde la que se gestionará este grupo de nodos, tal como se define en las Google Cloud regiones de gestión

    El resultado incluye el URI del emisor de OIDC de tu clúster. Guarda este valor para el siguiente paso.

  2. A continuación, crea un proveedor de OIDC de AWS IAM que haga referencia a tu clúster con el siguiente comando:

    aws iam create-open-id-connect-provider \
        --url ISSUER_URI \
        --client-id-list sts.amazonaws.com \
        --thumbprint-list 08745487e891c19e3078c1f2a07e452950ef36f6
    

    Sustituye ISSUER_URI por el URI de emisor del paso anterior.

    La huella digital del servicio que proporciona el URI de la entidad emisora es siempre 08745487e891c19e3078c1f2a07e452950ef36f6. Google Cloud

Configurar un rol de gestión de identidades y accesos de AWS con una política de gestión de identidades y accesos adjunta

Para configurar un rol de gestión de identidades y accesos de AWS y adjuntarle una política, sigue estos pasos:

  1. Determina el host de la entidad emisora quitando el prefijo https:// del URI de la entidad emisora. Por ejemplo, si tu URI es https://oidc-provider.com/v1/projects/pid/locations/us-west1/awsClusters/awscluster, el host es oidc-provider.com/v1/projects/pid/locations/us-west1/awsClusters/awscluster. Guarda este valor. Lo necesitarás más tarde.

  2. Para determinar el nombre de recurso de Amazon (ARN) del proveedor, ejecuta el siguiente comando:

    aws iam list-open-id-connect-providers --output=text \
        --query 'OpenIDConnectProviderList[?ends_with(Arn, `ISSUER_HOST`) == `true`].Arn'
    

    Sustituye ISSUER_HOST por el nombre de host del URI del emisor del clúster.

  3. A continuación, crea una política de confianza para proporcionar credenciales de OIDC a la cuenta de servicio de Kubernetes. Crea un archivo llamado trust-policy.json con el siguiente contenido:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "PROVIDER_ARN"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "ISSUER_HOST:sub": "system:serviceaccount:NAMESPACE:KSA_NAME"
            }
          }
        }
      ]
    }
    

    Haz los cambios siguientes:

    • PROVIDER_ARN: el ARN del proveedor de OIDC de IAM del clúster
    • ISSUER_HOST: el nombre de host del URI del emisor del clúster.
    • NAMESPACE: el espacio de nombres de Kubernetes donde se ejecuta la aplicación
    • KSA_NAME: la cuenta de servicio de Kubernetes (KSA) que se va a usar en la aplicación
  4. Crea un rol de gestión de identidades y accesos de AWS:

    aws iam create-role --role-name=AWS_ROLE_NAME \
        --assume-role-policy-document file://trust-policy.json
    

    Sustituye AWS_ROLE_NAME por el nombre del rol de gestión de identidades y accesos de AWS de la aplicación.

  5. Asigna una política de gestión de identidades y accesos de AWS al rol:

    aws iam attach-role-policy --role-name=AWS_ROLE_NAME \
        --policy-arn=AWS_POLICY_ARN
    

    Haz los cambios siguientes:

    • AWS_ROLE_NAME: el nombre del rol de AWS IAM de la aplicación

    Por ejemplo, para crear un rol llamado ec2-readonly con la política arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess, ejecuta el siguiente comando:

    aws iam attach-role-policy --role-name=ec2-readonly \
        --policy-arn=arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
    

Desplegar una aplicación de ejemplo

Para probar la identidad de carga de trabajo, sigue estos pasos para implementar una aplicación de ejemplo:

  1. Determina el ARN del rol:

    aws iam get-role --role-name=AWS_ROLE_NAME --query 'Role.Arn'
    

    Reemplazar AWS_ROLE_NAME.

  2. Crea un manifiesto para un espacio de nombres, una KSA y un pod de Kubernetes. Copia el siguiente manifiesto en un archivo llamado workload-identity-test.yaml:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: KSA_NAME
      namespace: NAMESPACE
    automountServiceAccountToken: false
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: aws-cli-example
      namespace: NAMESPACE
    spec:
      serviceAccount: KSA_NAME
      containers:
      - name: aws-cli
        image: amazon/aws-cli:latest
        command:
        - /bin/bash
        - -c
        - "set -eu -o pipefail; while true; do aws ec2 describe-availability-zones; sleep 5; done"
        env:
        - name: AWS_ROLE_ARN
          value: AWS_ROLE_ARN
        - name: AWS_WEB_IDENTITY_TOKEN_FILE
          value: /var/run/secrets/aws-iam-token/serviceaccount/token
        - name: AWS_REGION
          value: AWS_REGION
        volumeMounts:
        - mountPath: /var/run/secrets/aws-iam-token/serviceaccount
          name: aws-iam-token
          readOnly: true
      volumes:
      - name: aws-iam-token
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              audience: sts.amazonaws.com
              expirationSeconds: 86400
              path: token
    

    Haz los cambios siguientes:

    • NAMESPACE
    • KSA_NAME
    • AWS_ROLE_ARN: el ARN del rol de gestión de identidades y accesos de AWS de la aplicación
    • AWS_REGION: la región de AWS del clúster
  3. Aplica el archivo de manifiesto:

    kubectl apply -f workload-identity-test.yaml
    

    Espera varios minutos a que se inicie el Pod y ve a la siguiente sección.

Verificar que la aplicación de ejemplo funciona

Para verificar que la aplicación de ejemplo puede acceder a la API de EC2, consulta los registros del pod:

kubectl logs -f aws-cli-example -n NAMESPACE

Si el pod puede acceder a la API de EC2, el resultado incluye información sobre las zonas de disponibilidad de EC2 y tiene un aspecto similar al siguiente:

-------------------------------------------------
|           DescribeAvailabilityZones           |
+-----------------------------------------------+
||              AvailabilityZones              ||
|+---------------------+-----------------------+|
||  GroupName          |  us-west-2            ||
||  NetworkBorderGroup |  us-west-2            ||
||  OptInStatus        |  opt-in-not-required  ||
||  RegionName         |  us-west-2            ||
||  State              |  available            ||
||  ZoneId             |  usw2-az1             ||
||  ZoneName           |  us-west-2a           ||
|+---------------------+-----------------------+|
||              AvailabilityZones              ||
|+---------------------+-----------------------+|
||  GroupName          |  us-west-2            ||
||  NetworkBorderGroup |  us-west-2            ||
||  OptInStatus        |  opt-in-not-required  ||
||  RegionName         |  us-west-2            ||
||  State              |  available            ||
||  ZoneId             |  usw2-az2             ||
||  ZoneName           |  us-west-2b           ||
|+---------------------+-----------------------+|
||              AvailabilityZones              ||
|+---------------------+-----------------------+|
||  GroupName          |  us-west-2            ||
||  NetworkBorderGroup |  us-west-2            ||
||  OptInStatus        |  opt-in-not-required  ||
||  RegionName         |  us-west-2            ||
||  State              |  available            ||
||  ZoneId             |  usw2-az3             ||
||  ZoneName           |  us-west-2c           ||
|+---------------------+-----------------------+|
||              AvailabilityZones              ||
|+---------------------+-----------------------+|
||  GroupName          |  us-west-2            ||
||  NetworkBorderGroup |  us-west-2            ||
||  OptInStatus        |  opt-in-not-required  ||
||  RegionName         |  us-west-2            ||
||  State              |  available            ||
||  ZoneId             |  usw2-az4             ||
||  ZoneName           |  us-west-2d           ||
|+---------------------+-----------------------+|

Limpieza

Para eliminar esta aplicación de ejemplo, sigue estos pasos:

  1. Elimina el manifiesto de la aplicación de ejemplo de tu clúster:

    kubectl delete -f workload-identity-test.yaml
    
  2. Desvincula la política de gestión de identidades y accesos de AWS del rol:

    aws iam detach-role-policy --role-name AWS_ROLE_NAME \
        --policy-arn arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
    

    Sustituye AWS_ROLE_NAME por el nombre del rol de gestión de identidades y accesos de AWS de la aplicación.

  3. Elimina el rol de gestión de identidades y accesos de AWS:

    aws iam delete-role --role-name AWS_ROLE_NAME
    

    Sustituye AWS_ROLE_NAME por el nombre del rol de gestión de identidades y accesos de AWS de la aplicación.

  4. Elimina el proveedor de OIDC de AWS IAM:

    aws iam delete-open-id-connect-provider --open-id-connect-provider-arn PROVIDER_ARN
    

    Sustituye PROVIDER_ARN por el ARN del proveedor de OIDC de IAM del clúster.

Siguientes pasos