Autenticación en AWS con GitHub Actions mediante OIDC
AWSTerraformSecurityCI/CD
En los flujos de trabajo tradicionales de Integración y Despliegue Continuo (CI/CD), la práctica común para permitir que un pipeline interactúe con los recursos de AWS consiste en generar un usuario IAM, crear un par de claves de acceso estáticas (AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY) y almacenarlas como secretos en el repositorio.
Esta estrategia introduce un vector de riesgo crítico: las credenciales son de larga duración y carecen de un mecanismo automático de rotación. Si el repositorio o la plataforma de automatización se ven comprometidos, las claves filtradas otorgan un acceso persistente y potencialmente irrestricto a la infraestructura de la nube. Para mitigar esta vulnerabilidad, la arquitectura moderna de DevOps adopta la federación de identidades.
Diagrama oidc con aws y gh actions
Mecánica de OpenID Connect (OIDC)
OpenID Connect (OIDC) permite que los flujos de trabajo de GitHub Actions se autentiquen directamente en AWS sin necesidad de almacenar secretos compartidos de AWS. En su lugar, se establece una relación de confianza criptográfica entre AWS (como proveedor de la nube) y GitHub (como Proveedor de Identidad o IdP).
El intercambio de credenciales ocurre de forma totalmente dinámica y efímera en cada ejecución del pipeline siguiendo este flujo:
Solicitud de Token: Al iniciar un job, el runner de GitHub Actions solicita un token OIDC firmado en formato JWT (JSON Web Token) al proveedor de identidad de GitHub.
Intercambio en AWS STS: El flujo de trabajo envía este JWT a AWS STS (Security Token Service) mediante la acción correspondiente, solicitando asumir un rol específico de IAM (sts:AssumeRoleWithWebIdentity).
Validación y Emisión: AWS verifica la autenticidad de la firma del token utilizando las claves públicas de GitHub y evalúa las condiciones restrictivas del rol (como el identificador de la organización, repositorio y rama). Si la validación es exitosa, STS emite credenciales temporales que expiran automáticamente al finalizar el job.
Implementación de la Infraestructura con Terraform
Para automatizar esta configuración de forma declarativa, estructuraremos nuestro código de Terraform en tres componentes esenciales: el proveedor OIDC, el rol de IAM con sus políticas de confianza, y la política de permisos de ejecución adjunta.
# 1. Definición del Proveedor OIDC de GitHub (Uno por cuenta de AWS)
Para consumir de forma correcta el rol de IAM aprovisionado, el archivo de definición del pipeline (.github/workflows/deploy.yml) debe declarar explícitamente el bloque de permisos permissions. Sin la asignación de escritura sobre el id-token, el runner omitirá la generación del JWT.
name: Deployment Pipeline
on:
push:
branches:
- main
# Declaración mandatoria para la generación de tokens OIDC
permissions:
id-token: write # Permite solicitar el token JWT a GitHub
contents: read # Requerido por acciones nativas como actions/checkout
jobs:
aws-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout Source Code
uses: actions/checkout@v4
# Autenticación transparente mediante OpenID Connect
- name: Authenticate to AWS via OIDC
uses: aws-actions/configure-aws-credentials@v6
with:
role-to-assume: arn:aws:iam::123456789012:role/github-actions-deploy-role # Reemplazar con el ARN real
aws-region: us-east-1
- name: Verify Authentication
run: aws sts get-caller-identity
- name: Terraform Plan
run: |
terraform init
terraform plan -out=tfplan
- name: Terraform Apply
run: terraform apply -auto-approve tfplan
Consideraciones de Seguridad y Buenas Prácticas
1. Acotación Estricta del Sub Claim (sub)
El uso de comodines generales como repo:mi-organizacion/* debe evitarse por completo en entornos de producción. Cualquier repositorio creado bajo esa organización heredará automáticamente los permisos para alterar la infraestructura. Restringe el acceso al repositorio específico y, preferiblemente, limita la asunción del rol a ramas estables o etiquetas de producción:
En arquitecturas empresariales u orientadas a una correcta segregación de funciones, se recomienda el despliegue de roles de IAM independientes distribuidos en múltiples cuentas de AWS (por ejemplo, Staging y Production). Estos roles se asocian a entornos protegidos en GitHub (GitHub Environments), exigiendo aprobaciones manuales antes de disparar el intercambio de tokens STS.
3. Principio de Privilegio Mínimo
La asignación de la política administrada por AWS AdministratorAccess anula los beneficios de una arquitectura de CI/CD segura. Se debe auditar minuciosamente qué recursos (como buckets S3, funciones Lambda, o distribuciones de CloudFront) requiere manipular el pipeline y mapear únicamente las acciones estrictamente necesarias dentro de la política de IAM gestionada por Terraform.
Conclusión
La implementación de OIDC entre GitHub Actions y AWS reemplaza un modelo basado en secretos compartidos y vulnerables por una arquitectura basada en identidades dinámicas y federadas de corta duración. Al centralizar la configuración de la confianza criptográfica mediante Terraform, elevamos la postura de seguridad de la infraestructura sin añadir fricción operativa al ciclo de vida del desarrollo.