Amazon EC2 インスタンスのインスタンスアイデンティティドキュメントを検証する - Amazon Elastic Compute Cloud

Amazon EC2 インスタンスのインスタンスアイデンティティドキュメントを検証する

インスタンスアイデンティティドキュメントの内容を重要な用途に使用する場合は、使用前にその内容と真正性を検証する必要があります。

プレーンテキストのインスタンスアイデンティティドキュメントには、ハッシュ化および暗号化された署名が 3 つあります。これらの署名を使用して、インスタンスアイデンティティドキュメントの作成元および真正性とそれに含まれている情報を検証できます。提供されている署名は次のとおりです。

  • base64 でエンコードされた署名—RSA キーペアを使用して暗号化されたインスタンスアイデンティティドキュメントの base64 でエンコードされた SHA256 ハッシュです。

  • PKCS7 署名—DSA キーペアを使用して暗号化されたインスタンスアイデンティティドキュメントの SHA1 ハッシュです。

  • RSA-2048 署名—RSA-2048 キーペアを使用して暗号化されたインスタンスアイデンティティドキュメントの SHA256 ハッシュです。

それぞれの署名は、インスタンスメタデータの異なるエンドポイントで取得できます。ハッシュ化と暗号化の要件に応じて、これらの署名のいずれかを使用できます。署名を検証するには、対応する AWS パブリック証明書を使用する必要があります。

オプション 1: PKCS7 署名を使用してインスタンスアイデンティティドキュメントを検証する

このトピックでは、PKCS7 署名と AWS DSA パブリック証明書を使用して、インスタンスアイデンティティドキュメントを検証する方法について説明します。

PKCS7 署名と AWS DSA パブリック証明書を使用してインスタンスアイデンティティドキュメントを検証するには
  1. インスタンスに接続します。

  2. インスタンスメタデータから PKCS7 署名を取得し、必要なヘッダーとフッターとともにpkcs7という名前の新しいファイルに追加します。インスタンスで使用されている IMDS のバージョンに応じて、次のいずれかのコマンドを使用します。

    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. インスタンスアイデンティティドキュメント署名の AWS パブリック証明書でリージョン用に DSA パブリック証明書を検索し、certificate という名前の新しいファイルに追加します。

  4. OpenSSL の smime コマンドを使用して、署名を検証します。署名を検証する必要があることを示す -verify オプションと証明書を検証する必要がないことを示す -noverify オプションを含めます。

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

    署名が有効な場合は、Verification successful メッセージが表示されます。

    また、このコマンドでは、インスタンスアイデンティティドキュメントの内容を、document という名前の新しいファイルにも書き込みます。以下のコマンドにより、このファイルの内容を、インスタンスメタデータからのインスタンスアイデンティティドキュメントの内容と比較できます。

    $ 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

    署名を検証できない場合は、AWS Supportにお問い合わせください。

前提条件

この手順では、Microsoft .NET Core の System.Security クラスが必要です。このクラスを PowerShell セッションに追加するには、次のコマンドを実行します。

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

このコマンドは、現在の PowerShell セッションにのみクラスを追加します。別のセッションを開始する場合は、このコマンドをもう一度実行する必要があります。

