- Use DEV_S3_ARTIFACTS_BUCKET and PROD_S3_ARTIFACTS_BUCKET in 06_install instead of generic S3_ARTIFACTS_BUCKET to prevent cross-env reads - Add terraform/environments/*.tfvars to .gitignore to prevent secret leaks - Update prod backend state bucket name to proyectosacc-specific bucket - Add CI/CD credential policy documentation
10 KiB
12 - Credenciales AWS para CI/CD de proyectosacc
Guía para configurar credenciales persistentes de AWS en Bitbucket Pipelines, evitando el uso de tokens de sesión SSO que expiran frecuentemente.
1. El problema con los tokens de sesión SSO
Los tokens de sesión SSO (Single Sign-On) son credenciales temporales que expiran después de un período corto (generalmente entre 1 y 12 horas).
¿Por qué no funcionan bien en CI/CD?
| Problema | Impacto |
|---|---|
| Expiración frecuente | El pipeline falla inesperadamente cuando el token vence. |
| Renovación manual | Requiere que un usuario humano inicie sesión en SSO y genere nuevos tokens. |
| Bloqueo de despliegues | Un despliegue automatizado en medio de la noche puede fallar por un token vencido. |
| No son idóneos para automatización | Están diseñados para uso interactivo, no para pipelines desatendidos. |
Conclusión: Para un pipeline CI/CD que debe ejecutarse de forma automática y confiable, se necesitan credenciales persistentes o un mecanismo de autenticación automatizado como OIDC.
2. Alternativas recomendadas
Opción A (Mejor práctica): OIDC con Bitbucket Pipelines
Bitbucket Pipelines soporta OpenID Connect (OIDC), que permite que el pipeline asuma un rol de AWS sin usar credenciales estáticas.
Ventajas:
- No hay access keys que roten manualmente.
- Cada ejecución del pipeline obtiene credenciales temporales automáticamente.
- Menor superficie de ataque (no hay secretos almacenados en Bitbucket).
Desventaja:
- Requiere configuración inicial más compleja en IAM (OIDC provider, trust policy, rol).
Para la configuración completa de OIDC, consulta:
docs/04-integracion-bitbucket-aws.md(sección "Deploy to AWS with OIDC").
Opción B (Inmediata y práctica): IAM User con Access Keys de larga vida
Si OIDC no es viable en el corto plazo, la alternativa estándar es crear un usuario IAM dedicado con access keys de larga vida, guardadas como variables seguras en Bitbucket.
Usuarios recomendados:
bitbucket-pipelines-proyectosacc-dev(cuenta DEV:668889063715)bitbucket-pipelines-proyectosacc-prod(cuenta PROD: por confirmar)
Principios:
- Un usuario por ambiente: nunca compartir credenciales entre DEV y PROD.
- Solo acceso programático: sin contraseña de consola AWS.
- Mínimo privilegio: solo los permisos estrictamente necesarios para el pipeline.
3. Política IAM mínima requerida para proyectosacc
El pipeline de proyectosacc realiza las siguientes operaciones en AWS:
- S3: Sincroniza el frontend React al bucket de sitio estático.
- S3: Sube el artefacto
.jarde la API al bucket de artefactos. - CloudFront: Invalida la caché de la distribución tras el despliegue.
- (Futuro) Terraform/IaC: Gestiona EC2, RDS, Route 53, ACM, CloudFormation, etc.
A continuación se presenta una política compuesta que cubre tanto el despliegue de aplicación actual como la gestión de infraestructura mediante Terraform/CloudFormation.
Archivo de política: iam-policy-ci-cd-proyectosacc.json
Resumen de permisos incluidos
| Servicio | Permisos | Justificación |
|---|---|---|
| S3 | PutObject, DeleteObject, ListBucket, GetObject |
aws s3 sync frontend y subida/descarga de artefactos .jar. |
| CloudFront | CreateInvalidation, GetInvalidation, ListInvalidations |
Invalidar caché tras deploy. |
| CloudFront | GetDistribution, UpdateDistribution, CreateDistribution |
Gestión de distribución vía Terraform. |
| EC2 | Describe*, RunInstances, TerminateInstances, CreateTags, etc. |
Gestión de instancias, security groups, EIPs, VPC. |
| RDS | Describe*, CreateDBInstance, ModifyDBInstance, DeleteDBInstance |
Gestión de base de datos MariaDB. |
| Route 53 | ChangeResourceRecordSets, ListHostedZones, GetChange |
Gestión de registros DNS. |
| ACM | RequestCertificate, DescribeCertificate, DeleteCertificate |
Gestión de certificados SSL. |
| IAM | Get*, List*, SimulatePrincipalPolicy |
Validación de permisos y lectura de roles/políticas. |
| CloudFormation | CreateStack, UpdateStack, DeleteStack, DescribeStacks |
Despliegue de stacks (si aplica). |
| CloudWatch Logs | CreateLogGroup, CreateLogStream, PutLogEvents |
Logs de despliegue. |
Nota: Si el pipeline solo despliega la aplicación (sin tocar infraestructura), puedes reducir la política a los permisos de S3 y CloudFront únicamente. Consulta el archivo JSON para ver las secciones comentadas.
4. Buenas prácticas de seguridad
4.1 Almacenamiento de credenciales
- Guarda
AWS_ACCESS_KEY_IDyAWS_SECRET_ACCESS_KEYcomo variables Secured en Bitbucket Pipelines. - Nunca escribas credenciales en código, logs ni documentación.
- Considera migrar a AWS Secrets Manager o Parameter Store como paso intermedio hacia OIDC.
4.2 Rotación de credenciales
- Rotar access keys cada 90 días como máximo.
- Programa recordatorios en el calendario del equipo.
- Documenta el proceso de rotación en un runbook accesible.
4.3 Sin acceso a consola
- Los usuarios IAM de CI/CD deben tener solo acceso programático.
- No asignar contraseña de consola ni políticas de MFA obligatorio al usuario (el pipeline no puede usar MFA).
4.4 Principio de mínimo privilegio
- Revisa la política IAM cada vez que el pipeline cambie de operaciones.
- Usa ARNs específicos en lugar de
*siempre que sea posible. - Considera separar permisos en políticas distintas por servicio.
4.5 Auditoría
- Habilita AWS CloudTrail en ambas cuentas (DEV y PROD) para registrar todas las llamadas a la API.
- Configura alertas en CloudWatch/Security Hub para actividad sospechosa (ej.
CreateAccessKeyfuera de horario).
4.6 Separación de ambientes
| Ambiente | Cuenta AWS | Usuario IAM |
|---|---|---|
| DEV | 668889063715 |
bitbucket-pipelines-proyectosacc-dev |
| PROD | 523761210517 o 739086995772 |
bitbucket-pipelines-proyectosacc-prod |
Nunca reutilices el mismo par de access keys en DEV y PROD.
5. Instrucciones paso a paso para crear el usuario IAM
Paso 1: Crear el usuario IAM (Consola AWS)
- Inicia sesión en la Consola AWS de la cuenta correspondiente (DEV o PROD).
- Navega a IAM > Users > Add users.
- User name:
bitbucket-pipelines-proyectosacc-dev(o-prod). - Selecciona Access key - Programmatic access.
- NO selecciones "Password - AWS Management Console access".
- Haz clic en Next: Permissions.
Paso 2: Adjuntar la política
- Selecciona Attach policies directly.
- Haz clic en Create policy.
- Ve a la pestaña JSON y pega el contenido del archivo
iam-policy-ci-cd-proyectosacc.json. - Reemplaza los placeholders de ARN (
arn:aws:s3:::ccsoft-proyectosacc-*, etc.) con los recursos reales de tu cuenta. - Asigna un nombre a la política:
proyectosacc-ci-cd-deployment-policy. - Guarda la política y adjúntala al usuario.
Paso 3: Obtener las access keys
- Completa la creación del usuario.
- En la pantalla de confirmación, copia:
- Access key ID
- Secret access key
- Importante: Este es el único momento en que verás la secret access key. Guárdala de forma segura (ej. en un password manager).
Paso 4: Configurar en Bitbucket Pipelines
- Ve al repositorio de
proyectosaccen Bitbucket. - Navega a Repository settings > Pipelines > Repository variables.
- Agrega las siguientes variables y márcalas como Secured:
| Variable | Valor |
|---|---|
AWS_ACCESS_KEY_ID |
<Access key ID del usuario IAM> |
AWS_SECRET_ACCESS_KEY |
<Secret access key del usuario IAM> |
- Verifica que el pipeline
bitbucket-pipelines.ymlya referencia estas variables en los pasos depublishydeploy.
Paso 5: Validar el despliegue
- Ejecuta un pipeline de prueba en la rama
developer(DEV). - Verifica que los pasos
05_publishy07_deployfinalicen exitosamente. - Revisa los logs de CloudTrail para confirmar que las llamadas a la API provienen del usuario IAM esperado.
6. Instrucciones vía AWS CLI
Si prefieres automatizar la creación con la CLI de AWS:
# Variables
USER_NAME="bitbucket-pipelines-proyectosacc-dev"
POLICY_NAME="proyectosacc-ci-cd-deployment-policy"
POLICY_DOCUMENT="file://iam-policy-ci-cd-proyectosacc.json"
# 1. Crear usuario IAM
aws iam create-user --user-name "$USER_NAME"
# 2. Crear política inline (o managed) y obtener su ARN
POLICY_ARN=$(aws iam create-policy \
--policy-name "$POLICY_NAME" \
--policy-document "$POLICY_DOCUMENT" \
--query 'Policy.Arn' --output text)
# 3. Adjuntar política al usuario
aws iam attach-user-policy \
--user-name "$USER_NAME" \
--policy-arn "$POLICY_ARN"
# 4. Crear access keys
aws iam create-access-key --user-name "$USER_NAME"
Nota de seguridad: El comando
create-access-keydevuelve laSecretAccessKeyen texto plano. Captúrala de forma segura y no la almacenes en el historial de comandos de tu terminal.
7. Recomendación final
Aunque los IAM users con access keys resuelven el problema inmediato de la expiración de credenciales SSO, la solución ideal a mediano plazo para proyectosacc es migrar a OIDC.
Hoja de ruta sugerida
| Fase | Acción | Prioridad |
|---|---|---|
| Inmediata | Crear usuarios IAM con access keys y reemplazar los tokens SSO en Bitbucket. | Alta |
| Corto plazo | Implementar rotación automática de access keys (cada 90 días). | Media |
| Mediano plazo | Migrar a OIDC para eliminar credenciales estáticas completamente. | Media/Alta |
Referencias
docs/08-seguridad-buenas-practicas.md— Seguridad general de CI/CD en CCsoft.docs/04-integracion-bitbucket-aws.md— Integración de Bitbucket con AWS (incluye OIDC).05-pipeline-bitbucket.md— Funcionamiento del pipeline deproyectosacc.08-seguridad-y-secretos.md— Gestión de secrets enproyectosacc.
Área de Tecnología y Desarrollo — CCsoft — Abril 2026