Comment résoudre les erreurs de jeton de sécurité expiré lors de l'exécution d'applications Java sur Amazon EC2 ?
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 :
- Dans les variables d'environnement système : AWS_ACCESS_KEY_ID et AWS_SECRET_ACCESS_KEY.
- Dans les propriétés du système Java : aws.accessKeyId et aws.secretKey.
- Dans le fichier des informations d'identification par défaut (dont l'emplacement varie en fonction de la plateforme).
- 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 pivotent 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)
Vidéos associées
Contenus pertinents
- demandé il y a un anlg...
- demandé il y a 6 moislg...
- demandé il y a un anlg...
- demandé il y a un anlg...
- demandé il y a un anlg...
- AWS OFFICIELA mis à jour il y a 3 ans
- AWS OFFICIELA mis à jour il y a 2 ans