Accede a los recursos desde AWS

En este documento, se muestra cómo usar la federación de identidades para acceder a los recursos de Google Cloud desde Amazon Web Services (AWS).

En general, las aplicaciones que se ejecutan fuera de Google Cloud usan claves de cuentas de servicio para acceder a los recursos de Google Cloud. Mediante la federación de identidades, puedes permitir que un usuario o una función de AWS actúen en nombre de una cuenta de servicio. Esto permite que la carga de trabajo acceda a los recursos de Google Cloud directamente mediante un token de acceso de corta duración y quita la carga de seguridad y mantenimiento asociada con las claves de la cuenta de servicio.

Antes de comenzar

  1. Asegúrate de tener la función de administrador de grupo de Workload Identity (roles/iam.workloadIdentityPoolAdmin).

    Las funciones básicas de propietario (roles/owner) y editor (roles/editor) de IAM también otorgan permiso para configurar la federación de identidades. Sin embargo, recomendamos usar la función de administrador de grupos de Workload Identity para evitar otorgar acceso innecesario a los recursos de Google Cloud.

  2. Crea una función de AWS y toma nota de Amazon Resource Name (ARN).

  3. Crea una cuenta de servicio de Google Cloud.

  4. Otorga acceso a la cuenta de servicio para llamar a las API de Google Cloud que requiere la carga de trabajo.

Crea un grupo de Workload Identity

Un grupo de Workload Identity es un contenedor para una colección de identidades externas. Los grupos de Workload Identity se aíslan unos de otros, pero un solo grupo puede actuar en nombre de cualquier cantidad de cuentas de servicio. En general, recomendamos crear un grupo nuevo para cada uno de los entornos, como desarrollo, etapa de pruebas o producción, que por lo general significa un grupo por cuenta de AWS.

Para crear un nuevo grupo de Workload Identity, debes proporcionar un ID. También puedes proporcionar una descripción y un nombre visible opcionales.

Comando de gcloud

Ejecuta el comando gcloud beta iam workload-identity-pools create para crear un grupo de Workload Identity:

gcloud beta iam workload-identity-pools create pool-id \
    --location="global" \
    --description="description" \
    --display-name="display-name"

API de REST

El método projects.locations.workloadIdentityPools.create crea un grupo de Workload Identity.

Método HTTP y URL:

POST https://iam.googleapis.com/v1beta/projects/project-id/locations/global/workloadIdentityPools?workloadIdentityPoolId=pool-id

Cuerpo JSON de la solicitud:

{
  "description": "description",
  "display-name": "display-name"
}

Para enviar tu solicitud, expande una de estas opciones:

 

Agrega AWS como proveedor de identidad

A fin de configurar AWS como proveedor de identidad para el grupo de Workload Identity, proporciona al menos lo siguiente:

  • Un ID para el proveedor.

  • El ID del grupo de Workload Identity de la sección anterior de este documento.

  • El ID de la cuenta de AWS.

También puedes proporcionar varios parámetros opcionales:

  • Un nombre visible y una descripción.

  • Una lista de mapas de atributos que mapean los atributos de un token de AWS a los atributos en un token de Google. De forma predeterminada, cada grupo usa los siguientes mapas de atributos, que abarcan las situaciones más comunes:

    Google AWS Descripción
    google.subject assertion.arn La IAM principal se autentica. Este también es el tema que aparece en las entradas de registro de Cloud Logging. Este mapa se propaga de forma automática con el ARN mediante el formulario arn:aws:sts::[ACCOUNT-ID]:assumed-role/[AWS-ROLE]/[AWS-SESSION-NAME].
    attribute.aws_role Función de AWS La función de AWS, con el formato arn:aws:sts::[ACCOUNT-ID]:assumed-role/[AWS-ROLE].

    También puedes especificar mapas personalizados, a los que puedes hacer referencia en las vinculaciones de IAM. Usa assertion a fin de hacer referencia a la credencial de AWS, google para los atributos de Google y attribute para los atributos personalizados. Por ejemplo, lo siguiente mapea attribute.aws_account a assertion.account (además de la asignación predeterminada para google.subject):

    google.subject=assertion.arn,
    attribute.aws_account=assertion.account
    

    Consulta la documentación de GetCallerIdentity() para obtener una lista de atributos en los tokens de AWS a los que puedes hacer referencia. Ten en cuenta que los atributos en la documentación de AWS usan mayúsculas y minúsculas, mientras que la asignación de atributos usa minúsculas. Por ejemplo, Account se convierte en assertion.account.

    Para aserciones más complejas, puedes usar Common Expression Language. Por ejemplo:

    attribute.environment=assertion.arn.contains(":instance-profile/Production") ? "prod" : "test"
    

    Para hacer referencia a una parte específica de un atributo en una expresión, usa la función extract() de CEL, que extrae un valor de un atributo a partir de una plantilla que proporciones. Para obtener más información sobre extract(), consulta Extrae valores de atributos.

    Para verificar si una credencial contiene un atributo, usa la función has().

  • Una condición de atributo que especifica los atributos que debe mostrar el principal. La condición puede aplicarse a credenciales externas y de Google. Se rechaza cualquier solicitud que no cumpla con la condición.

    Las condiciones de los atributos tienen el formato de una expresión CEL que muestra un valor booleano. Por ejemplo, a continuación, se rechazan las solicitudes de cualquier identidad que no tenga una función específica de AWS:

    attribute.aws_role == "role-mapping"
    

    A fin de obtener más información sobre los casos de uso comunes para las condiciones de los atributos, consulta la descripción general de la federación de Workload Identity.

