In che modo è possibile risolvere l'errore "Il token di sicurezza incluso nella richiesta è scaduto" quando si eseguono applicazioni Java su Amazon EC2?

5 minuti di lettura
0

Le mie applicazioni Java che usano l'AWS SDK per Java sull'istanza Amazon Elastic Compute Cloud (Amazon EC2) riscontrano un'eccezione simile alla seguente: com.amazonaws.AmazonServiceException: Il token di sicurezza incluso nella richiesta è scaduto (Servizio: AmazonSQS; Codice stato: 403; Codice errore: ExpiredToken; ID richiesta: 12a345b6-78cd-901e-fg23-45hi67890jkl) Come posso risolvere questo problema?

Breve descrizione

Tutte le richieste API delle applicazioni ad Amazon Web Services (AWS) devono essere firmate crittograficamente utilizzando le credenziali emesse da AWS.

Se l'applicazione utilizza credenziali temporanee durante la creazione di un client AWS, le credenziali scadono all'intervallo di tempo specificato durante la creazione. È necessario aggiornare le credenziali prima che scadano.

Un altro motivo della scadenza è l'utilizzo dell'ora errata. Un riferimento orario coerente e accurato è fondamentale per molti processi e attività del server. Se la data e l'ora dell'istanza non sono impostate correttamente, le credenziali AWS vengono rifiutate.

Se l'applicazione è in esecuzione su un'istanza Amazon EC2, una best practice consiste nell’utilizzare un ruolo AWS Identity and Access Management (IAM) assegnato all'istanza. L'utilizzo di un ruolo IAM permette l'utilizzo di un costruttore del servizio predefinito. Il client di costruzione predefinito cerca le credenziali utilizzando la catena di provider di credenziali predefinita, nel seguente ordine:

  1. Nelle variabili di ambiente di sistema: AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY.
  2. Nelle proprietà del sistema Java: aws.accessKeyId e aws.secretKey.
  3. Nel file delle credenziali di default (la posizione di questo file varia in base alla piattaforma).
  4. Nelle credenziali del profilo di istanza contenute nei metadati dell'istanza associati al ruolo IAM per l'istanza EC2. L'associazione di un profilo di istanza all'istanza aggiunge le credenziali del profilo di istanza alla catena di provider di credenziali predefinita. Per ulteriori informazioni, consulta Utilizzo di un ruolo IAM per concedere autorizzazioni alle applicazioni in esecuzione su istanze Amazon EC2.

Se sono disponibili credenziali del profilo di istanza, il costruttore client predefinito crea un'istanza della classe InstanceProfileCredentialsProvider dell'SDK AWS. AWS utilizza questa classe per firmare le richieste API con credenziali AWS utilizzando credenziali di sicurezza temporanee dai metadati delle istanze Amazon EC2.

Importante: se la tua applicazione utilizza la classe ProfileCredentialsProvider dell'SDK AWS per fornire credenziali AWS temporanee, sei responsabile del controllo e dell'aggiornamento delle credenziali prima che scadano. Il mancato controllo e aggiornamento delle credenziali aumenta la probabilità di fallimento della richiesta causata da errori del tipo ExpiredToken.

Risoluzione

Utilizzo di fonti Amazon Time Sync Service o NTP

Configura Amazon Time Sync Service o un'altra fonte del protocollo NTP (Network Time Protocol) sulla tua istanza Amazon EC2. Questo garantisce che la tua istanza Linux abbia un riferimento orario coerente e accurato. Per ulteriori informazioni, consulta Impostazione dell'ora per l'istanza Linux o Impostazione dell'ora per un'istanza di Windows.

Utilizzo di credenziali AWS temporanee personalizzate

Aggiorna le credenziali temporanee cinque minuti prima della loro scadenza.

Utilizzo di un ruolo IAM assegnato a un'istanza

Collega un profilo di istanza all'istanza. Per ulteriori informazioni, consulta Utilizzo di un ruolo IAM per concedere autorizzazioni alle applicazioni in esecuzione su istanze Amazon EC2. Verifica che nel tuo codice o nelle tue istanze non siano specificate altre credenziali. Le credenziali del profilo dell'istanza sono l'ultimo posto in cui la catena di provider delle credenziali predefinita ricerca le credenziali. Se le tue credenziali si trovano in un qualsiasi altro posto precedente nella catena di ricerca, quelle credenziali impediscono l'utilizzo di IAM. Per ulteriori informazioni, consulta Utilizzo di credenziali AWS.

Per visualizzare le credenziali AWS per un ruolo IAM associato a un'istanza, esegui i seguenti comandi da una shell Linux o da Windows PowerShell (versione 3.0 o successiva). Assicurati di sostituire examplerole con il nome del tuo ruolo IAM.

Linux

Usa il comando curl per visualizzare le credenziali AWS:

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

Questo comando dà un risultato simile al seguente:

{
    "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"
}

Nota: se l'esecuzione del comando curl precedente dà un errore 404 controlla quanto segue

1.    Utilizza il seguente comando per verificare che il proxy HTTP sia disabilitato per l'indirizzo IP dei metadati:

$ export NO_PROXY=169.254.169.254

2.    Verifica che l'istanza non stia effettuando più richieste simultaneamente ed eseguendo più sessioni in parallelo. Più richieste simultanee e più sessioni in esecuzione in parallelo potrebbero causare la limitazione da parte del servizio di metadati per l'istanza (IMDS). Per ridurre questo rischio utilizza caching e nuovi tentativi con backoff esponenziale. Come accade con qualsiasi servizio, a volte le chiamate possono fallire. In tal caso occorre effettuare nuovi tentativi. Per ulteriori informazioni, consulta Limitazione delle query.

Per implementare i tentativi, modifica AWS_METADATA_SERVICE_NUM_ATTEMPTS. È possibile impostare le opzioni mediante variabili di ambiente nel file ~/.aws/config o nella sessione botocore dell'utente. Per ulteriori informazioni, consulta Configurazione nella documentazione di Boto3 DOCS 1.17.6.

Esempio:

AWS_METADATA_SERVICE_TIMEOUT = 10
AWS_METADATA_SERVICE_NUM_ATTEMPTS = 5

3.    Se stai eseguendo il test curl in un container docker, modifica 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

Per ulteriori informazioni, consulta Aggiunta di una difesa approfondita contro firewall aperti, proxy inversi e vulnerabilità SSRF con miglioramenti al servizio metadati delle istanze EC2.

4.    Verifica che il profilo dell'istanza sia collegato correttamente all'istanza.

Windows

Usa il comando Invoke-RestMethod per visualizzare le credenziali AWS:

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

Questo comando dà un risultato simile al seguente:

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

Utilizza questi comandi per controllare le credenziali temporanee più recenti per l'istanza. Queste credenziali vengono ruotate o aggiornate automaticamente circa cinque minuti prima della scadenza delle credenziali temporanee assegnate.


Informazioni correlate

Utilizzo delle credenziali AWS (AWS SDK per Java)

Utilizzo delle credenziali (AWS SDK per Java 2.0)

Ruoli IAM per Amazon EC2

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 anni fa