Come posso passare le credenziali temporanee per AssumeRole nel runtime Docker con CodeBuild?

4 minuti di lettura
0

Voglio passare le credenziali temporanee per AssumeRole nel runtime Docker con AWS CodeBuild.

Breve descrizione

CodeBuild utilizza il ruolo del servizio CodeBuild come credenziale AWS predefinita nel contenitore di compilazione. Il runtime Docker in esecuzione all'interno del contenitore di compilazione non ottiene alcuna credenziale AWS e deve essere configurato in modo esplicito.

Esporta le AssumeRole come variabili di ambiente. Quindi, passa queste variabili nel runtime Docker utilizzando il parametro \ --build-arg per docker build. Per ulteriori informazioni, consulta docker build sul sito Web di Docker Docs.

Risoluzione

  1. Crea un nuovo ruolo per il runtime Docker. Ad esempio: Secretassumerole

  2. Aggiorna la politica sulle relazioni fiduciarie di Secretassumerole e aggiungi l'autorizzazione al ruolo di servizio CodeBuild per assumere il ruolo. Ad esempio:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::$account_id:role/service-role/codebuild-service-role"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
  1. Usa il nuovo ruolo per ottenere il valore segreto AWS ExampleSecret da AWS Secrets Manager. Ad esempio:
{
  "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: Sostituisci $account\ _id con l'ID del tuo account. Puoi concedere qualsiasi autorizzazione operativa durante il runtime di Docker.

  1. Aggiungi le autorizzazioni sts:assumeRole al tuo ruolo di servizio CodeBuild per consentire le operazioni di AssumeRole. Ad esempio:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor1",
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::$account_id:role:role/Secretassumerole"
    }
  ]
}
  1. Usa una specifica di build per esportare le credenziali AssumeRole in una variabile di ambiente. Quindi, usa il comando docker build per passare le credenziali nel tuo runtime Docker. Ad esempio:
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: Puoi usare **\ --duration-seconds ** per impostare la durata massima della sessione per il ruolo di assume. Poiché questo processo prevede il concatenamento dei ruoli, l'opzione \ --duration-seconds accetta un valore massimo di 3600 secondi. Se si imposta un valore superiore a 3600 secondi, l'operazione non riesce. Per ulteriori informazioni, consulta la sezione relativa al concatenamento dei Ruoli dei termini e dei concetti relativi ai ruoli.

  1. Nel tuo Dockerfile, ottieni le credenziali AssumeRole quando crei un'immagine. Ad esempio:
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: Puoi aggiungere RUN aws secretsmanager get-secret-value --secret-id tutorials/awseXampleSecret in DOCKERFILE per recuperare i segreti nella build. Avvertenza: In questo modo puoi svelare i tuoi segreti nei log di costruzione.

Uscita:

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
AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa