Comment résoudre l'erreur AWS STS « the security token included in the request is expired » (le jeton de sécurité inclus dans la demande a expiré) lorsque j'utilise l'AWS CLI pour assumer un rôle IAM ?

Date de la dernière mise à jour : 17/05/2022

J'ai essayé d'assumer un rôle AWS Identity and Access Management (IAM) en utilisant l'AWS Command Line Interface (AWS CLI). Toutefois, un message d'erreur de ce type s'affiche :

« The security token included in the request is expired. » (Le jeton de sécurité inclus dans la demande a expiré.)

Brève description

Les informations d'identification de sécurité temporaires pour les utilisateurs IAM sont demandées à l'aide du service AWS Security Token Service (AWS STS). Les informations d'identification temporaires créées avec l'action AssumeRole de l'API durent une heure par défaut. Une fois que les informations d'identification temporaires ont expiré, elles ne peuvent plus être réutilisées. Pour plus d'informations, consultez Informations d'identification de sécurité temporaires dans IAM.

Solution

Suivez les étapes de dépannage suivantes pour votre cas d'utilisation.

Si vous recevez des erreurs lors de l'exécution de commandes depuis l'AWS CLI, assurez-vous que vous utilisez la version d'AWS CLI la plus récente.

Assurez-vous que vos demandes d'informations d'identification de sécurité temporaires peuvent atteindre les points de terminaison AWS

L'établissement d'informations d'identification pour un rôle nécessite un identifiant de la clé d'accès, une clé d'accès secrète et un jeton de session. Les demandes envoyées doivent atteindre le point de terminaison AWS dans les cinq minutes suivant l'horodatage de la demande, sinon la demande est refusée. Pour plus d'informations, consultez Pourquoi les demandes sont signées.

Utilisation de profils pour assumer un rôle IAM

Un profil nommé est une collection de paramètres et d'informations d'identification que vous pouvez appliquer à une commande AWS CLI. Vous devez vérifier que vous utilisez les informations d'identification correctes.

La commande AWS CLI suivante utilise les informations d'identification du profil par défaut :

aws s3 ls

Cet exemple de commande utilise les informations d'identification du profil project1 configurées dans le fichier .config :

aws s3 ls --profile project1

Exemple de sortie utilisant des informations d'identification expirées :

"An error occurred (ExpiredToken) when calling the ListBuckets operation: The provided token has expired."

Ces profils sont définis dans votre dossier .aws contenant les fichiers .credentials et .config.

Le fichier de configuration se trouve dans ~/.aws/config pour Linux/macOS et C:\Users\%USERPROFILE%\.aws\config pour Windows. Le fichier d'informations d'identification se trouve dans ~/.aws/credentials pour Linux/macOS et C:\Users\%USERPROFILE%\.aws\credentials pour Windows.

Pour vérifier les informations d'identification de votre profil par défaut, exécutez la commande suivante :

aws configure list --profile default

Exemple de sortie :

Name Value Type Location
---- ----- ---- --------
profile default manual —profile
access_key TGN7 shared-credentials-file
secret_key SbXb shared-credentials-file
region us-east-1 config-file ~/.aws/config

Pour confirmer que les mêmes informations d'identification sont utilisées pour le profil project1, exécutez la commande suivante :

aws configure list --profile project1

Exemple de sortie :

Name Value Type Location
---- ----- ---- --------
profile project1 manual —profile
access_key QN2X config-file
secret_key LPYI config-file
region eu-west-1 config-file ~/.aws/config

Dans l'exemple de sortie, notez que des informations d'identification différentes peuvent être configurées pour les profils par défaut et project1.

Vous pouvez créer un profil dans votre fichier .aws/config en utilisant le format suivant :

[profile project1]
region = eu-west-1
aws_access_key_id = <access-Key-for-an-IAM-role>
aws_secret_access_key = <secret-access-Key-for-an-IAM-role>
aws_session_token = <session-token>

Ces informations d'identification vous sont fournies lorsque vous exécutez la commande AWS STS assume-role similaire à ce qui suit :

aws sts assume-role --role-arn arn:aws:iam::<account-number>:role/Prod-Role --role-session-name environment-prod

Exemple de sortie :

