¿Cómo puedo solucionar el error de AWS STS “the security token included in the request is expired” (el token de seguridad incluido en la solicitud ha caducado) cuando uso AWS CLI para asumir un rol de IAM?

Última actualización: 17-05-2022

Intenté asumir un rol de AWS Identity and Access Management (IAM) con la AWS Command Line Interface (AWS CLI). Sin embargo, he recibido un error como este:

“The security token included in the request is expired” (El token de seguridad incluido en la solicitud ha caducado).

Descripción corta

Las credenciales de seguridad temporales para los usuarios de IAM se solicitan mediante el servicio AWS Security Token Service (AWS STS). Las credenciales temporales creadas con la acción de la API AssumeRole duran una hora de forma predeterminada. Una vez que caducan las credenciales temporales, no se pueden volver a utilizar. Para obtener más información, consulte Credenciales de seguridad temporales en IAM.

Resolución

Siga estos pasos de solución de problemas para su caso de uso.

Si recibe errores al ejecutar comandos de AWS CLI, asegúrese de que utiliza la versión más reciente de AWS CLI.

Asegúrese de que sus solicitudes de credenciales de seguridad temporales puedan llegar a los puntos de conexión de AWS

El establecimiento de credenciales para un rol requiere un ID de clave de acceso, una clave de acceso secreta y un token de sesión. Las solicitudes enviadas deben llegar al punto de conexión de AWS en un plazo de cinco minutos a partir de la marca de tiempo de la solicitud o se denegará la solicitud. Para obtener más información, consulte Por qué se firman las solicitudes.

Uso de perfiles para asumir un rol de IAM

Un perfil con nombre es un conjunto de configuraciones y credenciales que puede aplicar a un comando de AWS CLI. Debe comprobar que está utilizando las credenciales correctas.

El siguiente comando de AWS CLI utiliza las credenciales de perfil predeterminadas:

aws s3 ls

Este comando de ejemplo usa las credenciales de perfil project1 configuradas en el archivo .config:

aws s3 ls --profile project1

Salida de ejemplo con credenciales caducadas:

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

Estos perfiles se definen en la carpeta .aws que contiene los archivos .credentials y .config.

El archivo de configuración se encuentra en ~/.aws/config para Linux/macOS y en C:\Users\ %USERPROFILE%\ .aws\config para Windows. El archivo de credenciales se encuentra en ~/.aws/credentials para Linux/macOS y en C:\Users\ %USERPROFILE%\.aws\credentials para Windows.

Para comprobar las credenciales de perfil predeterminadas, ejecute el siguiente comando:

aws configure list --profile default

Salida de ejemplo:

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 que se utilizan las mismas credenciales para el perfil project1, ejecute el siguiente comando:

aws configure list --profile project1

Salida de ejemplo:

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

En el resultado del ejemplo, tenga en cuenta que se pueden configurar diferentes credenciales para los perfiles default y project1.

Puede crear un perfil en el archivo .aws/config con el siguiente 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>

Se le proporcionan estas credenciales cuando ejecuta el comando assume-role de AWS STS de manera similar a la siguiente:

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

Salida de ejemplo:

{
"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: puede hacer que aumente la duración máxima del vencimiento de la sesión para las credenciales temporales de los roles de IAM mediante el parámetro DurationSeconds para su caso de uso.

La nueva llamada a la API assume-role recupera un nuevo conjunto de credenciales válidas. Tras la llamada a la API, debe actualizar manualmente el archivo ~/.aws/config con las nuevas credenciales temporales.

Puede evitar actualizar el archivo de configuración cada vez que caduque una sesión. Defina un perfil para el rol de IAM junto con el usuario que asume el rol en el archivo ~/.aws/config o ~/.aws/credentials de manera similar a la siguiente:

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

Tenga en cuenta que user1 se define en el archivo ~/.aws/credentials de manera similar a la siguiente:

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

Definir source_profile significa que no tiene que actualizar sus credenciales temporales en el archivo ~/.aws/config o ~/.aws/credentials.

El siguiente comando de AWS CLI enumera los buckets de Amazon Simple Storage Service (Amazon S3) con credenciales para user1 ubicadas en el archivo ~/.aws/credentials.

aws s3 ls --profile project1

Si usa la CLI de AWS con un elemento source_profile, la llamada a la API assume-role coloca las credenciales en el archivo .aws/cli/cache. Las credenciales caducadas se actualizan automáticamente en el archivo .aws/cli/cache. Si recibe un error por credenciales caducadas, puede borrar la caché con los siguientes comandos:

Linux/macOS:

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

Windows:

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

AWS CLI crea nuevas credenciales en la caché.

Crear variables de entorno para asumir el rol de IAM y luego verificar el acceso

Puede usar las credenciales del rol de IAM para crear tres variables de entorno que asuman el rol de IAM de forma similar a la siguiente:

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 comprobar que ha asumido el rol de IAM correcto, ejecute el siguiente comando:

aws sts get-caller-identity

El comando get-caller-identity muestra información sobre la identidad de IAM utilizada para autenticar la solicitud. Para obtener más información, consulte ¿Cómo asumo un rol de IAM con AWS CLI?

Las variables de entorno contienen credenciales almacenadas en caché temporalmente incluso después de que caduquen y no se renuevan automáticamente. Utilice los siguientes comandos para comprobar si las variables de entorno de credenciales están configuradas:

Linux/macOS:

$ printenv | grep AWS

Windows:

C:\>set AWS

Puede eliminar las variables de entorno caducadas con los siguientes 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=

Ahora puede volver a usar la llamada a la API assume-role para obtener credenciales nuevas y válidas y volver a configurar las variables de entorno.

Importante: los archivos .aws/credentials y .aws/config contienen los detalles de las credenciales de las entidades de IAM. Cuando administre sus credenciales, asegúrese de seguir las prácticas recomendadas de seguridad en IAM.