top of page
Buscar

Usa pipelines de Bitbucket sin credenciales de AWS

  • victoriagimenez5
  • 9 abr
  • 4 Min. de lectura

IAM-Role-granting-permissions-to-allow-Bitbucket-pipelines-to-access-resources-in-AWS-accounts

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.

IAM-Identity-provider-for-Bitbucket-in-AWS-account

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.

create-an-IAM-Role

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:

original-Trust-policy-provided-by-AWS

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

only-one-repository-that-can-assume-the-role

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

 
 
bottom of page