{
"AssumedRoleUser": {
"AssumedRoleId": "AROAXXXXXXXXXXXX:environment-prod",
"Arn": "arn:aws:sts::<account-number>:assumed-role/Prod-Role/environment-prod"
},
"Credentials": {
"SecretAccessKey": "<secret-access-Key-for-an-IAM-role>,
"SessionToken": "<session-token>",
"Expiration": "2020-03-31T17:17:53Z",
"AccessKeyId": "<access-Key-for-an-IAM-role>"
}

Remarque : vous pouvez augmenter le délai d'expiration maximal de la session pour les informations d'identification temporaires des rôles IAM à l'aide du paramètre DurationSeconds pour votre cas d'utilisation.

Le nouvel appel d'API assume-role récupère alors un nouvel ensemble d'informations d'identification valides. Après l'appel d'API, vous devez mettre à jour manuellement le fichier ~/.aws/config avec les nouvelles informations d'identification temporaires.

Vous pouvez éviter de mettre à jour le fichier de configuration à chaque fois qu'une session expire. Définissez un profil pour le rôle IAM ainsi que l'utilisateur qui assume le rôle dans le fichier ~/.aws/config ou ~/.aws/credentials similaire à ce qui suit :

[profile project1]
role_arn = <arn-of-IAM-role>
source_profile = user1
region = <region>

Notez que user1 est défini dans votre fichier ~/.aws/credentials similaire à ce qui suit :

[user1]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

La définition du source_profile signifie que vous n'avez pas à mettre à jour vos informations d'identification temporaires dans le fichier ~/.aws/config ou ~/.aws/credentials.

La commande AWS CLI suivante répertorie les compartiments Amazon Simple Storage Service (Amazon S3) avec les informations d'identification pour user1 situées dans le fichier ~/.aws/credentials.

aws s3 ls --profile project1

Si vous utilisez l'AWS CLI avec un élément source_profile, l'appel d'API assume-role place les informations d'identification dans le fichier .aws/cli/cache. Les informations d'identification expirées sont automatiquement mises à jour dans le fichier .aws/cli/cache. Si vous recevez une erreur pour des informations d'identification expirées, vous pouvez effacer le cache à l'aide des commandes suivantes :

Linux/macOS :

$ rm -r ~/.aws/cli/cache

Windows :

C:\> del /s /q %UserProfile%\.aws\cli\cache

L'AWS CLI crée de nouvelles informations d'identification dans le cache.

Créer des variables d'environnement pour assumer le rôle IAM et ensuite vérifier l'accès

Vous pouvez utiliser les informations d'identification du rôle IAM pour créer trois variables d'environnement afin d'assumer le rôle IAM de manière similaire à ce qui suit :

Linux/macOS :

export AWS_ACCESS_KEY_ID=RoleAccessKeyID
export AWS_SECRET_ACCESS_KEY=RoleSecretKey
export AWS_SESSION_TOKEN=RoleSessionToken

Windows :

C:\> setx AWS_ACCESS_KEY_ID RoleAccessKeyID
C:\> setx AWS_SECRET_ACCESS_KEY RoleSecretKey
C:\> setx AWS_SESSION_TOKEN RoleSessionToken

Pour vérifier que vous avez assumé le rôle IAM correct, exécutez la commande suivante :

aws sts get-caller-identity

La commande get-caller-identity affiche des informations sur l'identité IAM utilisée pour authentifier la demande. Pour plus d'informations, consultez Comment assumer un rôle IAM à l'aide de l'AWS CLI ?

Les variables d'environnement conservent les informations d'identification temporaires en cache même après leur expiration et ne sont pas renouvelées automatiquement. Utilisez les commandes suivantes pour vérifier si les variables d'environnement des informations d'identification sont définies :

Linux/macOS :

$ printenv | grep AWS

Windows :

C:\>set AWS

Vous pouvez supprimer les variables d'environnement expirées à l'aide des commandes suivantes :

Linux/macOS :

$ unset AWS_ACCESS_KEY_ID
$ unset AWS_SECRET_ACCESS_KEY
$ unset AWS_SESSION_TOKEN

Windows :

C:\>set AWS_ACCESS_KEY_ID=
C:\>set AWS_SECRET_ACCESS_KEY=
C:\>set AWS_SESSION_TOKEN=

Vous pouvez maintenant utiliser à nouveau l'appel d'API assume-role pour obtenir de nouvelles informations d'identification valides et définir à nouveau les variables d'environnement.

Important : les fichiers .aws/credentials et .aws/config contiennent des détails des informations d'identification de vos entités IAM. Lorsque vous gérez vos informations d'identification, assurez-vous de respecter les bonnes pratiques de sécurité en matière d'IAM.