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

5 minutos de lectura
0

Mis aplicaciones Java que utilizan el AWS SDK para Java en una instancia de Amazon Elastic Compute Cloud (Amazon EC2) reciben el siguiente error: «com.amazonaws.AmazonServiceException: The security token included in the request is expired (Service: AmazonSQS; Status Code: 403; Error Code: ExpiredToken; Request ID: 12a345b6-78cd-901e-fg23-45hi67890jkl)».

Descripción corta

AWS exige que todas las solicitudes de API de aplicaciones se firmen digitalmente con las credenciales proporcionadas por AWS. Si tu aplicación utiliza credenciales temporales para crear un cliente de AWS, debes renovarlas antes de que venzan. Si tus credenciales vencen, recibirás un error que indica que el token de seguridad incluido en la solicitud ha vencido. Para resolver este error, comprueba la referencia horaria, actualiza las credenciales temporales vencidas y, a continuación, comprueba las configuraciones de AWS Identity and Access Management (IAM).

Resolución

Asegúrate de que la instancia tenga una referencia temporal coherente

Las credenciales vencen si utilizan la hora incorrecta, así que asegúrate de que tu servidor sea el correcto. La instancia de EC2 debe tener una referencia de fecha y hora coherente y precisa. Configura Amazon Time Sync Service u otra fuente de protocolo de tiempo de red (NTP) en tu instancia. Para obtener más información, consulta Cambio de la zona horaria en una instancia.

Asegúrate de que tus credenciales temporales no hayan vencido

Si utilizas credenciales temporales, asegúrate de que no hayan vencido. Si las credenciales temporales han vencido, debes generar un nuevo conjunto de credenciales temporales y utilizarlas. Se recomienda actualizar las credenciales temporales cinco minutos antes de que venzan.

Comprobación de la configuración de IAM

En el caso de las aplicaciones que se ponen en marcha en una instancia de EC2, se recomienda usar un rol de IAM asignado a la instancia. Si usas un rol de IAM, comprueba que los ajustes estén configurados correctamente.

Con un rol de IAM, un constructor de servicios predeterminado usa una cadena de proveedores de credenciales predeterminada para buscar las credenciales en el siguiente orden:

  1. En las variables de entorno del sistema AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY.
  2. En las propiedades del sistema Java aws.accessKeyId y aws.secretKey.
  3. En el archivo de credenciales predeterminado.
  4. En las credenciales del perfil de la instancia en los metadatos de la instancia asociados al rol de IAM.

Para obtener más información, consulta Utilizar un rol de IAM para conceder permisos a aplicaciones que se ejecutan en instancias de Amazon EC2.

Si incluyes las credenciales en cualquier lugar excepto en el perfil de la instancia, el constructor del cliente predeterminado las encuentra primero. Esta configuración bloquea las credenciales del rol de IAM. Para obtener más información, consulta Proporcione credenciales temporales al AWS SDK para Java.

Para ver las credenciales del rol de IAM, usa los siguientes comandos de la versión 3.0 o posterior de Windows PowerShell o desde un shell de Linux. Si usas credenciales temporales, los siguientes comandos de Windows y Linux muestran las credenciales temporales más recientes de la instancia.

Nota: En los siguientes comandos, sustituye examplerole por el nombre de tu rol de IAM.

Windows:

PS C:\> Invoke-RestMethod http://169.254.169.254/latest/meta-data/iam/security-credentials/examplerole

Se mostrará un resultado parecido al siguiente ejemplo:

Code            : SuccessLastUpdated     : 2016-07-18T18:09:47Z
Type            : AWS-HMAC
AccessKeyId     : AKIAIOSFODNN7EXAMPLE
SecretAccessKey : wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Token           : token
Expiration      : 2016-04-27T22:39:16Z

Linux:

curl http://169.254.169.254/latest/meta-data/iam/security-credentials/examplerole

Se mostrará un resultado parecido al siguiente ejemplo:

{    "Code" : "Success",
    "LastUpdated" : "2016-04-26T16:39:16Z",
    "Type" : "AWS-HMAC",
    "AccessKeyId" : "AKIAIOSFODNN7EXAMPLE",
    "SecretAccessKey" : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
    "Token" : "token",
    "Expiration" : "2016-04-27T22:39:16Z"
}

Si recibes un error 404 al usar el comando curl anterior, comprueba que el proxy HTTP esté desactivado para la dirección IP de metadatos. Además, asegúrate de que el perfil de la instancia esté asociado a la instancia.

Si el problema persiste, comprueba que la instancia no esté realizando varias solicitudes simultáneas ni procesando varias sesiones en paralelo. Este escenario puede provocar que el servicio de metadatos de instancias (IMDS) limite la consulta. Para mitigar este problema, utiliza el patrón de reintento con retroceso exponencial.

Para configurar los reintentos, modifica AWS_METADATA_SERVICE_NUM_ATTEMPTS. Para configurar las opciones, utiliza variables de entorno, el archivo ~/.aws/config o la sesión botocore del usuario. Para obtener más información, consulta Configuration en el sitio web de documentación de Boto3.

Ejemplo:

AWS_METADATA_SERVICE_TIMEOUT = 10
AWS_METADATA_SERVICE_NUM_ATTEMPTS = 5

Si usas el comando curl en un contenedor de Docker, aumenta http-put-response-hop-limit a 2. Usa el comando modify-instance-metadata-options de Interfaz de la línea de comandos de AWS (AWS CLI):

aws ec2 modify-instance-metadata-options --instance-id instance --http-put-response-hop-limit 2 --http-endpoint enabled

Nota: Reemplaza instance por el ID de tu instancia. Si se muestran errores al usar comandos de AWS CLI, consulta Troubleshooting errors for the AWS CLI. Además, asegúrate de utilizar la versión más reciente de AWS CLI.

Para obtener más información, consulta Add defense in depth against open firewalls, reverse proxies, and SSRF vulnerabilities with enhancements to the EC2 Instance Metadata Service.

Las credenciales de rol se rotan o actualizan automáticamente cinco minutos antes de que venzan las credenciales temporales asignadas.

Información relacionada

Configure SDK authentication

Roles de IAM para Amazon EC2