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
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.
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.
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 :
-
Utilisez une demande
PUT
pour lancer une session sur le service des métadonnées d'instance. La demandePUT
renvoie un jeton qui doit être inclus dans les demandesGET
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. -
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 surrequired
, les demandes sans jeton valide ou contenant un jeton arrivé à expiration reçoivent un code d'erreur HTTP401 - 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
Lorsque vous effectuez 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.
Pour connaître les versions minimales du kit SDK AWS qui prennent en charge IMDSv2, veuillez consulter Utilisation d'un kit SDK AWS pris en charge.
- 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 de plus amples informations, veuillez consulter 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 surrequired
) en la lançant avec une AMI configurée avec le paramètreImdsSupport
défini surv2.0
. Vous définissez le paramètreImdsSupport
surv2.0
lorsque vous enregistrez l'AMI à l'aide de la commande de CLI register-image. Pour de plus amples informations, veuillez consulter 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 valeur2.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éponseUnauthorizedOperation
. 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 erreurUnauthorizedOperation
.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 de plus amples informations, veuillez consulter 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 de plus amples informations, veuillez consulter 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.
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.
Utilisation d'un kit SDK AWS pris en charge
Pour utiliser IMDSv2, vos instances EC2 doivent utiliser une version du kit SDK AWS compatible avec IMDSv2. Les dernières versions de tous les kits SDK AWS prennent en charge l'utilisation de IMDSv2.
Nous vous recommandons de vous tenir au courant des versions du kit SDK afin de rester à jour avec les dernières fonctionnalités, mises à jour de sécurité et dépendances sous-jacentes. L'utilisation continue d'une version du kit SDK non prise en charge n'est pas recommandée et est effectuée à votre discrétion. Pour plus d'informations, veuillez consulter la politique de maintenance des kits SDK et des outils AWS dans le Guide de référence des kits SDK et des outils AWS.
Voici les versions minimales qui prennent en charge IMDSv2 :
-
AWS CLI
: 1.13.23 -
AWS SDK for .NET
: 3.3.634.1 -
AWS SDK for C++
: 1.7.229 -
AWS SDK for Go
: 1.25.38 -
Kit SDK AWS pour Go v2
: 0.19.0 -
AWS SDK for Java
: 1.11.678 -
AWS SDK for Java 2.x
: 2.10.21 -
Kit SDK AWS pour JavaScript dans Node.js
: 2.722.0 -
AWS SDK for PHP
: 3.147.7 -
AWS SDK for Python (Boto)
: 1.13.23 -
AWS SDK for Python (Boto3)
: 1.12.6 -
AWS SDK for Ruby
: 3.79.0