Utiliser IMDSv2 - Amazon Elastic Compute Cloud

Utiliser IMDSv2

Vous pouvez accéder aux métadonnées d'instance à partir d'une instance en cours d'exécution en utilisant l'une des méthodes suivantes :

  • Service des métadonnées d'instance Version 1 (IMDSv1) – méthode de demande/réponse

  • Service des métadonnées d'instance Version 2 (IMDSv2) – méthode orientée session

Par défaut, vous pouvez utiliser IMDSv1 ou IMDSv2, ou les deux. Le service des métadonnées d'instance fait la distinction entre les demandes IMDSv1 et IMDSv2 pour une demande donnée en déterminant si les en-têtes PUT ou GET, qui sont propres à IMDSv2, sont présents dans cette demande. Pour plus d'informations, consultez Add defense in depth against open firewalls, reverse proxies, and SSRF vulnerabilities with enhancements to the EC2 Instance Metadata Service (Ajoutez une défense en profondeur contre les pare-feu ouverts, les proxy inversés et les vulnérabilités SSRF avec des améliorations apportées au service de métadonnées d'instance EC2).

Vous pouvez configurer le service des métadonnées d'instance sur chaque instance afin que le code local ou les utilisateurs doivent utiliser IMDSv2. Lorsque vous spécifiez que IMDSv2 doit être utilisé, IMDSv1 ne fonctionne plus. Pour plus d'informations, consultez Configurer les options de métadonnées d'instance.

Pour récupérer des métadonnées d'instance, consultez Récupérer des métadonnées d'instance.

Note

Les exemples de cette section utilisent l'adresse IPv4 du service de métadonnées d'instance : 169.254.169.254. Si vous récupérez des métadonnées d'instance pour les instances EC2 sur l'adresse IPv6, assurez-vous d'activer et d'utiliser l'adresse IPv6 à la place : fd00:ec2::254. L'adresse IPv6 du service de métadonnées d'instance est compatible avec les commandes IMDSv2. L'adresse IPv6 est uniquement accessible sur instances reposant sur le système Nitro.

Fonctionnement de Service des métadonnées d'instance Version 2

IMDSv2 utilise des demandes orientées session. Lorsque vous utilisez des demandes orientées session, vous créez un jeton de session qui définit la durée de la session, qui doit être d'une seconde au minimum et de six heures au maximum. Durant la période spécifiée, vous pouvez utiliser le même jeton de session pour les demandes suivantes. Une fois la période spécifiée arrivée à expiration, vous devez créer un nouveau jeton de session à utiliser pour les futures demandes.

L'exemple suivant utilise un script shell Linux et IMDSv2 pour extraire les éléments de métadonnées d'instance de haut niveau. L'exemple :

  • Crée un jeton de session d'une durée de six heures (21 600 secondes) en utilisant la demande PUT

  • Stocke l'en-tête de jeton de session dans une variable nommée TOKEN

  • Demande les éléments de métadonnées de haut niveau à l'aide du jeton

Vous pouvez exécuter deux commandes distinctes ou les combiner.

Commandes distinctes

Tout d'abord, générez un jeton à l'aide de la commande suivante.

[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`

Utilisez ensuite le jeton pour générer des éléments de métadonnées de niveau supérieur à l'aide de la commande suivante.

[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/

Commandes combinées

Vous pouvez stocker le jeton et combiner les commandes. L'exemple suivant combine les deux commandes ci-dessus et stocke l'en-tête du jeton de session dans une variable nommée TOKEN.

Note

En cas d'erreur lors de la création du jeton, un message d'erreur remplace le jeton valide dans la variable et la commande ne fonctionne pas.

[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/

Une fois que vous avez créé un jeton, vous pouvez le réutiliser jusqu'à son expiration. Dans l'exemple de commande suivant, qui extrait l'ID de l'AMI utilisée pour lancer l'instance, le jeton stocké dans $TOKEN dans l'exemple précédent est réutilisé.

[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/ami-id

Lorsque vous utilisez IMDSv2 pour demander les métadonnées d'une instance, la demande doit inclure les éléments suivants :

  1. Utilisez une demande PUT pour lancer une session sur le service des métadonnées d'instance. La demande PUT renvoie un jeton qui doit être inclus dans les demandes GET suivantes envoyées au service des métadonnées d'instance. Le jeton est obligatoire pour accéder aux métadonnées à l'aide de IMDSv2.

  2. Incluez le jeton dans toutes les demandes GET envoyées au service des métadonnées d'instance. Lorsque l'utilisation de jeton est définie sur required, les demandes sans jeton valide ou contenant un jeton arrivé à expiration reçoivent un code d'erreur HTTP 401 - Unauthorized. Pour plus d'informations sur la modification des conditions d'utilisation des jetons, consultez modify-instance-metadata-options dans AWS CLI Command Reference.

    • Le jeton est une clé propre à l'instance. Le jeton n'est pas valide sur les autres instances EC2 et sera rejeté si vous tentez de l'utiliser ailleurs que sur l'instance sur laquelle il a été généré.

    • La demande PUT doit inclure un en-tête spécifiant la durée time-to-live (TTL) du jeton, en secondes, jusqu'à six heures au maximum (21 600 secondes). Le jeton représente une session logique. La durée de vie (TTL) définit la durée de validité du jeton et, par conséquent, la durée de la session.

    • Une fois qu'un jeton est arrivé à expiration, pour pouvoir continuer à accéder aux métadonnées de l'instance, vous devez créer une nouvelle session en utilisant un autre PUT.

    • Vous pouvez choisir de réutiliser un jeton ou d'en créer un nouveau pour chaque demande. Pour un faible nombre de demandes, il peut être plus facile de générer et d'utiliser immédiatement un jeton chaque fois que vous avez besoin d'accéder au service des métadonnées d'instance. Cependant, pour une plus grande productivité, vous pouvez spécifier une durée plus longue pour le jeton et le réutiliser plutôt que de devoir écrire une demande PUT chaque fois que vous avez besoin de demander des métadonnées d'instance. Il n'existe pas de limite pratique au nombre de jetons simultanés, chacun représentant sa propre session. IMDSv2 est toutefois soumis aux limites normales de connexion du service des métadonnées d'instance. Pour plus d'informations, consultez Limitation des demandes.

Les méthodes HTTP GET et HEAD sont autorisées dans les demandes de métadonnées d'instance IMDSv2. Les demandes PUT sont rejetées si elles contiennent un en-tête X-Forwarded-For.

Par défaut, la réponse aux demandes PUT possède une durée time-to-live (hop limit) de réponse de 1 au niveau du protocole IP. Vous pouvez ajuster cette durée en utilisant la commande modify-instance-metadata-options si nécessaire. Par exemple, vous pouvez avoir besoin d'une durée de vie (hop limit) plus élevée pour des raisons de compatibilité en amont avec les services de conteneur s'exécutant sur l'instance. Pour plus d'informations, consultez modify-instance-metadata-options dans la Référence de la AWS CLI.

Passer à l'utilisation de Service des métadonnées d'instance Version 2

L'utilisation du service de métadonnées d'instance version 2 (IMDSv2) est facultative. Instance Metadata Service Version 1 (IMDSv1) continuera d'être pris en charge sans limite dans le temps. Si vous choisissez d'effectuer la migration vers IMDSv2, nous vous recommandons d'utiliser les outils et le chemin de transition suivants.

Outils facilitant la migration vers IMDSv2

Si votre logiciel utilise IMDSv1, utilisez les outils suivants pour faciliter sa reconfiguration vers IMDSv2.

Logiciel AWS

Les dernières versions de l'AWS CLI et des kits SDK AWS prennent en charge IMDSv2. Pour utiliser IMDSv2, veillez à ce que vos instances EC2 possèdent les dernières versions de la CLI et des kits SDK. Pour plus d'informations sur la mise à jour de la CLI, consultez Installation, mise à jour et désinstallation d'AWS CLI dans le Guide de l'utilisateur AWS Command Line Interface.

Tous les packages logiciels Amazon Linux 2 prennent en charge IMDSv2.

CloudWatch

IMDSv2 utilise des sessions basées sur un jeton, mais pas IMDSv1. La métrique CloudWatch MetadataNoToken suit le nombre d'appels au service de métadonnées d'instance qui utilisent IMDSv1. En suivant cette métrique jusqu'à zéro, vous pouvez déterminer si la totalité de votre logiciel a été mis à niveau vers IMDSv2 et le moment auquel cela se produit. Pour plus d'informations, consultez Métriques des instances.

Mises à jour des API et des CLI EC2

Pour les instances existantes, vous pouvez utiliser la commande de CLI modify-instance-metadata-options (ou l'API ModifyInstanceMetadataOptions) pour demander l'utilisation de IMDSv2. Pour les nouvelles instances, vous pouvez utiliser la commande de l'interface de ligne de commande run-instances (ou l'API RunInstances) et le paramètre metadata-options pour lancer les nouvelles instances qui nécessitent l'utilisation de IMDSv2.

Pour exiger l'utilisation de IMDSv2 sur toutes les nouvelles instances lancées par des groupes Auto Scaling, ces derniers peuvent utiliser un modèle de lancement ou une configuration de lancement. Lorsque vous créez un modèle de lancement ou une configuration de lancement, vous devez configurer les paramètres MetadataOptions pour exiger l'utilisation de IMDSv2. Après avoir configuré le modèle de lancement ou la configuration de lancement, le groupe Auto Scaling lance de nouvelles instances à l'aide du nouveau modèle de lancement ou de la nouvelle configuration de lancement, mais les instances existantes ne sont pas affectées.

Utilisez la commande de CLI modify-instance-metadata-options (ou l'API ModifyInstanceMetadataOptions) pour exiger l'utilisation de IMDSv2 sur les instances existantes, ou terminez les instances et le groupe Auto Scaling lancera de nouvelles instances de remplacement avec les paramètres des options de métadonnées d'instance définis dans le modèle ou la configuration de lancement.

Utilisation d'une AMI qui configure IMDSv2 par défaut

Lorsque vous lancez une instance, vous pouvez la configurer automatiquement pour utiliser IMDSv2 par défaut (le paramètre HttpTokens est défini sur required) en la lançant avec une AMI configurée avec le paramètre ImdsSupport défini sur v2.0. Vous définissez le paramètre ImdsSupport sur v2.0 lorsque vous enregistrez l'AMI à l'aide de la commande de CLI register-image. Pour plus d'informations, consultez Configurer l'AMI.

Politiques IAM et politiques de contrôle des services

Vous pouvez utiliser une politique IAM ou une politique de contrôle des services (SCP) AWS Organizations pour contrôler les utilisateurs IAM comme suit :

  • Impossible de lancer une instance à l'aide de l'API RunInstances sauf si l’instance est configurée pour utiliser IMDSv2.

  • Impossible de modifier une instance en cours d'exécution à l'aide de l'API ModifyInstanceMetadataOptions pour réactiver IMDSv1.

La politique IAM ou la politique de contrôle des services doit contenir les clés de condition IAM suivantes :

  • ec2:MetadataHttpEndpoint

  • ec2:MetadataHttpPutResponseHopLimit

  • ec2:MetadataHttpTokens

Si un paramètre de l'appel d'API ou de CLI ne correspond pas à l'état spécifié dans la politique contenant la clé de condition, l'appel de l'API ou de la CLI échoue avec la réponse UnauthorizedOperation.

Vous pouvez en outre choisir une couche de protection supplémentaire afin d'imposer le passage de IMDSv1 à IMDSv2. Au niveau de la couche de gestion des accès concernant les API appelées via des informations d'identification de rôle EC2, vous pouvez utiliser une nouvelle clé de condition dans les politiques IAM ou les politiques de contrôle des services (SCP) AWS Organizations. Si vous utilisez la clé de condition ec2:RoleDelivery avec la valeur 2.0 dans vos politiques IAM, les appels d'API effectués avec des informations d'identification de rôle EC2 obtenues à partir de IMDSv1 recevront une réponse UnauthorizedOperation. Vous pouvez aboutir au même résultat plus généralement avec cette condition requise par une SCP. Cela permet de s'assurer que les informations d'identification fournies via IMDSv1 ne peuvent pas être utilisées pour appeler des API, car tout appel d'API ne respectant pas la condition spécifiée recevra une erreur UnauthorizedOperation.

Par exemple les stratégies IAM, consultez Utiliser des métadonnées d'instance. Pour plus d'informations sur les politiques de contrôle des services, consultez Politiques de contrôle des services dans le Guide de l'utilisateur AWS Organizations.

Chemin recommandé pour demander l'accès à IMDSv2

Nous vous recommandons, tout en utilisant les outils mentionnés précédemment, de suivre ce chemin pour la migration vers IMDSv2 :

Etape 1 : Au départ

Mettez à jour les kit SDK, les CLI et vos logiciels utilisant des informations d'identification de rôle sur leurs instances EC2 vers des versions compatibles avec IMDSv2. Pour plus d'informations sur la mise à jour de la CLI, consultez Mise à niveau vers la dernière version d'AWS CLI dans le Guide de l'utilisateur AWS Command Line Interface.

Modifiez ensuite les logiciels accédant directement aux métadonnées de l'instance (en d'autres termes, n'utilisant pas un kit SDK) à l'aide des demandes IMDSv2.

Étape 2 : suivre la progression de votre transition

Suivez la progression de votre transition à l'aide de la métrique CloudWatch MetadataNoToken. Cette métrique indique le nombre d'appels au service de métadonnées d'instance qui utilisent IMDSv1 sur vos instances. Pour plus d'informations, consultez Métriques des instances.

Étape 3 : quand il n'y a aucune utilisation de IMDSv1

Quand la métrique CloudWatch MetadataNoToken n'enregistre aucune utilisation de IMDSv1, vos instances sont prêtes à passer entièrement à l'utilisation de IMDSv2. A ce stade, voici ce que vous pouvez faire :

  • Nouvelles instances

    Lors du lancement d'une nouvelle instance, vous pouvez effectuer les opérations suivantes :

    • Console Amazon EC2 : dans l'assistant de lancement d'instance, définissez Metadata accessible (Métadonnées accessibles) sur Enabled (Activé) et Metadata version (Version des métadonnées) sur V2 only (token required) (V2 uniquement [jeton obligatoire]). Pour plus d'informations, consultez Configurer l'instance au lancement.

    • AWS CLI : utilisez la commande de CLI run-instances pour spécifier que seul IMDSv2 doit être utilisé.

  • Instances existantes

    Vous pouvez demander l'utilisation de IMDSv2 à l'aide de la commande CLI modify-instance-metadata-options. Vous pouvez effectuer ces modifications sur les instances en cours d'exécution. Il n'est pas nécessaire de redémarrer vos instances.

Note

La mise à jour des options de métadonnées d'instance pour les instances existantes est disponible uniquement via l'API ou AWS CLI. À ce stade, elle n'est pas disponible dans la console Amazon EC2. Pour plus d'informations, consultez Configurer les options de métadonnées d'instance.

Etape 4 : Une fois opérée la transition de toutes vos instances vers IMDSv2

Les clés de condition IAM ec2:MetadataHttpTokens, ec2:MetadataHttpPutResponseHopLimit et ec2:MetadataHttpEndpoint peuvent être utilisées pour contrôler l'utilisation des API RunInstances et ModifyInstanceMetadataOptions et de la CLI correspondante. Si une stratégie est créée et qu'un paramètre de l'appel d'API ne correspond pas à l'état spécifié dans la stratégie à l'aide de la clé de condition, l'appel de l'API ou de l'interface de ligne commande échoue avec la réponse UnauthorizedOperation. Par exemple les stratégies IAM, consultez Utiliser des métadonnées d'instance.