Instance Metadata Service Version 2 (IMDSv2): configuration et vérification du comportement du service de métadonnées d'instance v2

Instance Metadata Service Version 2 (IMDSv2): Mémo de travail pour la configuration et la confirmation du comportement de Instance Metadata Service v2

Contenu de cet article

  1. Qu'est-ce que les métadonnées d'instance?
  2. Raisons d'utiliser Instance Metadata Service Version 2
  3. Préparation de l'environnement d'exécution AWS-CLI
  4. Configuration forcée IMDSv2 d'une instance existante
  5. Vérifiez le comportement lorsque IMDSv2 est défini de force

1. Qu'est-ce que les métadonnées d'instance?

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-metadata.html

Les métadonnées d'instance sont des données sur une instance et sont utilisées pour configurer ou gérer une instance en cours d'exécution. Les métadonnées d'instance sont divisées en catégories telles que le nom d'hôte, l'événement et le groupe de sécurité.

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html

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

--Instance Metadata Service Version 1 (IMDSv1) - Méthode de demande / réponse --Instance Metadata Service Version 2 (IMDSv2) - Méthode orientée session

Fonctionnement du service de métadonnées d'instance version 2

IMDSv2 utilise des requêtes orientées session. Utilisez des requêtes orientées session pour créer des jetons de session qui définissent la durée de la session (1 seconde à 6 heures). Vous pouvez utiliser le même jeton de session pour les demandes suivantes au cours de la période spécifiée. Une fois la période spécifiée expirée, vous devez créer un nouveau jeton de session à utiliser pour les demandes futures.

2. Raisons d'utiliser Instance Metadata Service Version 2

Le 29 juillet 2019, des informations personnelles de plus de 100 millions de personnes ont été divulguées en raison d'un accès non autorisé à Capital One, une grande société financière américaine.

Information on the Capital One Cyber Incident https://www.capitalone.com/facts2019/

Les causes des fuites d'informations sont les suivantes

D'autre part, IMDSv2 nécessite un Token obtenu à l'avance pour accéder aux métadonnées. L'utilisation d'IMDSv2 et les avantages en termes de sécurité sont les suivants.

Comment utiliser

--Créez un jeton de session de 6 heures (21600 secondes) à l'aide d'une requête PUT

mérite

3. Préparation de l'environnement d'exécution AWS-CLI

Préparer une instance (cli_instance) pour l'exécution de l'AWS-CLI afin d'émettre une commande de création / modification de configuration d'instance

cli_environnement d'instance(AWS-Informations sur l'environnement de l'éditeur CLI)


[root@ip-10-0-0-74 ~]# cat /etc/system-release
Amazon Linux release 2 (Karoo)
[root@ip-10-0-0-74 ~]# 
[root@ip-10-0-0-74 ~]# uname -a
Linux ip-10-0-0-74.ap-northeast-1.compute.internal 4.14.193-149.317.amzn2.x86_64 #1 SMP Thu Sep 3 19:04:44 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[root@ip-10-0-0-74 ~]# 
[root@ip-10-0-0-74 ~]# aws --version 
aws-cli/1.18.107 Python/2.7.18 Linux/4.14.193-149.317.amzn2.x86_64 botocore/1.17.31
[root@ip-10-0-0-74 ~]# 
[root@ip-10-0-0-74 ~]# curl http://169.254.169.254/latest/meta-data/instance-type/
t3.small
[root@ip-10-0-0-74 ~]# 

Créer une instance de contrôle d'opération IMDSv2 "test_instance"

cli_environnement d'instance(run-exécution d'instances)


[root@ip-10-0-0-74 ~]# aws ec2 run-instances \
> --image-id ami-0ce107ae7af2e92b5 \
> --instance-type t2.nano \
> --key-name key_file \
> --monitoring Enabled=false \
> --placement AvailabilityZone=ap-northeast-1a \
> --subnet-id subnet-03d74b8d6ab6c39f2 \
> --associate-public-ip-address \
> --security-group-ids sg-0a00ecb871bb15fb3 \
> --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=test_instance}]'

Instance construite (test_instance) Vérifiez les paramètres de métadonnées par défaut de l'instance

cli_environnement d'instance(describe-exécution d'instances)


[root@ip-10-0-0-74 ~]# aws ec2 describe-instances \
> --filters "Name=tag:Name,Values=test_instance" \
> --query Reservations[*].Instances[*].[MetadataOptions]
[
    [
        [
            {
                "State": "applied", 
                "HttpEndpoint": "enabled", 
                "HttpTokens": "optional", 
                "HttpPutResponseHopLimit": 1
            }
        ]
    ]
]
[root@ip-10-0-0-74 ~]# 

" HttpTokens ":" facultatif "-> IMDSv1 / IMDSv2 sont tous les deux disponibles " HttpTokens ":" required "-> IMDSv2 uniquement disponible (application IMDSv2)

"HttpTokens": vérification du comportement à l'état "facultatif" (les deux IMDSv1 / IMDSv2 peuvent être utilisés)

Ce qui suit est exécuté sur l'environnement" test_instance "nouvellement construit

