Salta al contenuto

Come posso risolvere l'errore "The security token included in the request is expired" che si verifica quando eseguo applicazioni Java in Amazon EC2?

5 minuti di lettura
0

Le mie applicazioni Java utilizzano AWS SDK per Java nella mia istanza Amazon Elastic Compute Cloud (Amazon EC2). Tuttavia, ricevo il messaggio di errore "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)".

Breve descrizione

Tutte le richieste API delle applicazioni devono essere firmate digitalmente con le credenziali fornite da AWS. Se l'applicazione utilizza credenziali temporanee per creare un client AWS, devo rinnovarle prima che scadano. Se le credenziali scadono, ricevi il messaggio di errore "security token included in the request is expired".

Risoluzione

Verifica che l'istanza disponga di un riferimento temporale coerente

Le credenziali scadono se utilizzano un orario errato, per cui assicurati che il server sia preciso. L'istanza EC2 deve avere un riferimento di data e ora coerente e preciso. Configura il servizio di sincronizzazione oraria di Amazon o un'altra origine NTP (Network Time Protocol) nell'istanza. Per ulteriori informazioni, consulta Modifica del fuso orario dell'istanza.

Verifica che le credenziali temporanee non siano scadute

Se utilizzi credenziali temporanee, verifica che non siano scadute. Se le credenziali temporanee sono scadute, devi generare un nuovo set di credenziali temporanee da utilizzare. È consigliabile aggiornare le credenziali temporanee cinque minuti prima che scadano.

Verifica la configurazione IAM

Per le applicazioni eseguite in un'istanza, è consigliabile utilizzare un ruolo AWS Identity and Access Management (AWS IAM) per l'istanza.

Se utilizzi un ruolo IAM, assicurati di elencare le credenziali del ruolo solo nel profilo dell'istanza. Con un ruolo IAM, il costruttore di servizi predefinito utilizza una catena di provider di credenziali predefinita per cercare le credenziali nel seguente ordine:

  1. Nelle variabili 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 predefinito.
  4. Nelle credenziali del profilo dell'istanza nei metadati dell'istanza associati al ruolo IAM.

Se elenchi le credenziali in un punto diverso dal profilo dell'istanza, il costruttore del client predefinito trova prima quelle credenziali. Questa configurazione blocca le credenziali del ruolo IAM. Per risolvere il problema, controlla le credenziali nelle altre posizioni. Per controllare il file delle credenziali predefinito, controlla la seguente posizione in base al sistema operativo:

  • Per Linux, macOS o Unix, controlla * ~/.aws/credentials.
  • Per Windows, controlla C:\Users\USERNAME\.aws\credentials.
    Nota: sostituisci USERNAME con il tuo nome utente.

Se trovi le credenziali altrove rispetto al profilo dell'istanza, rimuovile. Per ulteriori informazioni sulle configurazioni temporanee delle credenziali, consulta Fornisci credenziali temporanee a AWS SDK per Java.

Per verificare le credenziali per il ruolo IAM, esegui questo comando in base al sistema operativo. Assicurati di utilizzare Windows PowerShell versione 3.0 o successiva o una shell Linux.

Windows:

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

Nota: sostituisci examplerole con il nome del tuo ruolo IAM. Se utilizzi credenziali temporanee, il comando precedente mostra le credenziali temporanee più recenti per l'istanza.

Esempio di output:

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

Linux:

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

Nota: sostituisci examplerole con il nome del tuo ruolo IAM. Se utilizzi credenziali temporanee, il comando precedente mostra le credenziali temporanee più recenti per l'istanza. Se ricevi un errore 404 quando esegui il comando precedente, verifica di aver disattivato il proxy HTTP per l'indirizzo IP dei metadati. Inoltre, assicurati di aver collegato il profilo dell'istanza all'istanza.

Esempio di output:

{    "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: le e credenziali del ruolo ruotano o si aggiornano automaticamente cinque minuti prima della scadenza delle credenziali temporanee assegnate.

Configura la ripetizione

Nota: se ricevi errori quando esegui i comandi dell’Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori per AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Se i problemi persistono, verifica che l'istanza non stia effettuando più richieste concorrenti o eseguendo più sessioni in parallelo. Questa situazione può indurre il servizio di metadati di istanza (IMDS) a limitare la larghezza di banda della rete della query. Per mitigare il problema, utilizza il modello di ripetizione con backoff esponenziale.

Per configurare la ripetizione, aumenta il valore di AWS_METADATA_SERVICE_NUM_ATTEMPTS in modo che Boto3 possa riprovare a ottenere le credenziali dal servizio di metadati di istanza. Per impostazione predefinita, Boto3 effettua un solo tentativo prima del timeout. Inoltre, aumenta il valore di AWS_METADATA_SERVICE_TIMEOUT per aumentare il numero di secondi prima che la connessione al servizio di metadati di istanza scada. Per impostazione predefinita, il timeout della connessione si interrompe dopo 1 secondo.

Esempio di configurazione:

AWS_METADATA_SERVICE_TIMEOUT = 10
AWS_METADATA_SERVICE_NUM_ATTEMPTS = 5

Per impostare le opzioni, utilizza le variabili di ambiente, il file ~/.aws/config o la sessione botocore dell'utente. Per istruzioni, consulta Configuration (Configurazione) sul sito web della documentazione di Boto3.

Se esegui il comando curl in un container Docker, esegui questo comando AWS CLI modify-instance-metadata-options per aumentare il limite di hop a 2:

aws ec2 modify-instance-metadata-options --instance-id instance --http-put-response-hop-limit 2 --http-endpoint enabled

Nota: sostituisci instance con l'ID della tua istanza. Per ulteriori informazioni, consulta In un ambiente container, prendi in considerazione la riconfigurazione o l’aumento del limite di hop a 2 in Considerazioni sull'accesso ai metadati dell'istanza.

Informazioni correlate

Autenticazione con AWS utilizzando AWS SDK per Java 2.x

Ruoli IAM per Amazon EC2

Add defense in depth against open firewalls, reverse proxies, and SSRF vulnerabilities with enhancements to the Amazon EC2 Instance Metadata Service (Aggiunta di una difesa a più livelli contro firewall aperti, proxy inversi e vulnerabilità SSRF grazie ai miglioramenti apportati al servizio di metadati di istanza EC2)