En el siguiente ejemplo, se muestra cómo agregar AWS como proveedor de identidad:

Comando de gcloud

Ejecuta el comando gcloud beta iam workload-identity-pools providers create-aws para agregar AWS como proveedor de identidad:

gcloud beta iam workload-identity-pools providers create-aws provider-id \
  --workload-identity-pool="pool-id"
  --account-id="aws-account-id"
  --location="global"

API de REST

El método projects.locations.workloadIdentityPools.providers.create agrega a AWS como proveedor.

Método HTTP y URL:

POST https://iam.googleapis.com/v1beta/projects/project-id/locations/global/workloadIdentityPools/pool-id/providers?workloadIdentityPoolProviderId=provider-id

Cuerpo JSON de la solicitud:

{
  "aws": {
    "accountId": "aws-account-id"
  }
}

Para enviar tu solicitud, expande una de estas opciones:

 

Actúa en nombre de una cuenta de servicio

Puedes otorgar funciones en los recursos mediante IAM a los grupos de Workload Identity y a las identidades federadas de sus proveedores. La función de usuario de Workload Identity (roles/iam.workloadIdentityUser) otorga permiso para actuar en nombre de una cuenta de servicio, lo que permite que las identidades externas accedan a los recursos de Google Cloud.

Otórgale funciones a identidades individuales dentro del grupo de Workload Identity o inhabilita las restricciones de dominio para tu organización.

Para agregar esta vinculación a una función de AWS, usa el siguiente formato:

attribute.aws_role/arn:aws:sts::aws-account-id:assumed-role/aws-role-name

Por ejemplo:

gcloud iam service-accounts add-iam-policy-binding service-account-email \
  --role roles/iam.workloadIdentityUser \
  --member "principalSet://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/attribute.aws_role/arn:aws:sts::aws-account-id:assumed-role/aws-role-name"

Para agregar esta vinculación a un usuario de AWS, usa el siguiente formato:

subject/arn:aws:sts::aws-account-id:assumed-role/aws-role-name/aws-session-name

Consulta la documentación de AWS sobre los identificadores de IAM para obtener información sobre cómo extraer la sesión de función de AWS desde un ARN de AWS.

En el siguiente ejemplo, se demuestra cómo agregar una vinculación a un usuario de AWS:

gcloud iam service-accounts add-iam-policy-binding service-account-email \
  --role roles/iam.workloadIdentityUser \
  --member "principal://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/subject/arn:aws:sts::aws-account-id:assumed-role/aws-role-name/aws-session-name

También puedes otorgar acceso en función de atributos personalizados. Por ejemplo:

gcloud iam service-accounts add-iam-policy-binding service-account-email \
  --role="roles/iam.workloadIdentityUser" \
  --member="principalSet://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/attribute.custom-attribute/arn:aws:sts::aws-account-id:aws-role-name"

Para revocar el acceso, reemplaza add-iam-policy-binding por remove-iam-policy-binding.

También puedes agregar o revocar vinculaciones mediante la API de REST o las bibliotecas cliente. Para obtener más información, consulta Otorga, cambiar y revoca el acceso a los recursos.

