Usa pipelines de Bitbucket sin credenciales de AWS
- victoriagimenez5
- 9 abr
- 4 Min. de lectura

Ya te mostramos cómo usar GitHub Actions para acceder a recursos de AWS sin usar credenciales de AWS como secretos. Ahora, hagamos lo mismo para las tuberías de Bitbucket.
Introducción
A veces necesitamos usar las tuberías de Bitbucket para acceder a recursos en nuestras cuentas de AWS, por ejemplo, para subir una imagen de Docker a repositorios privados de ECR, poner y obtener objetos de buckets de S3, o desplegar aplicaciones en EC2, Beanstalk, EKS, ECS, entre otros.
Todos estos escenarios requieren que la tubería de Bitbucket tenga permiso para realizar acciones sobre los recursos en AWS. En este Teratip, te muestro cómo otorgar estos permisos utilizando un Rol de IAM, que es la mejor opción porque los Roles de IAM proporcionan acceso temporal mediante tokens, en lugar de credenciales fijas.
Provedor de identidad
El primer paso es agregar un proveedor de identidad IAM OpenID Connect para Bitbucket en tu cuenta de AWS.

Obtén la URL del proveedor y el público desde Bitbucket > Configuración del repositorio > OpenID Connect.
Rol de IAM
Ahora vamos a crear un Rol de IAM eligiendo Identidad web en el tipo de entidad de confianza y seleccionando el proveedor de identidad y el público.

Después de hacer clic en Siguiente, elige los permisos que tu tubería necesita para realizar acciones sobre los servicios de AWS.
Política de confianza
Durante la creación del Rol de IAM, AWS nos proporcionará la política de confianza que define quién puede asumir el rol. Es posible editar la política de confianza para restringir el uso solo a repositorios específicos en el espacio de trabajo de Bitbucket utilizando el UUID del repositorio.
Obtén esta información de Bitbucket > Configuración del repositorio > OpenID Connect.
Este ejemplo muestra la política de confianza original proporcionada por AWS que otorga acceso a todos los repositorios en el espacio de trabajo:

Y este ejemplo define solo un repositorio que puede asumir el rol:

La principal diferencia está en el bloque de condición. En la primera política, el público está definido por:
Mientras que la segunda define solo un repositorio utilizando el UUID del repositorio con:
Este cambio en el acceso a AWS desde las tuberías de Bitbucket mejora la seguridad de tu cuenta, reemplazando credenciales fijas que pueden ser utilizadas por cualquier persona que tenga acceso a ellas, por un rol de acceso temporal que solo puede ser asumido por las entidades definidas en la política de confianza.
Configura el pipeline para usar el Rol de IAM
The last step is to update the bitbucket-pipeline.yml with the following block of code:
image: amazon/aws-cli
pipelines:
default:
- step:
oidc: true
script:
- export AWS_REGION=us-east-1
- export AWS_ROLE_ARN=arn:aws:iam::XXXXXXXXXXXX:role/bitbucketRole
- export AWS_WEB_IDENTITY_TOKEN_FILE=$(pwd)/web-identity-token
- echo $BITBUCKET_STEP_OIDC_TOKEN > $(pwd)/web-identity-token
- aws sts get-caller-identity
AWS_REGION will be the region where the AWS resources exist.
AWS_ROLE_ARN is the ARN of your role.
El comando aws sts get-caller-identity no es realmente necesario, solo es una confirmación de que el rol se asume correctamente.
Usando Terraform
Puedes aplicar toda esta configuración utilizando Terraform con el siguiente código:
Proveedor de identidad
resource "aws_iam_openid_connect_provider" "bitbucket" {
url = "https://api.bitbucket.org/2.0/workspaces/rubioignacio/pipelines-config/identity/oidc" client_id_list = ["ari:cloud:bitbucket::workspace/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"] thumbprint_list = ["a031c46782e6e6c662c2c87c76da9aa62ccabd8e"]
}
El Thumbprint se genera basado en la clave SSL del certificado del OpenID de Bitbucket. Este valor se basa en la URL, por lo que es estático y se puede copiar y pegar fácilmente.
Rol de IAM
resource "aws_iam_role" "bitbucket_role" {
name = "BitbucketRole"
assume_role_policy = data.aws_iam_policy_document.bitbucket_role_trust_policy.json
}
data "aws_iam_policy_document" "bitbucket_role_trust_policy" {
statement {
sid = ""
effect = "Allow"
actions = ["sts:AssumeRoleWithWebIdentity"]
condition {
test = "StringLike"
values = ["{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}:*"]
}
principals {
type = "Federated"
identifiers = ["arn:aws:iam::xxxxxxxxxxxx:oidc-provider/api.bitbucket.org/2.0/workspaces/rubioignacio/pipelines-config/identity/oidc"]
}
}
}
resource "aws_iam_role_policy_attachment" "ecr_policy_attachment" {
role = aws_iam_role.bitbucket_role.arn
policy_arn = "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess"
}
resource "aws_iam_role_policy_attachment" "beanstalk_policy_attachment" {
role = aws_iam_role.bitbucket_role.arn
policy_arn = "arn:aws:iam::aws:policy/AdministratorAccess-AWSElasticBeanstalk"
}
Conclusión
La configuración de Bitbucket Pipelines para acceder a recursos de AWS mediante roles de IAM con delegación de identidad ofrece una forma más segura y eficiente de gestionar las credenciales. Al reemplazar las credenciales fijas por un rol que otorga acceso temporal, reduces riesgos de seguridad y mejoras la administración de tus recursos.
Siguiendo estos pasos, puedes garantizar que tus procesos de CI/CD en Bitbucket sean seguros y eficientes, permitiendo un acceso controlado a tus recursos de AWS. ¡Ahora estás listo para implementar esta configuración en tu entorno!

Ignacio Rubio
Cloud Engineer
Teracloud