Je souhaite transmettre des informations d'identification temporaires pour AssumeRole au moteur d'exécution Docker avec AWS CodeBuild.
Brève description
CodeBuild utilise le rôle de service CodeBuild comme informations d’identification AWS par défaut dans le conteneur de compilation. Le moteur d'exécution Docker qui s'exécute dans le conteneur de construction ne reçoit aucune information d'identification AWS et doit être configuré de manière explicite.
Exportez les informations d'**identification ** AssumeRole sous forme de variables d'environnement. Transmettez ensuite ces variables dans l'environnement d'exécution Docker à l'aide du paramètre ** \ --build-arg ** pour docker build. ** ** Pour plus d'informations, consultez docker build sur le site Web de Docker Docs.
Résolution
1. Créez un nouveau rôle pour le moteur d'exécution Docker. Par exemple : Secretassumerole
2. Mettez à jour la politique de relation de confiance de Secretassumerole et ajoutez votre autorisation de rôle de service CodeBuild pour assumer le rôle. Par exemple :
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::$account_id:role/service-role/codebuild-service-role"
},
"Action": "sts:AssumeRole"
}
]
}
3. Utilisez le nouveau rôle pour obtenir la valeur secrète AWSExampleSecret à partir d'AWS Secrets Manager. Par exemple :
{
"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"
]
}
]
}
Remarque : Remplacez $account_id par votre identifiant de compte. Vous pouvez accorder n'importe quelle autorisation d'opération pendant l'exécution de Docker.
4. Ajoutez des autorisations sts:assumeRole à votre rôle de service CodeBuild pour autoriser les opérations AssumeRole. Par exemple :
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::$account_id:role:role/Secretassumerole"
}
]
}
5. Utilisez une spécification de génération pour exporter les informations d'identification AssumeRole dans une variable d'environnement. Utilisez ensuite la commande docker build pour transmettre les informations d'identification à votre environnement d'exécution Docker. Par exemple :
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
**Remarque :**Vous pouvez utiliser ** \ --duration-seconds ** pour définir la durée de session maximale pour le rôle d'utilisateur. Comme ce processus implique un chaînage de rôles, l'**option ** \ --duration-seconds accepte une valeur maximale de 3 600 secondes. Si vous définissez une valeur supérieure à 3 600 secondes, l'opération échoue. Pour plus d'informations, consultez la section sur le chaînage des rôles de la section Termes et concepts relatifs aux rôles.
6. Dans votre Dockerfile, obtenez les informations d'identification AssumeRole lorsque vous créez une image. Par exemple :
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
**Remarque :**Vous pouvez ajouter RUN aws secretsmanager get-secret-value --secret-id tutorials/AWSExampleSecret dans DOCKERFILE pour récupérer les secrets lors de la compilation. Avertissement : Cela peut révéler vos secrets dans les journaux de construction.
Sortie :
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