Je veux transmettre des informations d'identification temporaires pour AssumeRole à l'environnement 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 version et l'environnement d'exécution Docker.
Exportez les informations d'identificationAssumeRole en tant que variables d'environnement. Ensuite, transmettez ces variables dans l'environnement d'exécution Docker à l'aide du paramètre docker build --build-arg. Pour plus d'informations, consultez la section docker build sur le site Web Docker Docs.
Solution
1. Créez un rôle pour l'environnement d'exécution Docker. Par exemple : Secretassumerole
2. Mettez à jour la politique de relation de confiance de Secretassumerole et ajoutez votre autorisation de fonction du 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 AWSExampleSecret du secret à 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 l'ID de votre compte. Vous pouvez accorder n'importe quelle autorisation d'opération pendant l'exécution de Docker.
4. Ajoutez des autorisations sts:assumeRole à votre fonction du 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 version pour exporter les informations d'identification AssumeRole dans une variable d'environnement. Ensuite, utilisez la commande “docker build” (version de docker) 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 maximale de la session pour le rôle assume. L'option --duration-seconds accepte une valeur comprise entre 1 heure et 12 heures. Si vous définissez une valeur supérieure à 12 heures, l'opération échoue.
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_DEFAULT_REGION
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 dans la création. Avertissement : cela peut révéler vos secrets dans les journaux de compilation
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