test_environnement d'instance (exécution IMDSv1)


[root@ip-10-0-0-68 ~]# curl http://169.254.169.254/latest/meta-data/
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
events/
hostname
identity-credentials/
instance-action
instance-id
instance-life-cycle
instance-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
services/
[root@ip-10-0-0-68 ~]# 

test_environnement d'instance (exécution IMDSv2)


[root@ip-10-0-0-68 ~]# 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/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    56  100    56    0     0   9333      0 --:--:-- --:--:-- --:--:-- 11200
*   Trying 169.254.169.254...
* TCP_NODELAY set
* Connected to 169.254.169.254 (169.254.169.254) port 80 (#0)
> GET /latest/meta-data/ HTTP/1.1
> Host: 169.254.169.254
> User-Agent: curl/7.61.1
> Accept: */*
> X-aws-ec2-metadata-token: AQAAAO6n081baEIWdrfpILhc9Egt4kTm0HSpUftcYqvJSR-NKewL6A==
> 
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Accept-Ranges: bytes
< Content-Length: 313
< Content-Type: text/plain
< Date: Sat, 26 Sep 2020 14:45:29 GMT
< Last-Modified: Sat, 26 Sep 2020 14:28:58 GMT
< X-Aws-Ec2-Metadata-Token-Ttl-Seconds: 21600
< Connection: close
< Server: EC2ws
< 
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
events/
hostname
identity-credentials/
instance-action
instance-id
instance-life-cycle
instance-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
* Closing connection 0
services/
[root@ip-10-0-0-68 ~]#

4. Configuration obligatoire IMDS v2 de l'instance existante

Ce qui suit est exécuté sur l'environnement d'exécution AWS-CLI" cli_instance "environnement

cli_environnement d'instance


[root@ip-10-0-0-74 ~]# # test_Obtenir l'ID d'instance de l'instance
[root@ip-10-0-0-74 ~]# aws ec2 describe-instances \
> --filters "Name=tag:Name,Values=test_instance" \
> --query Reservations[*].Instances[*].[InstanceId]
[
    [
        [
            "i-034109c70aaa4b055"
        ]
    ]
]
[root@ip-10-0-0-74 ~]# 
[root@ip-10-0-0-74 ~]# #Exécution du réglage forcé IMDSv2("HttpTokens": "required")
[root@ip-10-0-0-74 ~]# aws ec2 modify-instance-metadata-options \
> --instance-id i-034109c70aaa4b055 \
> --http-tokens required \
> --http-put-response-hop-limit 1 \
> --http-endpoint enabled
{
    "InstanceId": "i-034109c70aaa4b055", 
    "InstanceMetadataOptions": {
        "State": "pending", 
        "HttpEndpoint": "enabled", 
        "HttpTokens": "required", 
        "HttpPutResponseHopLimit": 1
    }
}
[root@ip-10-0-0-74 ~]#

5. Vérification du comportement au moment du réglage forcé IMDSv2

"HttpTokens": vérification du comportement dans l'état "requis" (uniquement IMDSv2 disponible (IMDSv2 forcé))

Ce qui suit est exécuté sur l'environnement" test_instance "nouvellement construit

test_environnement d'instance (exécution IMDSv1)


[root@ip-10-0-0-68 ~]# curl http://169.254.169.254/latest/meta-data/
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
  <title>401 - Unauthorized</title>
 </head>
 <body>
  <h1>401 - Unauthorized</h1>
 </body>
</html>
[root@ip-10-0-0-68 ~]#

ʻIMDSv2 est forcé, donc il ne peut pas être obtenu par la méthode de IMDSv1`

test_environnement d'instance (exécution IMDSv2)


[root@ip-10-0-0-68 ~]# 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/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    56  100    56    0     0   9333      0 --:--:-- --:--:-- --:--:-- 11200
*   Trying 169.254.169.254...
* TCP_NODELAY set
* Connected to 169.254.169.254 (169.254.169.254) port 80 (#0)
> GET /latest/meta-data/ HTTP/1.1
> Host: 169.254.169.254
> User-Agent: curl/7.61.1
> Accept: */*
> X-aws-ec2-metadata-token: AQAAAO6n081aj7u-yzdFHoD8zll2ZKiNfVS79OXp1qJDwgzw7-96gA==
> 
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Accept-Ranges: bytes
< Content-Length: 313
< Content-Type: text/plain
< Date: Sat, 26 Sep 2020 15:01:45 GMT
< Last-Modified: Sat, 26 Sep 2020 14:28:58 GMT
< X-Aws-Ec2-Metadata-Token-Ttl-Seconds: 21600
< Connection: close
< Server: EC2ws
< 
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
events/
hostname
identity-credentials/
instance-action
instance-id
instance-life-cycle
instance-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
* Closing connection 0
services/
[root@ip-10-0-0-68 ~]#

Recommended Posts

Instance Metadata Service Version 2 (IMDSv2): configuration et vérification du comportement du service de métadonnées d'instance v2
Vérifiez le type et la version de la distribution Linux
Commandes et fichiers pour vérifier la version de CentOS Linux
Vérifiez la version OpenSSL de python 2.6