Comment résoudre les erreurs de jeton de sécurité expiré lors de l'exécution d'applications Java sur Amazon EC2 ?

Date de la dernière mise à jour : 04/03/2021

Mes applications Java qui utilisent AWS SDK pour Java sur une instance Amazon Elastic Compute Cloud (Amazon EC2) reçoivent une exception du type :

com.amazonaws.AmazonServiceException: The security token included in the request is expired (Service: AmazonSQS; Status Code: 403; Error Code: ExpiredToken; Request ID: 12a345b6-78cd-901e-fg23-45hi67890jkl)

Comment résoudre ce problème ?

Brève description

Toutes les demandes d'API d'application à Amazon Web Services (AWS) doivent être signées de manière chiffrée avec des informations d'identification émises par AWS.

Si votre application utilise des informations d'identification temporaires lors de la création d'un client AWS, celles-ci expirent dans l'intervalle de temps alors spécifié. Vous devez actualiser ces informations d'identification avant qu'elles n'expirent.

Une autre raison de l'expiration est l'utilisation d'une heure incorrecte. Une référence temporelle cohérente et précise est cruciale pour de nombreux processus et tâches serveur. Les informations d'identification AWS sont rejetées si la date et l'heure de votre instance ne sont pas définies correctement.

Si votre application s'exécute sur une instance Amazon EC2, il est recommandé d'utiliser un rôle AWS Identity and Access Management (IAM) attribué à l'instance. L'utilisation d'un rôle IAM permet celle d'un constructeur de service par défaut. Le client constructeur par défaut recherche les informations d'identification à l'aide de la chaîne de fournisseurs d'informations d'identification par défaut, dans l'ordre suivant :

  1. Dans les variables d'environnement système : AWS_ACCESS_KEY_ID et AWS_SECRET_ACCESS_KEY.
  2. Dans les propriétés du système Java : aws.accessKeyId et aws.secretKey.
  3. Dans le fichier des informations d'identification par défaut (dont l'emplacement varie en fonction de la plateforme).
  4. Dans le profil d'instance des informations d'identification contenues dans les métadonnées d'instance associées au rôle IAM pour l'instance EC2. L'attachement d'un profil d'instance à votre instance ajoute des informations d'identification de profil d'instance à la chaîne de fournisseurs d'informations d'identification par défaut. Pour plus d'informations, consultez Utilisation d'un rôle IAM pour accorder des autorisations à des applications s'exécutant sur des instances Amazon EC2.

Si les informations d'identification du profil d'instance sont disponibles, le constructeur client par défaut crée une instance de la classe InstanceProfileCredentialsProvider du kit SDK AWS. AWS utilise cette classe pour signer des demandes d'API avec des informations d'identification AWS à l'aide d'informations d'identification de sécurité temporaires provenant des métadonnées d'instanceAmazon EC2.

Important : si votre application utilise la classe ProfileCredentialsProvider du kit SDK AWS pour fournir des informations d'identification AWS temporaires, vous devez les vérifier et les actualiser avant qu'elles n'expirent. À défaut, votre application risque de rencontrer l'erreur ExpiredToken.

Solution

Utiliser Amazon Time Sync Service ou les sources NTP

Configurez Amazon Time Sync Service ou une autre source NTP (Network Time Protocol) sur votre instance Amazon EC2. Votre instance Linux disposera alors d'une référence temporelle cohérente et précise. Pour plus d'informations, consultez les sections Régler l'heure pour votre instance Linux ou Régler l'heure pour une instance Windows.

Utiliser des informations d'identification AWS temporaires personnalisées

Actualisez les informations d'identification temporaires cinq minutes avant leur expiration.

Utilisation d'un rôle IAM assigné à une instance