PKCS7 署名と AWS DSA パブリック証明書を使用してインスタンスアイデンティティドキュメントを検証するには
  1. インスタンスに接続します。

  2. インスタンスメタデータから PKCS7 署名を取得し、バイトの配列に変換して、$Signature という名前の変数に追加します。インスタンスで使用されている IMDS のバージョンに応じて、次のいずれかのコマンドを使用します。

    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/pkcs7).Content)
    IMDSv1
    PS C:\> $Signature = [Convert]::FromBase64String((Invoke-WebRequest http://169.254.169.254/latest/dynamic/instance-identity/pkcs7).Content)
  3. インスタンスメタデータからプレーンテキストのインスタンスアイデンティティドキュメントを取得し、バイトの配列に変換して、$Document という名前の変数に追加します。インスタンスで使用されている IMDS のバージョンに応じて、次のいずれかのコマンドを使用します。

    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. インスタンスアイデンティティドキュメント署名の AWS パブリック証明書でリージョン用に DSA パブリック証明書を検索し、certificate.pem という名前の新しいファイルに追加します。

  5. 証明書ファイルから証明書を抽出し、$Store という名前の変数に格納します。

    PS C:\> $Store = [Security.Cryptography.X509Certificates.X509Certificate2Collection]::new([Security.Cryptography.X509Certificates.X509Certificate2]::new((Resolve-Path certificate.pem)))
  6. 署名を検証します。

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

    署名が有効な場合、このコマンドは出力を返しません。署名を検証できない場合、このコマンドは Exception calling "CheckSignature" with "2" argument(s): "Cannot find the original signer を返します。署名を検証できない場合は、AWS Supportにお問い合わせください。

  7. インスタンスアイデンティティドキュメントの内容を検証します。

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

    インスタンスアイデンティティドキュメントの内容が有効な場合、このコマンドは True を返します。インスタンスアイデンティティドキュメントを検証できない場合は、AWS Support にお問い合わせください。

オプション 2: base64 エンコード署名を使用してインスタンスアイデンティティドキュメントを検証する

このトピックでは、base64 でエンコードされた署名と AWS RSA パブリック証明書を使用して、インスタンスアイデンティティドキュメントを検証する方法について説明します。

base64 でエンコードされた署名と AWS RSA パブリック証明書を使用してインスタンスアイデンティティドキュメントを検証するには
  1. インスタンスに接続します。

  2. インスタンスメタデータから base64 でエンコードされた署名を取得し、バイナリに変換して、signature という名前のファイルに追加します。インスタンスで使用されている IMDS のバージョンに応じて、次のいずれかのコマンドを使用します。

    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. インスタンスメタデータからプレーンテキストのインスタンスアイデンティティドキュメントを取得し、document という名前のファイルに追加します。インスタンスで使用されている IMDS のバージョンに応じて、次のいずれかのコマンドを使用します。

    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. インスタンスアイデンティティドキュメント署名の AWS パブリック証明書でリージョン用に RSA パブリック証明書を検索し、certificate という名前の新しいファイルに追加します。

  5. AWS RSA パブリック証明書からパブリックキーを抽出し、key という名前のファイルに保存します。

    $ openssl x509 -pubkey -noout -in certificate >> key
  6. OpenSSL の dgst コマンドを使用して、インスタンスアイデンティティドキュメントを検証します。

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

    署名が有効な場合は、Verification successful メッセージが表示されます。

    また、このコマンドでは、インスタンスアイデンティティドキュメントの内容を、document という名前の新しいファイルにも書き込みます。以下のコマンドにより、このファイルの内容を、インスタンスメタデータからのインスタンスアイデンティティドキュメントの内容と比較できます。

    $ 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

    署名を検証できない場合は、AWS Supportにお問い合わせください。

base64 でエンコードされた署名と AWS RSA パブリック証明書を使用してインスタンスアイデンティティドキュメントを検証するには
  1. インスタンスに接続します。

  2. インスタンスメタデータから base64 でエンコードされた署名を取得し、バイトの配列に変換して、$Signature という名前の変数に追加します。インスタンスで使用されている IMDS のバージョンに応じて、次のいずれかのコマンドを使用します。

    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. インスタンスメタデータからプレーンテキストのインスタンスアイデンティティドキュメントを取得し、バイトの配列に変換して、$Document という名前の変数に追加します。インスタンスで使用されている IMDS のバージョンに応じて、次のいずれかのコマンドを使用します。

    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. インスタンスアイデンティティドキュメント署名の AWS パブリック証明書でリージョン用に RSA パブリック証明書を検索し、certificate.pem という名前の新しいファイルに追加します。

  5. インスタンスアイデンティティドキュメントを検証します。

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

    署名が有効な場合、このコマンドは True を返します。署名を検証できない場合は、AWS Supportにお問い合わせください。

オプション 3: RSA-2048 署名を使用してインスタンスアイデンティティドキュメントを検証する

このトピックでは、RSA-2048 署名と AWS RSA-2048 パブリック証明書を使用して、インスタンスアイデンティティドキュメントを検証する方法について説明します。

RSA-2048 署名と AWS RSA-2048 パブリック証明書を使用してインスタンスアイデンティティドキュメントを検証するには
  1. インスタンスに接続します。

  2. インスタンスメタデータから RSA-2048 署名を取得し、必要なヘッダーとフッターとともにrsa2048 という名前のファイルに追加します。インスタンスで使用されている IMDS のバージョンに応じて、次のいずれかのコマンドを使用します。

    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. インスタンスアイデンティティドキュメント署名の AWS パブリック証明書でリージョン用に RSA-2048 パブリック証明書を検索し、certificate という名前の新しいファイルに追加します。

  4. OpenSSL の smime コマンドを使用して、署名を検証します。署名を検証する必要があることを示す -verify オプションと証明書を検証する必要がないことを示す -noverify オプションを含めます。

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

    署名が有効な場合は、Verification successful メッセージが表示されます。署名を検証できない場合は、AWS Supportにお問い合わせください。

前提条件

この手順では、Microsoft .NET Core の System.Security クラスが必要です。このクラスを PowerShell セッションに追加するには、次のコマンドを実行します。

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

このコマンドは、現在の PowerShell セッションにのみクラスを追加します。別のセッションを開始する場合は、このコマンドをもう一度実行する必要があります。

RSA-2048 署名と AWS RSA-2048 パブリック証明書を使用してインスタンスアイデンティティドキュメントを検証するには
  1. インスタンスに接続します。

  2. インスタンスメタデータから RSA-2048 署名を取得し、バイトの配列に変換して、$Signature という名前の変数に追加します。インスタンスで使用されている IMDS のバージョンに応じて、次のいずれかのコマンドを使用します。

    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. インスタンスメタデータからプレーンテキストのインスタンスアイデンティティドキュメントを取得し、バイトの配列に変換して、$Document という名前の変数に追加します。インスタンスで使用されている IMDS のバージョンに応じて、次のいずれかのコマンドを使用します。

    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. インスタンスアイデンティティドキュメント署名の AWS パブリック証明書でリージョン用に RSA-2048 パブリック証明書を検索し、certificate.pem という名前の新しいファイルに追加します。

  5. 証明書ファイルから証明書を抽出し、$Store という名前の変数に格納します。

    PS C:\> $Store = [Security.Cryptography.X509Certificates.X509Certificate2Collection]::new([Security.Cryptography.X509Certificates.X509Certificate2]::new((Resolve-Path certificate.pem)))
  6. 署名を検証します。

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

    署名が有効な場合、このコマンドは出力を返しません。署名を検証できない場合、このコマンドは Exception calling "CheckSignature" with "2" argument(s): "Cannot find the original signer を返します。署名を検証できない場合は、AWS Supportにお問い合わせください。

  7. インスタンスアイデンティティドキュメントの内容を検証します。

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

    インスタンスアイデンティティドキュメントの内容が有効な場合、このコマンドは True を返します。インスタンスアイデンティティドキュメントを検証できない場合は、AWS Support にお問い合わせください。