Vérifier le document d’identité d’une instance Amazon EC2 - Amazon Elastic Compute Cloud

Vérifier le document d’identité d’une instance Amazon EC2

Si vous avez l’intention d’utiliser le contenu du Documents d’identité d’instance à des fins importantes, vous devez vérifier son contenu et son authenticité avant de l’utiliser.

Le Documents d’identité d’instance en texte brut est accompagné de trois signatures hachées et chiffrées. Vous pouvez utiliser ces signatures pour vérifier l’origine et l’authenticité du Documents d’identité d’instance et les informations qu’il contient. Les signatures suivantes sont fournies :

  • Signature codée en base64 — Il s’agit d’un hachage SHA256 codé en base64 du Documents d’identité d’instance qui est chiffré à l’aide d’une paire de clés RSA.

  • Signature PKCS7 — Il s’agit d’un hachage SHA1 du Documents d’identité d’instance qui est chiffré à l’aide d’une paire de clés DSA.

  • Signature RSA-2048 — Il s’agit d’un hachage SHA256 du Documents d’identité d’instance qui est chiffré à l’aide d’une paire de clés RSA-2048.

Chaque signature est disponible à un point de terminaison différent dans les métadonnées de l’instance. Vous pouvez utiliser l’une de ces signatures en fonction de vos exigences de hachage et de chiffrement. Pour vérifier les signatures, vous devez utiliser le certificat AWS public correspondant.

Option 1 : vérifier le document d’identité de l’instance à l’aide de la signature PKCS7

Cette rubrique explique comment vérifier le document d’identité d’instance avec la signature PKCS7 et le certificat public DSA AWS.

Pour vérifier le document d’identité d’instance avec la signature PKCS7 et le certificat public DSA AWS
  1. Connectez-vous à l’instance.

  2. Récupérez la signature PKCS7 à partir des métadonnées de l’instance et ajoutez-la, ainsi que l’en-tête et le pied de page requis, à un fichier nommé pkcs7. Utilisez l’une des commandes suivantes en fonction de la version IMDS utilisée par l’instance.

    IMDSv2
    $ echo "-----BEGIN PKCS7-----" >> pkcs7 \ && 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" http://169.254.169.254/latest/dynamic/instance-identity/pkcs7 >> pkcs7 \ && echo "" >> pkcs7 \ && echo "-----END PKCS7-----" >> pkcs7
    IMDSv1
    $ echo "-----BEGIN PKCS7-----" >> pkcs7 \ && curl -s http://169.254.169.254/latest/dynamic/instance-identity/pkcs7 >> pkcs7 \ && echo "" >> pkcs7 \ && echo "-----END PKCS7-----" >> pkcs7
  3. Trouvez le certificat public DSA pour votre région dans Certificats publics AWS pour les signatures de documents d’identité et ajoutez le contenu à un nouveau fichier nommé certificate.

  4. Utilisez la commande OpenSSL smime pour vérifier la signature. Incluez l’option -verify indiquant que la signature doit être vérifiée et l’option -noverify indiquant que le certificat n’a pas besoin d’être vérifié.

    $ openssl smime -verify -in pkcs7 -inform PEM -certfile certificate -noverify | tee document

    Si la signature est valide, le message Verification successful s’affiche.

    La commande écrit également le contenu du document d’identité d’instance dans un nouveau fichier nommé document. Vous pouvez comparer le contenu du document d’identité d’instance provenant des métadonnées d’instance avec le contenu de ce fichier à l’aide des commandes suivantes.

    $ openssl dgst -sha256 < document
    $ curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/dynamic/instance-identity/document | openssl dgst -sha256

    Si la signature ne peut pas être vérifiée, contactez Support.

Prérequis

Cette procédure nécessite la classe System.Security Microsoft .NET Core. Pour ajouter la classe à votre séance PowerShell, exécutez la commande suivante.

PS C:\> Add-Type -AssemblyName System.Security
Note

La commande ajoute la classe à la séance PowerShell actuelle uniquement. Si vous démarrez une nouvelle séance, vous devez exécuter à nouveau la commande.