Intercambia un token de AWS por un token de Google

Una vez que una función o un usuario de AWS tiene la capacidad de actuar en nombre de una cuenta de servicio, puedes intercambiar sus credenciales de AWS por las credenciales de Google. Como parte del proceso de intercambio, pasas una versión serializada de una solicitud al método GetCallerIdentity() de AWS al servicio de tokens de seguridad. Esto le permite a Google Cloud verificar la identidad del principal de AWS y confirmar que tiene permiso para actuar en nombre de una cuenta de servicio.

Para intercambiar credenciales, haz lo siguiente:

  1. Obtén credenciales de AWS temporales.

  2. Crea una solicitud firmada serializada para el método GetCallerIdentity() de AWS mediante la versión 4 de la firma.

    La solicitud contiene los siguientes campos:

    • url: La URL del extremo de AWS STS para GetCallerIdentity(), como https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15. También se admiten los extremos regionales.
    • method: El método de solicitud HTTP: POST.
    • headers: Los encabezados de la solicitud HTTP, que deben incluir lo siguiente:
      • Authorization: La firma de la solicitud.
      • host: El nombre de host del campo url; por ejemplo, sts.amazonaws.com.
      • x-amz-date: La hora a la que enviarás la solicitud, con el formato de una string simple ISO 8601. Por lo general, esto se establece en la hora actual y se usa para evitar ataques de repetición.
      • x-goog-cloud-target-resource: El nombre completo del recurso del proveedor de identidad. El prefijo HTTPS es opcional. Por ejemplo, las dos opciones siguientes son válidas:
        //iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/providers/provider-id
        https://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/providers/provider-id
        

    Una solicitud es similar al ejemplo siguiente:

    {
      "url": "https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15",
      "method": "POST",
      "headers": [
        {
          "key": "Authorization",
          "value" : "AWS4-HMAC-SHA256 Credential=AKIASOZTBDV4D7ABCDEDF/20200228/us-east-1/sts/aws4_request, SignedHeaders=host;x-amz-date,Signature=abcedefdfedfd"
        },
        {
          "key": "host",
          "value": "sts.amazonaws.com"
        },
        {
          "key": "x-amz-date",
          "value": "20200228T225005Z"
        },
        {
          "key": "x-goog-cloud-target-resource",
          "value": "//iam.googleapis.com/projects/12345678/locations/global/workloadIdentityPools/my-pool/providers/my-aws-provider"
        }
      ]
    }
    
  3. Pasa la solicitud serializada al método token() del servicio de tokens de seguridad a fin de intercambiar la credencial de AWS por un token de acceso federado:

    API de REST

    El método token intercambia un token de terceros por un token de Google.

    Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

    • project-id: El ID del proyecto de Google Cloud.
    • pool-id: El ID del grupo de Workload Identity que creaste con anterioridad en este instructivo.
    • provider-id: Es el ID del proveedor de identidad de AWS que configuraste con anterioridad en este instructivo.
    • aws-request: La solicitud serializada y firmada a GetCallerIdentity(), con formato JSON con escape de URL.

    Método HTTP y URL:

    POST https://sts.googleapis.com/v1beta/token

    Cuerpo JSON de la solicitud:

    {
      "audience": "https://iam.googleapis.com/projects/project-id/locations/global/workloadIdentityPools/pool-id/providers/provider-id",
      "grant_type": "urn:ietf:params:oauth:grant-type:token-exchange",
      "requested_token_type": "urn:ietf:params:oauth:token-type:access_token",
      "scope": "https://www.googleapis.com/auth/cloud-platform",
      "subject_token_type": "urn:ietf:params:aws:token-type:aws4_request",
      "subject_token": "aws-request"
    }
    

    Para enviar tu solicitud, expande una de estas opciones:

     

    El método muestra un token federado.

  4. Intercambia el token federado por un token de acceso de OAuth 2.0 mediante una llamada a generateAccessToken():

    API de REST

    curl -X POST -H "Authorization: Bearer federated-token \
      https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/service-account-email:generateAccessToken
    

Una vez que tengas un token de acceso para una cuenta de servicio, puedes usarlo a fin de llamar a las API de Google Cloud. A tal fin, incluye el token en el encabezado Authorization de las solicitudes:

Authorization: Bearer access-token

La solicitud está autorizada como la cuenta de servicio.

Próximos pasos