¿Cómo puedo pasar las credenciales temporales de AssumeRole a la versión ejecutable de Docker con CodeBuild?

4 minutos de lectura
0

Quiero pasar las credenciales temporales de AssumeRole a la versión ejecutable de Docker con AWS CodeBuild.

Descripción breve

CodeBuild utiliza el rol de servicio CodeBuild como credencial de AWS predeterminada en el contenedor de compilación. La versión ejecutable de Docker que se ejecuta dentro del contenedor de compilación no recibe ninguna credencial de AWS y debe configurarse de forma explícita.

Exporte las credenciales de AssumeRole como variables de entorno. A continuación, pase estas variables a la versión ejecutable de Docker mediante el parámetro --build-arg para el comando docker build. Para obtener más información, consulte docker build (compilación de Docker) en el sitio web de Docker Docs.

Resolución

1.    Cree un nuevo rol para la versión ejecutable de Docker. Por ejemplo: Secretassumerole

2.    Actualice la política de relaciones de confianza de Secretassumerole y añada su permiso de rol de servicio de CodeBuild para asumir el rol. Por ejemplo:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::$account_id:role/service-role/codebuild-service-role"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

3.    Utilice el nuevo rol para obtener el valor secreto AWSExampleSecret de AWS Secrets Manager. Por ejemplo:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetResourcePolicy",
        "secretsmanager:GetSecretValue",
        "secretsmanager:DescribeSecret",
        "secretsmanager:ListSecretVersionIds"
      ],
      "Resource": [
        "arn:aws:secretsmanager:ap-northeast-1:$account_id:secret:tutorials/AWSExampleSecret-EHWYme"
      ]
    }
  ]
}

**Nota:**Reemplace $account\ _id por el ID de su cuenta. Puede conceder cualquier permiso de operación durante la versión ejecutable de Docker.

4.    Añada los permisos sts:assumeRole a su rol de servicio de CodeBuild para permitir las operaciones AssumeRole. Por ejemplo:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor1",
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::$account_id:role:role/Secretassumerole"
    }
  ]
}

5.    Utilice una especificación de compilación para exportar las credenciales de AssumeRole a una variable de entorno. A continuación, utilice el comando docker build para pasar las credenciales a la versión ejecutable de Docker. Por ejemplo:

version: 0.2
phases:
  install:
    runtime-versions:
      nodejs: 16
    commands:
      - ASSUME_ROLE_ARN="arn:aws:iam::$account_id:role/Secretassumerole"
      - TEMP_ROLE=$(aws sts assume-role --role-arn $ASSUME_ROLE_ARN --role-session-name test)
      - export TEMP_ROLE
      - export AWS_ACCESS_KEY_ID=$(echo "${TEMP_ROLE}" | jq -r '.Credentials.AccessKeyId')
      - export AWS_SECRET_ACCESS_KEY=$(echo "${TEMP_ROLE}" | jq -r '.Credentials.SecretAccessKey')
      - export AWS_SESSION_TOKEN=$(echo "${TEMP_ROLE}" | jq -r '.Credentials.SessionToken')

  pre_build:
    commands:
      - echo Build started on 'date'
      - echo Building the Docker image...
      - docker build . --build-arg AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID --build-arg AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY --build-arg AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN

**Nota:**Puede usar \ --duration-seconds para establecer la duración máxima de la sesión para el rol asumido. Como este proceso implica el encadenamiento de roles, la opción --duration-seconds acepta un valor máximo de 3600 segundos. Si establece un valor superior a 3600 segundos, la operación fallará. Para obtener más información, consulte la sección Encadenamiento de roles de Términos y conceptos de roles.

6.    En su Dockerfile, obtenga las credenciales AssumeRole al compilar una imagen. Por ejemplo:

FROM amazonlinux:latest
RUN yum -y install aws-cli
ARG AWS_ACCESS_KEY_ID
ARG AWS_SECRET_ACCESS_KEY
ARG AWS_SESSION_TOKEN
RUN echo $AWS_ACCESS_KEY_ID
RUN echo $AWS_SECRET_ACCESS_KEY
RUN echo $AWS_SESSION_TOKEN
RUN aws sts get-caller-identity
RUN aws secretsmanager get-secret-value --secret-id tutorials/AWSExampleSecret --region ap-northeast-1

**Nota:**Puede añadir RUN aws secretsmanager get-secret-value --secret-id tutorials/AWSExampleSecret en DOCKERFILE para recuperar los secretos en la fase de compilación. Advertencia: Esta acción puede revelar sus secretos en los registros de compilación.

Salida:

Step 8/11 : RUN echo $AWS_ACCESS_KEY_ID
 ---> Running in 1a1b1c1d1e1f
AKIAIOSFODNN7EXAMPLE
Removing intermediate container 2a3b4c5d6e7f
 ---> 32a8170f9697
Step 9/11 : RUN echo $AWS_SECRET_ACCESS_KEY
 ---> Running in 3a3b3c3d3e3f
KJq+JNqmnNq1JirNUBkxc+kRVavgZwhpFFIJjxD6
Removing intermediate container 3a3b3c3d3e3f
 ---> 4a4b4c4d4e4f
Step 10/11 : RUN echo $AWS_SESSION_TOKEN
 ---> Running in 5a5b5c5d5e5f
FQoGZXIvYXdzEJP//////////wEaDPTjooaOAaU8NDj5oyKkAjVwT4uQHTZJdCtfOZxa6wTZVOy0Zkw+laN1RRVZhvhdPOWhU8VgK2d7ZgTlqaXn4NSrdWlnub6g5JobP4o509t3VLdMUR5ZJJcpnSlJAY5YM7vlPndroGcV+Y689ztVzQ1uVxdtpjQK1qh87fw6m0dHt7Q8Y8TferRNVvCM4kOroxPzovTbO6IkLDcBp8PhOVgtVtxEpON6nZrN990zzUmhXjT0vrtpDtAi339hhs7fzDOrnllQHSAmSerT0NhMOYVqBH1HJOq3FYnG+TUbHENpSq3kwTiPL2uoTw7/Ufrrgz4i3ENHm3rIWlbD8VuleDl5yhooKifmKDPjQAHs5HbVjD9lnxQFrCIuyvZdmsqzgoIjPt6z5H8lzugLHAAmbgiOwDoo+Oba7QU=
Removing intermediate container 5a5b5c5d5e5f
 ---> 0cc838f3c865
Step 11/11 : RUN aws sts get-caller-identity
 ---> Running in 6a6b6c6d6e6f
{
    "Account": "xxxxxxxxx",
    "UserId": "AIDACKCEVSQ6C2EXAMPLE:test",
    "Arn": "arn:aws:sts::$account_id:assumed-role/Secretassumerole/test"
}
Removing intermediate container 6d525393d667
 ---> 2da2f38adc77
Step 12/12 : RUN aws secretsmanager get-secret-value --secret-id tutorials/AWSExampleSecret --region ap-northeast-1
 ---> Running in 7a7b7c7d7e7f
{
    "Name": "tutorials/AWSExampleSecret",
    "VersionId": "1a23bb45-679c-1d2e-fg34-567891234hi5",
    "SecretString": "{\"username\":\"myserviceusername\",\"password\":\"yourPassword\"}",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": 1558616482.926,
    "ARN": "arn:aws:secretsmanager:ap-northeast-1:$account_id:secret:tutorials/M-EHWYme"
}
Removing intermediate container 8a8b8c8d8e8f
 ---> 9a9b9c9d9e9f
Successfully built 9a9b9c9d9e9f
OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año