Utilizar IMDSv2 - Amazon Elastic Compute Cloud

Utilizar IMDSv2

Para acceder a los metadatos de instancia desde una instancia en ejecución puede utilizar uno de los métodos siguientes:

  • Servicio de metadatos de instancia versión 1 (IMDSv1) – un método de solicitud y respuesta

  • Servicio de metadatos de instancia versión 2 (IMDSv2) – un método orientado a la sesión

  • Para poder utilizar EC2Launch con IMDSv2, la versión debe ser la 1.3.2002730 o posterior.

De forma predeterminada, puede usar IMDSv1 o IMDSv2, o ambos. El servicio de metadatos de la instancia distingue entre solicitudes IMDSv1 y IMDSv2 en función de si, en cualquier solicitud, los encabezados PUT o GET, que son exclusivos de IMDSv2, están presentes en dicha solicitud. Para obtener más información, consulte Agregar defensa en profundidad contra firewalls abiertos, proxies inversos y vulnerabilidades SSRF con mejoras en el servicio de metadatos de instancias EC2.

Puede configurar el servicio de metadatos de instancia en cada instancia de tal manera que el código local o los usuarios deban usar IMDSv2. Si especifica que debe usarse IMDSv2, IMDSv1 dejará de funcionar. Para obtener más información, consulte Configurar las opciones de metadatos de instancia.

Para recuperar los metadatos de la instancia, consulte Recuperar metadatos de instancia.

nota

En los ejemplos de esta sección, se utiliza la dirección IPv4 del servicio de metadatos de instancia: 169.254.169.254. Si recupera metadatos de instancia para las instancias EC2 a través de la dirección IPv6, asegúrese de habilitar y utilizar la dirección IPv6 en su lugar: fd00:ec2::254. La dirección IPv6 del servicio de metadatos de instancia es compatible con los comandos IMDSv2. Solo se puede acceder a la dirección IPv6 en Instancias integradas en el sistema Nitro.

Funcionamiento de Servicio de metadatos de instancia versión 2

IMDSv2 usa las solicitudes orientadas a la sesión. Las solicitudes orientadas a la sesión permiten crear un token de sesión que define la duración de la sesión, que puede ser de mínimo un segundo a un máximo de seis horas. En esa duración, puede utilizar el mismo token de sesión para solicitudes subsiguientes. Cuando la duración llegue a su fin, deberá crear un token de sesión nuevo para utilizarlo en las solicitudes futuras.

En el siguiente ejemplo se usa un script de shell PowerShell y IMDSv2 para recuperar los elementos de metadatos de la instancia de nivel superior. El ejemplo:

  • Crea un token de sesión que dura seis horas (21 600 segundos) con la solicitud PUT

  • Almacena el encabezado del token de sesión en una variable denominada token

  • Solicita los elementos de metadatos de nivel superior con el token

PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/

Después de crear un token, puede volverlo a usar hasta que venza. En el siguiente comando de ejemplo, que toma el ID de la AMI utilizada para lanzar la instancia, se vuelve a utilizar el token que se almacena en $token en el ejemplo anterior.

PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} ` -Method GET -uri http://169.254.169.254/latest/meta-data/ami-id

Al utilizar IMDSv2 para solicitar metadatos de instancia, la solicitud debe incluir lo siguiente:

  1. Use una solicitud PUT para iniciar una sesión en el servicio de metadatos de instancia. La solicitud PUT devuelve un token que debe incluirse en las solicitudes GET subsiguientes del servicio de metadatos de instancia. El token debe acceder a los metadatos con IMDSv2.

  2. Incluir el token en todas las solicitudes GET del servicio de metadatos de instancia. Cuando el uso del token se establece en required, las solicitudes sin un token válido o con un token que ha vencido reciben un código de error HTTP 401 - Unauthorized. Para obtener información sobre cómo cambiar el requisito de uso del token, consulte modify-instance-metadata-options (modificar las opciones de metadatos de la instancia) en la Referencia de los comandos de AWS CLI.

    • El token es una clave específica de la instancia. El token no es válido en otras instancias EC2 y se rechazará si intenta usarlo fuera de la instancia en la que se generó.

    • La solicitud PUT debe incluir un encabezado que especifique el tiempo de vida (TTL) del token, en segundos, de un máximo de seis horas (21 600 segundos). El token representa una sesión lógica. El TTL especifica el período de tiempo que es válido el token y, en consecuencia, la duración de la sesión.

    • Cuando un token caduca, para poder seguir accediendo a los metadatos de instancia hay que crear una sesión nueva con otro PUT.

    • Puede escoger entre volver a utilizar un token o crear uno nuevo con cada solicitud. Para un número pequeño de solicitudes, puede ser más sencillo generar y usar inmediatamente un token cada vez que necesite acceder al servicio de metadatos de instancia. Pero para ser más eficientes, puede especificar una duración más larga para el token y volver a usarlo en vez de escribir una solicitud PUT cada vez que tenga que solicitar metadatos de instancia. No existe ningún límite práctico sobre la cantidad de tokens simultáneos, que representen cada uno a su propia sesión. Sin embargo, IMDSv2 sigue limitado por la conexión normal del servicio de metadatos de instancia y la limitación controlada. Para obtener más información, consulte Limitación de consultas.

Los métodos HTTP GET y HEAD están permitidos en las solicitudes de metadatos de instancia IMDSv2. Las solicitudes PUT se rechazan si contienen un encabezado X-Forwarded-For.

De forma predeterminada, la respuesta a las solicitudes PUT tiene un límite de saltos de respuesta (tiempo de vida) de 1 en el nivel del protocolo IP. Puede ajustar el límite de saltos con el comando modify-instance-metadata-options si tiene que ampliarlo. Por ejemplo, puede necesitar un límite de saltos mayor para una compatibilidad con versiones anteriores con servicios de contenedor ejecutándose en la instancia. Para obtener más información, consulte modify-instance-metadata-options (modificar las opciones de metadatos de la instancia) en la Referencia de los comandos de AWS CLI.

Transición al uso de Servicio de metadatos de instancia versión 2

El uso del servicio de metadatos de instancia en la versión 2 (IMDSv2) es opcional. El servicio de metadatos de instancia en la versión 1 (IMDSv1) seguirá siendo compatible de forma indefinida. Si elige migrar para usar IMDSv2, le recomendamos que utilice las herramientas y la ruta de transición siguientes.

Herramientas para ayudar en la transición a IMDSv2

Si el software usa IMDSv1, utilice las siguientes herramientas a la hora de configurar el software para que use IMDSv2.

  • Software de AWS: las versiones más recientes de los SDK y las CLI de AWS admiten IMDSv2. Para usar IMDSv2, asegúrese de que las instancias de EC2 incluyan las versiones más recientes de los SDK y las CLI de AWS. Para obtener información acerca de cómo actualizar la CLI, consulte Instalar, actualizar y desinstalar AWS CLI en la Guía del usuario de AWS Command Line Interface.

    Todos los paquetes de software de Amazon Linux 2 son compatibles con IMDSv2.

  • CloudWatch: IMDSv2 utiliza sesiones respaldadas por token, mientras que IMDSv1, no. La métrica MetadataNoToken de CloudWatch realiza un seguimiento del número de llamadas al servicio de metadatos de instancia que están utilizando IMDSv1. Al seguir esta métrica hasta cero, puede determinar si y cuándo se ha actualizado el software para utilizar IMDSv2. Para obtener más información, consulte Métricas de la instancia.

  • Actualizaciones a API y CLI de EC2: para las instancias existentes, puede utilizar el comando de la CLI modify-instance-metadata-options (o la API ModifyInstanceMetadataOptions) para exigir el uso de IMDSv2. Para las instancias nuevas, puede usar el comando de la CLI run-instances (o la API RunInstances) y el parámetro metadata-options para lanzar instancias nuevas que exijan el uso de IMDSv2.

    Para requerir el uso de IMDSv2 en todas las instancias nuevas lanzadas por grupos de Auto Scaling, los grupos de Auto Scaling pueden utilizar una plantilla de lanzamiento o una configuración de lanzamiento. Al crear una plantilla de lanzamiento o crear una configuración de lanzamiento, debe configurar los parámetros MetadataOptions para requerir el uso de IMDSv2. Después de configurar la plantilla de lanzamiento o la configuración de lanzamiento, el grupo de Auto Scaling lanza nuevas instancias con la nueva plantilla de lanzamiento o configuración de lanzamiento, pero las instancias existentes no se ven afectadas.

    Utilice el comando de la CLI modify-instance-metadata-options (o la API ModifyInstanceMetadataOptions) para requerir el uso de IMDSv2 en las instancias existentes o terminar las instancias y el grupo de Auto Scaling lanzará nuevas instancias de sustitución con la configuración de las opciones de metadatos de la instancia definida en la plantilla de lanzamiento o en la configuración de lanzamiento.

  • SCP y políticas de IAM: puede usar una condición de IAM para impedir que los usuarios de IAM puedan lanzar una instancia a menos que esta utilice IMDSv2. También puede usar condiciones de IAM para forzar que los usuarios de IAM no puedan modificar las instancias en ejecución para reactivar IMDSv1 y para forzar que el servicio de metadatos de instancia esté disponible en la instancia.

    Las claves de condición de IAM ec2:MetadataHttpTokens, ec2:MetadataHttpPutResponseHopLimit y ec2:MetadataHttpEndpoint se pueden utilizar para controlar el uso de las API RunInstances y ModifyInstanceMetadataOptions , así como la CLI correspondiente. Si se crea una política y un parámetro en la llamada a la API no coincide con el estado especificado en la política que usa la clave de condición, la llamada a la API o a la CLI devolverá una respuesta de error UnauthorizedOperation. Estas claves de condición se pueden utilizar en las políticas de IAM o en las políticas de control de servicios (SCP) de AWS Organizations.

    Además, puede elegir una capa de protección adicional para forzar el cambio de IMDSv1 a IMDSv2. En la capa de administración de acceso, en relación con las API que se han llamado con credenciales de rol de EC2, puede usar una clave de condición nueva en políticas de IAM o políticas de control de servicios (SCP) de AWS Organizations. En especial, al usar la clave de condición de política ec2:RoleDelivery con un valor 2.0 en las políticas de IAM, las llamadas a la API realizadas con credenciales de rol de EC2 obtenidas de IMDSv1 recibirán la respuesta UnauthorizedOperation. Se puede conseguir lo mismo de forma más extensa si dicha condición la exige una SCP. De esta manera se logra que las credenciales proporcionadas mediante IMDSv1 no se puedan usar para llamar a las API porque cualquier llamada a la API que no cumpla la condición especificada recibirá un error UnauthorizedOperation. Para ver ejemplos de políticas de IAM, consulte Trabajar con metadatos de instancias. Para obtener más información, consulte Políticas de control de servicios en la Guía del usuario de AWS Organizations.

Ruta recomendada para exigir el acceso a IMDSv2

Si se usan las herramientas anteriores, recomendamos que siga esta ruta para pasar a IMDSv2:

Paso 1: Al principio

Actualice los SDK, las CLI y el software que usen credenciales de rol en sus instancia EC2 a las versiones compatibles con IMDSv2. Para obtener más información sobre cómo actualizar CLI, consulte Actualizar a la versión más reciente de AWS CLI en la Guía del usuario de AWS Command Line Interface.

A continuación, cambie el software que accede directamente a los metadatos de instancia (en otras palabras, que no usan un SDK) con las solicitudes IMDSv2.

Paso 2: Durante la transición

Realice un seguimiento del progreso de la transición utilizando la métrica de CloudWatch MetadataNoToken. Esta métrica muestra el número de llamadas al servicio de metadatos de instancia que están utilizando IMDSv1 en las instancias. Para obtener más información, consulte Métricas de la instancia.

Paso 3: Cuando todo esté listo en todas las instancias

Todo está listo en todas las instancias cuando la métrica MetadataNoToken de CloudWatch muestra un uso de IMDSv1 igual a cero. En esta etapa, puede hacer lo siguiente:

  • En las instancias existentes, puede exigir el uso de IMDSv2 con el comando modify-instance-metadata-options. Puede hacer estos cambios en instancias en ejecución. No es necesario que reinicie las instancias.

  • Para instancias nuevas: al lanzar una nueva instancia, puede realizar una de las siguientes acciones:

    • En el asistente de instancia de lanzamiento de la consola de Amazon EC2, establezca Metadata accessible (Metadatos accesibles) en Enabled (Habilitado) y Metadata version (Versión de metadatos) en V2. Para obtener más información, consulte Paso 3: Configurar los detalles de la instancia.

    • Utilice el comando run-instances para especificar que solo se va a utilizar IMDSv2.

La actualización de las opciones de metadatos de instancia para instancias existentes sólo está disponible a través de la API o la AWS CLI. Actualmente no está disponible en la consola de Amazon EC2. Para obtener más información, consulte Configurar las opciones de metadatos de instancia.

Paso 4: Cuando todas las instancias han pasado a IMDSv2

Las claves de condición de IAM ec2:MetadataHttpTokens, ec2:MetadataHttpPutResponseHopLimit y ec2:MetadataHttpEndpoint se pueden utilizar para controlar el uso de las API RunInstances y ModifyInstanceMetadataOptions , así como la CLI correspondiente. Si se crea una política y un parámetro en la llamada a la API no coincide con el estado especificado en la política que usa la clave de condición, la llamada a la API o a la CLI devolverá una respuesta de error UnauthorizedOperation. Para ver ejemplos de políticas de IAM, consulte Trabajar con metadatos de instancias.