Attachez un profil d'instance à votre instance. Pour plus d'informations, consultez Utilisation d'un rôle IAM pour accorder des autorisations à des applications s'exécutant sur des instances Amazon EC2. Vérifiez qu'aucune autre information d'identification n'est spécifiée dans votre code ou sur l'instance. Les informations d'identification du profil d'instance sont le dernier endroit où la chaîne du fournisseur d'informations d'identification par défaut recherche des informations d'identification. Toute information d'identification située en amont de la chaîne de recherche empêche l'utilisation de l'IAM. Pour plus d'informations, consultez Utilisation des informations d'identification AWS.

Pour voir les informations d'identification AWS d'un rôle IAM associé à une instance, exécutez les commandes ci-dessous à partir d'un shell Linux ou de Windows PowerShell (version 3.0 ou ultérieure). Pensez à remplacer examplerole par le nom de votre rôle IAM.

Linux

Utilisez la commande curl pour afficher les informations d'identification AWS :

$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/examplerole

Ce qui renvoie ce type de sortie :

{
    "Code" : "Success",
    "LastUpdated" : "2016-04-26T16:39:16Z",
    "Type" : "AWS-HMAC",
    "AccessKeyId" : "AKIAIOSFODNN7EXAMPLE",
    "SecretAccessKey" : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
    "Token" : "token",
    "Expiration" : "2016-04-27T22:39:16Z"
}

Remarque : si la commande curl renvoie une erreur 404 :

1.    Utilisez cette commande pour vérifier que le proxy HTTP est désactivé pour l'adresse IP des métadonnées :

$ export NO_PROXY=169.254.169.254

2.    Vérifiez que l'instance n'effectue pas plusieurs demandes simultanées et n'exécute pas plusieurs sessions en parallèle, ce qui peut entraîner une limitation par le service de métadonnées d'instance (IMDS). Pour atténuer ce problème, utilisez la mise en cache et un algorithme d'intervalle exponentiel entre les tentatives. Comme pour tout service, les appels peuvent parfois échouer : si tel est le cas, les clients sont supposés réessayer. Pour plus d'informations, consultez la section Limitation des demandes.

Pour implémenter de nouvelles tentatives, modifiez AWS_METADATA_SERVICE_NUM_ATTEMPTS. Vous pouvez définir des options à l'aide de variables d'environnement, dans le fichier ~/.aws/config ou dans la session botocore de l'utilisateur. Pour plus d'informations, consultez la section Configuration dans la documentation Boto3 DOCS 1.17.6.

Exemple :

AWS_METADATA_SERVICE_TIMEOUT = 10
AWS_METADATA_SERVICE_NUM_ATTEMPTS = 5

3.    Si vous exécutez le test curl dans un conteneur docker, vous devez modifier instance-metadata-options http-put-response-hop-limit :

$ aws ec2 modify-instance-metadata-options --instance-id $(curl 169.254.169.254/latest/meta-data/instance-id) --http-put-response-hop-limit 2 --http-endpoint enabled

Pour plus d'informations, voir l'article Add defense in depth against open firewalls, reverse proxies, and SSRF vulnerabilities with enhancements to the EC2 Instance Metadata Service.

4.    Vérifiez que le profil d'instance est correctement attaché à l'instance.

Windows

Utilisez la commande Invoke-RestMethod pour afficher les informations d'identification AWS :

PS C:\> Invoke-RestMethod http://169.254.169.254/latest/meta-data/iam/security-credentials/examplerole

Ce qui renvoie ce type de sortie :

Code            : Success
LastUpdated     : 2016-07-18T18:09:47Z
Type            : AWS-HMAC
AccessKeyId     : AKIAIOSFODNN7EXAMPLE
SecretAccessKey : wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Token           : token
Expiration      : 2016-04-27T22:39:16Z

Utilisez ces commandes pour vérifier les dernières informations d'identification temporaires pour l'instance. Ces informations d'identification tournent ou s'actualisent automatiquement environ cinq minutes avant l'expiration des informations d'identification temporaires affectées.

Informations connexes

Utilisation des informations d'identification AWS (AWS SDK pour Java)

Utilisation des informations d'identification (AWS SDK pour Java 2.0)

Rôles IAM pour Amazon EC2

Configuration des rôles IAM pour Amazon EC2 (avancé)


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?