Come posso risolvere l'errore AWS STS "il token di sicurezza incluso nella richiesta è scaduto" quando si utilizza l'interfaccia a riga di comando di AWS per assumere un ruolo IAM?

Ultimo aggiornamento: 17/05/2022

Ho provato ad assumere un ruolo AWS Identity and Access Management (IAM) attraverso AWS Command Line Interface (AWS CLI). Ho ricevuto un errore simile al seguente:

"Il token di sicurezza incluso nella richiesta è scaduto".

Breve descrizione

Le credenziali di sicurezza temporanee per gli utenti IAM vengono richieste utilizzando il servizio AWS Security Token Service (AWS STS). Per impostazione predefinita, le credenziali temporanee create con l'operazione API AssumeRole durano un'ora. Dopo la loro scadenza, le credenziali temporanee non possono essere riutilizzate. Per ulteriori informazioni, consulta Credenziali di sicurezza temporanee in IAM.

Risoluzione

Completa i seguenti passaggi per la risoluzione dei problemi del tuo caso d'uso.

Se ricevi un messaggio di errore durante l'esecuzione dei comandi di AWS CLI, assicurati di utilizzare la versione più recente di AWS CLI.

Assicurati che le tue richieste di credenziali di sicurezza temporanee possano raggiungere gli endpoint AWS

La definizione delle credenziali per un ruolo richiede un ID chiave di accesso, una chiave di accesso segreta e un token di sessione. Le richieste inviate devono raggiungere l'endpoint AWS entro cinque minuti dal timestamp sulla richiesta altrimenti la richiesta verrà negata. Per ulteriori informazioni, consulta Perché le richieste sono firmate.

Uso dei profili per assumere un ruolo IAM

Un profilo denominato è una raccolta di impostazioni e credenziali che è possibile applicare a un comando di AWS CLI. Verifica sempre di utilizzare le credenziali corrette.

Il seguente comando di AWS CLI utilizza le credenziali di profilo di default:

aws s3 ls

Questo comando di esempio utilizza le credenziali del profilo project1 configurate nel file .config:

aws s3 ls --profile project1

Output di esempio in cui sono utilizzate credenziali scadute:

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

Questi profili sono definiti nella cartella .aws contenente i file .credentials e .config.

Il file di configurazione si trova in ~/.aws/config per Linux/macOS e C:\Users\%USERPROFILE%\.aws\config per Windows. Il file delle credenziali si trova in ~/.aws/credentials per Linux/macOS e C:\Users\%USERPROFILE%\.aws\credentials per Windows.

Per verificare le credenziali del profilo di default, emetti il seguente comando:

aws configure list --profile default

Output di esempio:

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

Per confermare che le stesse credenziali siano utilizzate per il profilo project1, emetti il seguente comando:

aws configure list --profile project1

Output di esempio:

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

Nell'output di esempio, tieni presente che è possibile che configurare credenziali diverse per i profili di default e project1.

Puoi creare un profilo nel tuo file .aws/config utilizzando il seguente formato:

[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>

Queste credenziali vengono fornite quando esegui il comando assume-role di AWS STS in modo simile al seguente:

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

Output di esempio:

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

Nota: puoi aumentare la scadenza della durata massima di una sessione per le credenziali temporanee per i ruoli IAM utilizzando il parametro DurationSeconds per il tuo caso d'uso.

La nuova chiamata API assume-role recupera quindi un nuovo set di credenziali valide. Dopo la chiamata API, dovrai aggiornare manualmente il file ~/.aws/config con le nuove credenziali temporanee.

Puoi evitare di aggiornare il file di configurazione ogni volta che scade una sessione. Definisci un profilo per il ruolo IAM insieme all'utente che assume il ruolo nel file ~/.aws/config o ~/.aws/credentials come riportato di seguito:

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

Tieni presente che user1 è definito nel tuo file ~/.aws/credentials in modo simile al seguente:

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

Definire source_profile significa che non è necessario aggiornare le credenziali temporanee nel file ~/.aws/config o ~/.aws/credentials.

Il seguente comando di AWS CLI elenca i bucket Amazon Simple Storage Service (Amazon S3) con le credenziali per user1 che si trovano nel file ~/.aws/credentials.

aws s3 ls --profile project1

Se utilizzi AWS CLI con un elemento source_profile, la chiamata API assume-role inserisce le credenziali nel file .aws/cli/cache. Le credenziali scadute vengono aggiornate automaticamente nel file .aws/cli/cache. Se ricevi un errore di credenziali scadute, puoi cancellare la cache con i seguenti comandi:

Linux/macOS:

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

Windows:

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

AWS CLI crea nuove credenziali nella cache.

Crea variabili d'ambiente per assumere il ruolo IAM e verifica l'accesso

Puoi utilizzare le credenziali del ruolo IAM per creare tre variabili di ambiente per assumere il ruolo IAM come riportato di seguito:

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

Per verificare di aver assunto il ruolo IAM corretto, emetti il seguente comando:

aws sts get-caller-identity

Il comando get-caller-identity visualizza informazioni sull'identità IAM utilizzata per autenticare la richiesta. Per ulteriori informazioni, vedi Come posso assumere un ruolo IAM utilizzando AWS CLI?

Le variabili di ambiente contengono credenziali temporanee memorizzate nella cache anche dopo la loro scadenza e non vengono rinnovate automaticamente. Utilizza i seguenti comandi per verificare se le variabili di ambiente delle credenziali sono impostate:

Linux/macOS:

$ printenv | grep AWS

Windows:

C:\>set AWS

Puoi rimuovere le variabili d'ambiente scadute con i seguenti comandi:

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=

Ora puoi utilizzare nuovamente la chiamata API assume-role per ottenere nuove credenziali valide e impostare di nuovo le variabili di ambiente.

Importante: i file .aws/credentials e .aws/config contengono i dettagli delle credenziali per le tue entità IAM. Quando gestisci le tue credenziali, assicurati di seguire le best practice di sicurezza in IAM.