Wie übergebe ich mit CodeBuild temporäre Anmeldeinformationen für AssumeRole an die Docker-Laufzeit?

Lesedauer: 3 Minute
0

Ich möchte temporäre Anmeldeinformationen für AssumeRole mit AWS CodeBuild an die Docker-Laufzeit übergeben.

Kurze Beschreibung

CodeBuild verwendet die CodeBuild-Servicerolle als standardmäßige AWS-Anmeldeinformationen im Build-Container. Die Docker-Laufzeit, die im Build-Container ausgeführt wird, erhält keine AWS-Anmeldeinformationen und muss explizit konfiguriert werden.

Exportieren Sie die AssumeRole-Anmeldeinformationen als Umgebungsvariablen. Übergeben Sie diese Variablen dann an die Docker-Laufzeit, indem Sie den Parameter --build-arg für Docker-Build verwenden. Weitere Informationen finden Sie unter Docker-Build auf der Docker Docs-Website.

Lösung

1.Erstellen Sie eine neue Rolle für die Docker-Laufzeit. Zum Beispiel: Secretassumerole

2.Aktualisieren Sie die Vertrauensverhältnis-Richtlinie von Secretassumerole und fügen Sie Ihre CodeBuild-Servicerolle hinzu, um die Rolle zu übernehmen. Zum Beispiel:

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

3.Verwenden Sie die neue Rolle, um den geheimen AWSExampleSecret-Wert vom AWS Secrets Manager abzurufen. Zum Beispiel:

{
  "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"
      ]
    }
  ]
}

**Hinweis:**Ersetzen Sie $account_id durch Ihre Konto-ID. Sie können während der Docker-Laufzeit jede Operationsgenehmigung erteilen.

4.Fügen Sie Ihrer CodeBuild-Servicerolle die Berechtigungen sts:assumeRole hinzu, um AssumeRole-Operationen zuzulassen. Zum Beispiel:

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

5.Verwenden Sie eine Build-Spezifikation, um die AssumeRole-Anmeldeinformationen in eine Umgebungsvariable zu exportieren. Verwenden Sie dann den Befehl docker build, um die Anmeldeinformationen an Ihre Docker-Laufzeit zu übergeben. Zum Beispiel:

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

**Hinweis:**Sie können --duration-seconds verwenden, um die maximale Sitzungsdauer für die Rolle übernehmen festzulegen. Da dieser Prozess die Verkettung von Rollen beinhaltet, akzeptiert die Option \ --duration-seconds einen Maximalwert von 3600 Sekunden. Wenn Sie einen Wert über 3600 Sekunden festlegen, schlägt der Vorgang fehl. Weitere Informationen finden Sie im Abschnitt Rollenverkettung unter Begriffe und Konzepte von Rollen.

6.Rufen Sie in Ihrem Dockerfile die AssumeRole-Anmeldeinformationen ab, wenn Sie ein Image erstellen. Zum Beispiel:

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

**Hinweis:**Sie können RUN aws secretsmanager get-secret-value --secret-id tutorials/AWSExampleSecret in DOCKERFILE hinzufügen, um die Geheimnisse im Build abzurufen. Warnung: Auf diese Weise können Sie Ihre Geheimnisse in den Build-Protokollen preisgeben.

Ausgabe:

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 OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr