¿Cómo puedo solucionar el error de AWS STS «the security token included in the request is expired» cuando uso AWS CLI para asumir un rol de IAM?

6 minutos de lectura
0

He intentado asumir un rol de AWS Identity and Access Management (IAM) mediante la Interfaz de la línea de comandos de AWS (AWS CLI). He recibido el error «security token included in the request is expired».

Descripción corta

Las credenciales de seguridad temporales de 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 caducadas las credenciales temporales, no se pueden volver a utilizar. Para obtener más información, consulte Credenciales de seguridad temporales en IAM.

Resolución

Use los siguientes pasos de solución de problemas para su caso de uso.

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulte Solución de problemas de la AWS CLI. Además, asegúrese de utilizar la versión más reciente de la AWS CLI.

Asegúrese de que sus solicitudes de credenciales de seguridad temporales puedan conectarse a los puntos de enlace de AWS

Para establecer las credenciales de un rol es necesario tener 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 enlace de AWS en un plazo de cinco minutos a partir de la fecha y hora de la solicitud o, de lo contrario, 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 parámetros y credenciales que puede aplicar a un comando de AWS CLI. Compruebe que está utilizando las credenciales correctas.

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

aws s3 ls

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

aws s3 ls --profile project1

Ejemplo de salida mediante 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 en Linux/macOS y en C:\Users\%USERPROFILE%\.aws\config en Windows. El archivo de credenciales se encuentra en ~/.aws/credentials en Linux/macOS y en C:\Users\%USERPROFILE%\.aws\credentials en Windows.

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

aws configure list --profile default

Resultado 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

Resultado 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 de ejemplo, tenga en cuenta que se pueden configurar diferentes credenciales para los perfiles predeterminado y project1.

Puede crear un perfil en su archivo .aws/config mediante 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>

Estas credenciales se proporcionan cuando ejecuta el comando de AWS STS assume-role similar al siguiente:

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

Resultado 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 de la caducidad de la sesión para las credenciales temporales de los roles de IAM mediante el parámetro DurationSeconds de su caso de uso.

A continuación, 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 asuma ese rol en el archivo ~/.aws/config o en ~/.aws/credentials, similar al siguiente:

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

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

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

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

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

aws s3 ls --profile project1

Si utiliza AWS CLI 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 las credenciales caducadas, puede borrar la memoria 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é.

Creación de variables de entorno para asumir el rol de IAM y comprobar 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 si 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 que se usa para autenticar la solicitud. Para obtener más información, consulte ¿Cómo puedo asumir un rol de IAM mediante la AWS CLI?

Las variables de entorno mantienen las credenciales temporales almacenadas en caché incluso después de que caducan 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 utilizar 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 sus entidades de IAM. Al gestionar sus credenciales, asegúrese de seguir las prácticas recomendadas de seguridad de IAM.

Información relacionada

Solicitud de las credenciales de seguridad temporales

¿Cómo soluciono el error «The security token included in the request is expired» al ejecutar aplicaciones de Java en Amazon EC2?

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 4 meses