Come posso risolvere l'errore di AWS STS "the security token included in the request is expired" quando uso AWS CLI per assumere un ruolo IAM?
Ho provato ad assumere un ruolo AWS Identity and Access Management (IAM) utilizzando l'interfaccia della linea di comando AWS (AWS CLI). Ho ricevuto il messaggio di errore "security token included in the request is expired".
Breve descrizione
Per richiedere credenziali di sicurezza temporanee per gli utenti IAM si utilizza il Servizio di token di sicurezza AWS (AWS STS). Per impostazione predefinita, le credenziali temporanee create con l'operazione API AssumeRole durano un'ora. Una volta scadute, le credenziali temporanee non possono essere riutilizzate. Per ulteriori informazioni, consulta Temporary security credentials in IAM.
Risoluzione
Segui i passaggi sotto indicati per risolvere l'errore, in base al tuo caso d'uso.
Nota: se ricevi messaggi di errore durante l'esecuzione dei comandi dell'interfaccia della linea di comando AWS (AWS CLI), consulta Troubleshooting errors for the AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.
Assicurati che le tue richieste di credenziali di sicurezza temporanee raggiungano gli endpoint AWS
La creazione 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 della richiesta, altrimenti questa viene rifiutata. Per ulteriori informazioni, consulta Why requests are signed.
Uso di profili per assumere un ruolo IAM
Un profilo denominato è una raccolta di impostazioni e credenziali che puoi applicare a un comando AWS CLI. Verifica di utilizzare le credenziali corrette.
Il comando AWS CLI seguente utilizza le credenziali del profilo predefinito:
aws s3 ls
Questo comando di esempio utilizza le credenziali del profilo project1 configurate nel file .config:
aws s3 ls --profile project1
Esempio di output quando si usano 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 nel percorso ~/.aws/config per Linux/macOS e nel percorso C:\Users\%USERPROFILE%\.aws\config per Windows. Il file delle credenziali si trova nel percorso ~/.aws/credentials per Linux/macOS e nel percorso C:\Users\%USERPROFILE%\.aws\credentials per Windows.
Per verificare le credenziali del tuo profilo predefinito, esegui il comando seguente:
aws configure list --profile default
Esempio di output:
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 verificare che le stesse credenziali siano usate per il profilo project1, esegui il comando seguente:
aws configure list --profile project1
Esempio di output:
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, nota che potrebbero essere configurate credenziali diverse per il profilo predefinito e il profilo project1.
Puoi creare un profilo nel tuo file .aws/config utilizzando il formato seguente:
[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 ti 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
Esempio di output:
{ "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 durata massima della sessione per le credenziali temporanee per i ruoli IAM usando 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, devi 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, in modo simile al seguente:
[profile project1] role_arn = <arn-of-IAM-role> source_profile = user1 region = <region>
Nota 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
La definizione di source_profile ti consente di evitare di aggiornare le credenziali temporanee nel file ~/.aws/config o ~/.aws/credentials.
Il comando AWS CLI seguente 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 usi 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 comandi seguenti:
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 di ambiente per assumere il ruolo IAM e quindi verifica l'accesso
Puoi usare credenziali del ruolo IAM per creare tre variabili di ambiente per assumere il ruolo IAM, in modo simile al seguente:
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
Esegui il comando seguente per verificare di aver assunto il ruolo IAM:
aws sts get-caller-identity
Il comando get-caller-identity visualizza informazioni sull'identità IAM utilizzata per autenticare la richiesta. Per ulteriori informazioni, consulta Come posso assumere un ruolo IAM utilizzando AWS CLI?
Le variabili di ambiente mantengono le credenziali temporanee nella cache anche dopo la loro scadenza e in assenza di rinnovo automatico. Usa i comandi seguenti per verificare se sono impostate variabili di ambiente delle credenziali:
Linux/macOS:
$ printenv | grep AWS
Windows:
C:\>set AWS
Puoi rimuovere le variabili di ambiente scadute con i comandi seguenti:
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 usare 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 credenziali, assicurati di seguire le best practice di sicurezza in IAM.
Informazioni correlate
Contenuto pertinente
- AWS UFFICIALEAggiornata 2 anni fa
- AWS UFFICIALEAggiornata un anno fa
- AWS UFFICIALEAggiornata 2 anni fa
- AWS UFFICIALEAggiornata 5 mesi fa