Como posso solucionar o erro do AWS STS “the security token included in the request is expired” (o token de segurança incluído na solicitação expirou) ao usar a AWS CLI para assumir uma função do IAM?

Data da última atualização: 17/05/2022

Tentei assumir uma função do AWS Identity and Access Management (IAM) usando a AWS Command Line Interface (AWS CLI). Porém, recebi um erro semelhante ao seguinte:

“The security token included in the request is expired” (O token de segurança incluído na solicitação expirou).

Breve descrição

Credenciais de segurança temporárias para usuários do IAM são solicitadas usando o serviço AWS Security Token Service (AWS STS). As credenciais temporárias criadas com a ação da API AssumeRole duram uma hora por padrão. Depois que as credenciais temporárias expirarem, elas não poderão ser reutilizadas. Para obter mais informações, consulte Credenciais de segurança temporárias no IAM.

Resolução

Use as etapas de solução de problemas a seguir para o seu caso de uso.

Se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), verifique se está usando a versão mais recente da AWS CLI.

Certifique-se de que suas solicitações temporárias de credenciais de segurança possam chegar aos endpoints da AWS

O estabelecimento de credenciais para uma função requer um ID de chave de acesso, uma chave de acesso secreta e um token de sessão. As solicitações enviadas devem chegar ao endpoint da AWS dentro de cinco minutos após o carimbo de data/hora na solicitação, ou essa solicitação é negada. Para obter mais informações, consulte Por que as solicitações são assinadas.

Usar perfis para assumir uma função do IAM

Um perfil nomeado é uma coleção de configurações e credenciais que você pode aplicar a um comando da AWS CLI. Você deve verificar se está usando as credenciais corretas.

O seguinte comando da AWS CLI usa as credenciais de perfil padrão:

aws s3 ls

Esse comando de exemplo usa as credenciais do perfil project1 configuradas no arquivo .config:

aws s3 ls --profile project1

Exemplo de saída usando credenciais expiradas:

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

Esses perfis são definidos na pasta .aws que contém os arquivos .credentials e .config.

O arquivo config está localizado em ~/.aws/config para o Linux/macOS e C:\Users\%USERPROFILE%\.aws\config para o Windows. O arquivo credentials está localizado em ~/.aws/credentials para o Linux/macOS e C:\Users\%USERPROFILE%\.aws\credentials para o Windows.

Para verificar suas credenciais de perfil padrão, execute o seguinte comando:

aws configure list --profile default

Exemplo de saída:

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

Para confirmar se as mesmas credenciais são usadas para o perfil project1, execute o seguinte comando:

aws configure list --profile project1

Exemplo de saída:

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

No exemplo de saída, observe que credenciais diferentes podem ser configuradas para os perfis padrão e project1.

Você pode criar um perfil no arquivo .aws/config usando o seguinte 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>

Essas credenciais são fornecidas quando você executa o comando assume-role do AWS STS, semelhante ao seguinte:

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

Exemplo de saída:

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

Observação: você pode aumentar a validade da duração máxima da sessão para credenciais temporárias de funções do IAM usando o parâmetro DurationSeconds para o seu caso de uso.

A nova chamada de API assume-role recupera um novo conjunto de credenciais válidas. Após a chamada de API, você deve atualizar manualmente o arquivo ~/.aws/config com as novas credenciais temporárias.

Você pode evitar atualizar o arquivo config sempre que uma sessão expirar. Defina um perfil para a função do IAM junto com o usuário que assume a função no arquivo ~/.aws/config ou ~/.aws/credentials, semelhante ao seguinte:

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

Observe que user1 está definido no seu arquivo ~/.aws/credentials, semelhante ao seguinte:

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

Definir source_profile significa que você não precisa atualizar suas credenciais temporárias no arquivo ~/.aws/config ou ~/.aws/credentials.

O comando da AWS CLI a seguir lista os buckets do Amazon Simple Storage Service (Amazon S3) com credenciais para user1, localizado no arquivo ~/.aws/credentials.

aws s3 ls --profile project1

Se estiver usando a AWS CLI com um elemento source_profile, a chamada de API assume-role colocará credenciais no arquivo .aws/cli/cache. As credenciais expiradas serão atualizadas automaticamente no arquivo .aws/cli/cache. Se você receber um erro de credenciais expiradas, poderá limpar o cache com os seguintes comandos:

Linux/macOS:

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

Windows:

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

A AWS CLI cria novas credenciais no cache.

Crie variáveis de ambiente para assumir a função do IAM e verificar o acesso

Você pode usar credenciais de função do IAM para criar três variáveis de ambiente para assumir a função do IAM, semelhante ao seguinte:

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

Para verificar se você assumiu a função correta do IAM, execute o seguinte comando:

aws sts get-caller-identity

O comando get-caller-identity exibe informações sobre a identidade do IAM usada para autenticar a solicitação. Para obter mais informações, consulte Como assumo uma função do IAM usando a AWS CLI?

As variáveis de ambiente mantêm credenciais temporárias em cache mesmo depois de expirarem e não são renovadas automaticamente. Use os seguintes comandos para verificar se as variáveis de ambiente de credenciais estão definidas:

Linux/macOS:

$ printenv | grep AWS

Windows:

C:\>set AWS

Você pode remover variáveis de ambiente expiradas com os seguintes comandos:

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=

Agora, você pode usar a chamada de API assume-role novamente para obter credenciais novas e válidas e definir as variáveis de ambiente novamente.

Importante: os arquivos .aws/credentials e .aws/config contêm detalhes de credenciais para suas entidades do IAM. Ao gerenciar suas credenciais, certifique-se de seguir as práticas recomendadas de segurança no IAM.