Pour vérifier le document d’identité d’instance avec la signature PKCS7 et le certificat public DSA AWS
  1. Connectez-vous à l’instance.

  2. Récupérez la signature PKCS7 à partir des métadonnées de l’instance, convertissez-la en un tableau d’octets et ajoutez-la à une variable nommée $Signature. Utilisez l’une des commandes suivantes en fonction de la version IMDS utilisée par l’instance.

    IMDSv2
    PS C:\> [string]$token = (Invoke-WebRequest -Method Put -Headers @{'X-aws-ec2-metadata-token-ttl-seconds' = '21600'} -Uri http://169.254.169.254/latest/api/token).Content
    PS C:\> $Signature = [Convert]::FromBase64String((Invoke-WebRequest -Headers @{'X-aws-ec2-metadata-token' = $Token} -Uri http://169.254.169.254/latest/dynamic/instance-identity/pkcs7).Content)
    IMDSv1
    PS C:\> $Signature = [Convert]::FromBase64String((Invoke-WebRequest -Uri http://169.254.169.254/latest/dynamic/instance-identity/pkcs7).Content)
  3. Récupérez le document d’identité d’instance en texte brut à partir des métadonnées d’instance, convertissez-le en un tableau d’octets et ajoutez-le à une variable nommée $Document. Utilisez l’une des commandes suivantes en fonction de la version IMDS utilisée par l’instance.

    IMDSv2
    PS C:\> $Document = [Text.Encoding]::UTF8.GetBytes((Invoke-WebRequest -Headers @{'X-aws-ec2-metadata-token' = $Token} -Uri http://169.254.169.254/latest/dynamic/instance-identity/document).Content)
    IMDSv1
    PS C:\> $Document = [Text.Encoding]::UTF8.GetBytes((Invoke-WebRequest http://169.254.169.254/latest/dynamic/instance-identity/document).Content)
  4. Trouvez le certificat public DSA pour votre région dans Certificats publics AWS pour les signatures de documents d’identité et ajoutez le contenu à un nouveau fichier nommé certificate.pem.

  5. Extrayez le certificat du fichier de certificat et stockez-le dans une variable nommée $Store.

    PS C:\> $Store = [Security.Cryptography.X509Certificates.X509Certificate2Collection]::new([Security.Cryptography.X509Certificates.X509Certificate2]::new((Resolve-Path certificate.pem)))
  6. Vérifiez la signature.

    PS C:\> $SignatureDocument = [Security.Cryptography.Pkcs.SignedCms]::new()
    PS C:\> $SignatureDocument.Decode($Signature)
    PS C:\> $SignatureDocument.CheckSignature($Store, $true)

    Si la signature est valide, la commande ne renvoie aucune sortie. Si la signature ne peut pas être vérifiée, la commande renvoie Exception calling "CheckSignature" with "2" argument(s): "Cannot find the original signer. Si votre signature ne peut pas être vérifiée, contactez AWS Support.

  7. Validez le contenu du document d’identité d’instance.

    PS C:\> [Linq.Enumerable]::SequenceEqual($SignatureDocument.ContentInfo.Content, $Document)

    Si le contenu du document d’identité d’instance est valide, la commande renvoie True. Si le document d’identité de l’instance ne peut pas être validé, contactez AWS Support.

Option 2 : vérifier le document d’identité de l’instance à l’aide de la signature codée en base64

Cette rubrique explique comment vérifier le document d’identité d’instance avec la signature codée en base64 et le certificat public RSA AWS.

Pour valider le document d’identité d’instance avec la signature codée en base64 et le certificat public RSA AWS
  1. Connectez-vous à l’instance.

  2. Récupérez la signature codée en base64 à partir des métadonnées d’instance, convertissez-la en binaire et ajoutez-la à un fichier nommé signature. Utilisez l’une des commandes suivantes en fonction de la version IMDS utilisée par l’instance.

    IMDSv2
    $ 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" http://169.254.169.254/latest/dynamic/instance-identity/signature | base64 -d >> signature
    IMDSv1
    $ curl -s http://169.254.169.254/latest/dynamic/instance-identity/signature | base64 -d >> signature
  3. Récupérez le Documents d’identité d’instance en texte brut à partir des métadonnées de l’instance et ajoutez-le à un fichier nommé document. Utilisez l’une des commandes suivantes en fonction de la version IMDS utilisée par l’instance.

    IMDSv2
    $ 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" http://169.254.169.254/latest/dynamic/instance-identity/document >> document
    IMDSv1
    $ curl -s http://169.254.169.254/latest/dynamic/instance-identity/document >> document
  4. Trouvez le certificat public RSA pour votre région dans Certificats publics AWS pour les signatures de documents d’identité et ajoutez le contenu à un nouveau fichier nommé certificate.

  5. Extrayez la clé publique du certificat public RSA AWS et enregistrez-la dans un fichier nommé key.

    $ openssl x509 -pubkey -noout -in certificate >> key
  6. Utilisez la commande OpenSSL dgst pour vérifier le Documents d’identité d’instance.

    $ openssl dgst -sha256 -verify key -signature signature document

    Si la signature est valide, le message Verification successful s'affiche.

    La commande écrit également le contenu du document d’identité d’instance dans un nouveau fichier nommé document. Vous pouvez comparer le contenu du document d’identité d’instance provenant des métadonnées d’instance avec le contenu de ce fichier à l’aide des commandes suivantes.

    $ openssl dgst -sha256 < document
    $ curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/dynamic/instance-identity/document | openssl dgst -sha256

    Si la signature ne peut pas être vérifiée, contactez Support.

Pour valider le document d’identité d’instance avec la signature codée en base64 et le certificat public RSA AWS
  1. Connectez-vous à l’instance.

  2. Récupérez la signature codée en base64 à partir des métadonnées d’instance, convertissez-la en un tableau d’octets et ajoutez-la à la variable nommée $Signature. Utilisez l’une des commandes suivantes en fonction de la version IMDS utilisée par l’instance.

    IMDSv2
    PS C:\> [string]$token = (Invoke-WebRequest -Method Put -Headers @{'X-aws-ec2-metadata-token-ttl-seconds' = '21600'} http://169.254.169.254/latest/api/token).Content
    PS C:\> $Signature = [Convert]::FromBase64String((Invoke-WebRequest -Headers @{'X-aws-ec2-metadata-token' = $Token} http://169.254.169.254/latest/dynamic/instance-identity/signature).Content)
    IMDSv1
    PS C:\> $Signature = [Convert]::FromBase64String((Invoke-WebRequest http://169.254.169.254/latest/dynamic/instance-identity/signature).Content)
  3. Récupérez le document d’identité d’instance en texte brut à partir des métadonnées d’instance, convertissez-le en un tableau d’octets et ajoutez-le à une variable nommée $Document. Utilisez l’une des commandes suivantes en fonction de la version IMDS utilisée par l’instance.

    IMDSv2
    PS C:\> $Document = [Text.Encoding]::UTF8.GetBytes((Invoke-WebRequest -Headers @{'X-aws-ec2-metadata-token' = $Token} http://169.254.169.254/latest/dynamic/instance-identity/document).Content)
    IMDSv1
    PS C:\> $Document = [Text.Encoding]::UTF8.GetBytes((Invoke-WebRequest http://169.254.169.254/latest/dynamic/instance-identity/document).Content)
  4. Trouvez le certificat public RSA pour votre région dans Certificats publics AWS pour les signatures de documents d’identité et ajoutez le contenu à un nouveau fichier nommé certificate.pem.

  5. Vérifier le document d’identité d’instance

    PS C:\> [Security.Cryptography.X509Certificates.X509Certificate2]::new((Resolve-Path certificate.pem)).PublicKey.Key.VerifyData($Document, 'SHA256', $Signature)

    Si la signature est valide, la commande renvoie True. Si la signature ne peut pas être vérifiée, contactez Support.

Option 3 : vérifier le document d’identité de l’instance à l’aide de la signature RSA-2048

Cette rubrique explique comment vérifier le document d’identité d’instance avec la signature RSA-2048 et le certificat public RSA-2048 AWS.

Pour vérifier le document d’identité d’instance avec la signature RSA-2048 et le certificat public RSA-2048 AWS
  1. Connectez-vous à l’instance.

  2. Récupérez la signature RSA-2048 à partir des métadonnées de l’instance et ajoutez-la, ainsi que l’en-tête et le pied de page requis, à un fichier nommé rsa2048. Utilisez l’une des commandes suivantes en fonction de la version IMDS utilisée par l’instance.

    IMDSv2
    $ echo "-----BEGIN PKCS7-----" >> rsa2048 \ && 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" http://169.254.169.254/latest/dynamic/instance-identity/rsa2048 >> rsa2048 \ && echo "" >> rsa2048 \ && echo "-----END PKCS7-----" >> rsa2048
    IMDSv1
    $ echo "-----BEGIN PKCS7-----" >> rsa2048 \ && curl -s http://169.254.169.254/latest/dynamic/instance-identity/rsa2048 >> rsa2048 \ && echo "" >> rsa2048 \ && echo "-----END PKCS7-----" >> rsa2048
  3. Trouvez le certificat public RSA-2048 pour votre région dans Certificats publics AWS pour les signatures de documents d’identité et ajoutez le contenu à un nouveau fichier nommé certificate.

  4. Utilisez la commande OpenSSL smime pour vérifier la signature. Incluez l’option -verify indiquant que la signature doit être vérifiée et l’option -noverify indiquant que le certificat n’a pas besoin d’être vérifié.

    $ openssl smime -verify -in rsa2048 -inform PEM -certfile certificate -noverify | tee document

    Si la signature est valide, le message Verification successful s’affiche. Si la signature ne peut pas être vérifiée, contactez Support.

Prérequis

Cette procédure nécessite la classe System.Security Microsoft .NET Core. Pour ajouter la classe à votre séance PowerShell, exécutez la commande suivante.

PS C:\> Add-Type -AssemblyName System.Security
Note

La commande ajoute la classe à la séance PowerShell actuelle uniquement. Si vous démarrez une nouvelle séance, vous devez exécuter à nouveau la commande.

Pour vérifier le document d’identité d’instance avec la signature RSA-2048 et le certificat public RSA-2048 AWS
  1. Connectez-vous à l’instance.

  2. Récupérez la signature RSA-2048 à partir des métadonnées d’instance, convertissez-la en un tableau d’octets et ajoutez-la à une variable nommée $Signature. Utilisez l’une des commandes suivantes en fonction de la version IMDS utilisée par l’instance.

    IMDSv2
    PS C:\> [string]$token = (Invoke-WebRequest -Method Put -Headers @{'X-aws-ec2-metadata-token-ttl-seconds' = '21600'} http://169.254.169.254/latest/api/token).Content
    PS C:\> $Signature = [Convert]::FromBase64String((Invoke-WebRequest -Headers @{'X-aws-ec2-metadata-token' = $Token} http://169.254.169.254/latest/dynamic/instance-identity/rsa2048).Content)
    IMDSv1
    PS C:\> $Signature = [Convert]::FromBase64String((Invoke-WebRequest http://169.254.169.254/latest/dynamic/instance-identity/rsa2048).Content)
  3. Récupérez le document d’identité d’instance en texte brut à partir des métadonnées d’instance, convertissez-le en un tableau d’octets et ajoutez-le à une variable nommée $Document. Utilisez l’une des commandes suivantes en fonction de la version IMDS utilisée par l’instance.

    IMDSv2
    PS C:\> $Document = [Text.Encoding]::UTF8.GetBytes((Invoke-WebRequest -Headers @{'X-aws-ec2-metadata-token' = $Token} http://169.254.169.254/latest/dynamic/instance-identity/document).Content)
    IMDSv1
    PS C:\> $Document = [Text.Encoding]::UTF8.GetBytes((Invoke-WebRequest http://169.254.169.254/latest/dynamic/instance-identity/document).Content)
  4. Trouvez le certificat public RSA-2048 pour votre région dans Certificats publics AWS pour les signatures de documents d’identité et ajoutez le contenu à un nouveau fichier nommé certificate.pem.

  5. Extrayez le certificat du fichier de certificat et stockez-le dans une variable nommée $Store.

    PS C:\> $Store = [Security.Cryptography.X509Certificates.X509Certificate2Collection]::new([Security.Cryptography.X509Certificates.X509Certificate2]::new((Resolve-Path certificate.pem)))
  6. Vérifiez la signature.

    PS C:\> $SignatureDocument = [Security.Cryptography.Pkcs.SignedCms]::new()
    PS C:\> $SignatureDocument.Decode($Signature)
    PS C:\> $SignatureDocument.CheckSignature($Store, $true)

    Si la signature est valide, la commande ne renvoie aucune sortie. Si la signature ne peut pas être vérifiée, la commande renvoie Exception calling "CheckSignature" with "2" argument(s): "Cannot find the original signer. Si votre signature ne peut pas être vérifiée, contactez AWS Support.

  7. Validez le contenu du document d’identité d’instance.

    PS C:\> [Linq.Enumerable]::SequenceEqual($SignatureDocument.ContentInfo.Content, $Document)

    Si le contenu du document d’identité d’instance est valide, la commande renvoie True. Si le document d’identité de l’instance ne peut pas être validé, contactez AWS Support.