Skip to main content

Configurar OpenID Connect en Amazon Web Services

Utiliza OpenID Connect con tus flujos de trabajo para autenticarte con Amazon Web Services.

Información general

OpenID Connect (OIDC) permite que tus flujos de trabajo de GitHub Actions accedan a los recursos de Amazon Web Services (AWS) sin necesidad de almacenar las credenciales de AWS como secretos de GitHub de larga duración.

En esta guía se explica cómo configurar AWS para que confíe en el OIDC de GitHub como una entidad federada y se incluye un ejemplo de flujo de trabajo para aws-actions/configure-aws-credentials en el que se usan tokens para autenticarse en AWS y acceder a los recursos.

Prerrequisitos

  • Para obtener información sobre los conceptos básicos de cómo GitHub usa OpenID Connect (OIDC), su arquitectura y sus ventajas, consulte "Acerca del fortalecimiento de la seguridad con OpenID Connect".

  • Antes de proceder, debes planear tu estrategia de seguridad para garantizar que los tokens de acceso solo se asignen de forma predecible. Para controlar la forma en que el proveedor de servicios en la nube emite tokens de acceso, tendrá que definir al menos una condición, para que los repositorios no confiables no puedan solicitar tokens de acceso para los recursos en la nube. Para más información, vea "Configuración de la confianza de OIDC con la nube".

Agregar el proveedor de identidad a AWS

Para agregar el proveedor de OIDC de GitHub a IAM, vea la documentación de AWS.

  • Para la dirección URL del proveedor: usa https://token.actions.githubusercontent.com
  • Para "Público": utilice sts.amazonaws.com si usa la acción oficial.

Configurar el rol y política de confianza

Para configurar el rol y la confianza en IAM, vea la documentación de AWS sobre "Asumir un rol" y "Creación de un rol para la identidad web o la federación de OpenID Connect".

Edite la directiva de confianza para agregar el campo sub a las condiciones de validación. Por ejemplo:

JSON
"Condition": {
  "StringEquals": {
    "token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
    "token.actions.githubusercontent.com:sub": "repo:octo-org/octo-repo:ref:refs/heads/octo-branch"
  }
}

En el ejemplo siguiente, ForAllValues se usa para buscar coincidencias en varias claves de condición y StringLike se usa para hacer coincidir cualquier referencia en el repositorio especificado. Tenga en cuenta que ForAllValues es excesivamente permisivo y no debe usarse por sí mismo en un efecto Allow. En este ejemplo, la inclusión de StringLike significa que un conjunto vacío en ForAllValues seguirá sin pasar la condición:

JSON
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::123456123456:oidc-provider/token.actions.githubusercontent.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringLike": {
                    "token.actions.githubusercontent.com:sub": "repo:octo-org/octo-repo:*"
                },
                "ForAllValues:StringEquals": {
                    "token.actions.githubusercontent.com:iss": "https://token.actions.githubusercontent.com",
                    "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
                }
            }
        }
    ]
}

Actualizar tu flujo de trabajo de GitHub Actions

Para actualizar tus flujos de trabajo para ODIC, necesitarás hacer dos cambios a tu YAML:

  1. Agregar ajustes de permisos para el token.
  2. Use la acción aws-actions/configure-aws-credentials para intercambiar el token de OIDC (JWT) por un token de acceso a la nube.

Agregar ajustes de permisos

La ejecución del trabajo o del flujo de trabajo necesita una configuración permissions con id-token: write. No podrá solicitar el token de identificador JWT de OIDC si el valor permissions de id-token está establecido en read o none.

El valor id-token: write permite solicitar JWT desde el proveedor OIDC de GitHub mediante uno de estos enfoques:

  • Con variables de entorno en el ejecutor (ACTIONS_ID_TOKEN_REQUEST_URL y ACTIONS_ID_TOKEN_REQUEST_TOKEN).
  • Con getIDToken() del kit de herramientas de Acciones.

Si necesita capturar un token de OIDC para un flujo de trabajo, el permiso se puede establecer en el nivel de flujo de trabajo. Por ejemplo:

YAML
permissions:
  id-token: write # This is required for requesting the JWT
  contents: read  # This is required for actions/checkout

Si solo necesitas recuperar un token de OIDC para un solo job, entonces este permiso puede configurarse dentro de dicho job. Por ejemplo:

YAML
permissions:
  id-token: write # This is required for requesting the JWT

Puede que necesites especificar permisos adicionales aquí, dependiendo de los requisitos de tu flujo de trabajo.

Solicitar el token de acceso

La acción aws-actions/configure-aws-credentials recibe un JWT del proveedor de OIDC de GitHub y luego solicita un token de acceso a AWS. Para más información, vea la documentación de AWS.

  • <example-bucket-name>: agregue aquí el nombre del cubo de S3.
  • <role-to-assume>: reemplace el ejemplo por el rol de AWS.
  • <example-aws-region>: agregue aquí el nombre de la región de AWS.
YAML
# Sample workflow to access AWS resources when workflow is tied to branch
# The workflow Creates static website using aws s3
name: AWS example workflow
on:
  push
env:
  BUCKET_NAME : "<example-bucket-name>"
  AWS_REGION : "<example-aws-region>"
# permission can be added at job level or workflow level    
permissions:
      id-token: write   # This is required for requesting the JWT
      contents: read    # This is required for actions/checkout
jobs:
  S3PackageUpload:
    runs-on: ubuntu-latest
    steps:
      - name: Git clone the repository
        uses: actions/checkout@v3
      - name: configure aws credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          role-to-assume: arn:aws:iam::1234567890:role/example-role
          role-session-name: samplerolesession
          aws-region: ${{ env.AWS_REGION }}
      # Upload a file to AWS s3
      - name:  Copy index.html to s3
        run: |
          aws s3 cp ./index.html s3://${{ env.BUCKET_NAME }}/