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. 인스턴스 ID 문서 서명을 위한 AWS 퍼블릭 인증서에서 리전의 DSA 퍼블릭 인증서를 찾고 콘텐츠를 새 certificate 파일에 추가합니다.

  4. OpenSSL smime 명령을 사용하여 서명을 확인합니다. 서명을 확인해야 함을 나타내는 -verify 옵션과 인증서를 확인할 필요가 없음을 나타내는 -noverify 옵션을 포함합니다.

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

    서명이 유효하면 Verification successful 메시지가 나타납니다.

    또한 이 명령은 인스턴스 ID 문서의 내용을 document라는 새 파일에 씁니다. 다음 명령을 사용하여 인스턴스 메타데이터의 인스턴스 ID 문서 내용을 이 파일의 내용과 비교할 수 있습니다.

    $ 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에 문의하세요.

사전 조건

이 절차를 수행하려면 System.Security Microsoft .NET Core 클래스가 필요합니다. 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. 인스턴스 ID 문서 서명을 위한 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가 반환됩니다. 인스턴스 ID 문서를 검증할 수 없는 경우 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. 인스턴스 ID 문서 서명을 위한 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 메시지가 나타납니다.

    또한 이 명령은 인스턴스 ID 문서의 내용을 document라는 새 파일에 씁니다. 다음 명령을 사용하여 인스턴스 메타데이터의 인스턴스 ID 문서 내용을 이 파일의 내용과 비교할 수 있습니다.

    $ 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. 인스턴스 ID 문서 서명을 위한 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. 인스턴스 ID 문서 서명을 위한 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에 문의하세요.

사전 조건

이 절차를 수행하려면 System.Security Microsoft .NET Core 클래스가 필요합니다. 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. 인스턴스 ID 문서 서명을 위한 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가 반환됩니다. 인스턴스 ID 문서를 검증할 수 없는 경우 AWS Support에 문의하세요.