Como posso solucionar o erro do AWS STS “o token de segurança incluído na solicitação expirou” ao usar a AWS CLI para assumir um perfil do IAM?
Tentei assumir um perfil do AWS Identity and Access Management (AWS IAM) usando a AWS Command Line Interface (AWS CLI). Recebi um erro “o token de segurança incluído na solicitação expirou”.
Breve descrição
As 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 verificar seu erro.
Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de erros da AWS CLI. Além disso, verifique se você 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 exige um ID da chave de acesso, chave de acesso secreta e token de sessão. As solicitações enviadas devem chegar ao endpoint da AWS em até cinco minutos após o carimbo de data/hora da solicitação; caso contrário, a solicitação será negada. Para obter mais informações, consulte Por que as solicitações são assinadas.
Usando perfis para assumir um perfil do IAM
Um perfil nomeado é uma coleção de configurações e credenciais que você pode aplicar a um comando da AWS CLI. Verifique se você está usando as credenciais corretas.
O seguinte comando da AWS CLI usa as credenciais de perfil padrão:
aws s3 ls
Este exemplo de comando 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 em sua pasta .aws contendo os arquivos .credentials e .config.
O arquivo de configuração está localizado em ~/.aws/config para Linux/macOS e em C:\Users\%USERPROFILE%\.aws\config para Windows. O arquivo de credenciais está localizado em ~/.aws/credentials para Linux/macOS e C:\Users\%USERPROFILE%\.aws\credentials para 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 seu 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 máxima da duração da sessão para credenciais temporárias para perfis do IAM usando o parâmetro DurationSeconds para seu caso de uso.
Em seguida, 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 de configuração sempre que uma sessão expirar. Defina um perfil para o perfil 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 é definido em 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 o user1 localizados no arquivo ~/.aws/credentials.
aws s3 ls --profile project1
Se você estiver usando a AWS CLI com um elemento source\ _profile, a chamada de API assume-role coloca as credenciais no arquivo .aws/cli/cache. As credenciais expiradas sã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 o perfil do IAM e verificar o acesso
Você pode usar as credenciais de perfil do IAM para criar três variáveis de ambiente para assumir o perfil do IAM semelhante à 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 executar o comando que você considerou como perfil do IAM correto, 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 assumir um perfil 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 comandos a seguir 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.
Informações relacionadas
Conteúdo relevante
- AWS OFICIALAtualizada há um ano
- AWS OFICIALAtualizada há 5 meses
- AWS OFICIALAtualizada há 2 anos