Verifique o documento de identidade de uma instância do Amazon EC2 - Amazon Elastic Compute Cloud

Verifique o documento de identidade de uma instância do Amazon EC2

Se você pretende usar o conteúdo do documento de identidade da instância para um propósito importante, deve verificar seu conteúdo e autenticidade antes de usá-lo.

O documento de identidade da instância de texto simples é acompanhado por três assinaturas hash e criptografadas. É possível usar essas assinaturas para verificar a origem e a autenticidade do documento de identidade da instância e as informações incluídas nele. São fornecidas as seguintes assinaturas:

  • Assinatura codificada em base64 – trata-se de um hash SHA256 codificado em base64 do documento de identidade da instância que é criptografado usando um par de chaves RSA.

  • Assinatura PKCS7 – trata-se de um hash SHA1 do documento de identidade da instância que é criptografado usando um par de chaves DSA.

  • Assinatura RSA-2048 – trata-se de um hash SHA256 do documento de identidade da instância que é criptografado usando um par de chaves RSA-2048.

Cada assinatura está disponível em um endpoint diferente nos metadados da instância. É possível usar qualquer uma dessas assinaturas dependendo dos requisitos de hash e criptografia. Para verificar as assinaturas, é necessário usar o certificado público da AWS correspondente.

Opção 1: verificar o documento de identidade da instância usando a assinatura PKCS7

Este tópico explica como verificar o documento de identidade da instância usando a assinatura PKCS7 e o certificado público DSA da AWS.

Para verificar o documento de identidade da instância usando a assinatura PKCS7 e o certificado público AWS DSA
  1. Conecte-se à instância.

  2. Recupere a assinatura PKCS7 dos metadados da instância e adicione-a a um arquivo chamado pkcs7 junto com o cabeçalho e rodapé necessários. Use um dos comandos a seguir dependendo da versão do IMDS usada pela instância.

    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. Encontre o certificado público DSA da sua região em Certificados públicos da AWS para assinaturas de documento de identidade da instância e adicione o conteúdo a um novo arquivo chamado certificate.

  4. Use o comando OpenSSL smime para verificar a assinatura. Inclua a opção -verify para indicar que a assinatura precisa ser verificada, e a opção -noverify para indicar que o certificado não precisa ser verificado.

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

    Se a assinatura for válida, a mensagem Verification successful será exibida.

    O comando também grava o conteúdo do documento de identidade da instância em um novo arquivo denominado document. É possível comparar o conteúdo do documento de identidade da instância dos metadados da instância com o conteúdo desse arquivo usando os comandos a seguir.

    $ 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

    Se não for possível verificar a assinatura, entre em contato com o AWS Support.

Pré-requisitos

Este procedimento exige a classe System.Security Microsoft .NET Core. Para adicionar a classe à sessão do PowerShell, execute o comando a seguir.

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

O comando adiciona a classe somente à sessão atual do PowerShell. Se você iniciar uma nova sessão, deverá executar o comando novamente.

Para verificar o documento de identidade da instância usando a assinatura PKCS7 e o certificado público AWS DSA
  1. Conecte-se à instância.

  2. Recupere a assinatura PKCS7 dos metadados da instância, converta-a em uma matriz de bytes e adicione-a a uma variável chamada $Signature. Use um dos comandos a seguir dependendo da versão do IMDS usada pela instância.

    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. Recupere o documento de identidade da instância de texto simples dos metadados da instância, converta-o em uma matriz de bytes e adicione-o a uma variável chamada $Document. Use um dos comandos a seguir dependendo da versão do IMDS usada pela instância.

    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. Encontre o certificado público DSA da sua região em Certificados públicos da AWS para assinaturas de documento de identidade da instância e adicione o conteúdo a um novo arquivo chamado certificate.pem.

  5. Extraia o certificado do arquivo de certificado e armazene-o em uma variável chamada $Store.

    PS C:\> $Store = [Security.Cryptography.X509Certificates.X509Certificate2Collection]::new([Security.Cryptography.X509Certificates.X509Certificate2]::new((Resolve-Path certificate.pem)))
  6. Verifique a assinatura.

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

    Se a assinatura for válida, o comando não retornará nenhuma saída. Se não for possível verificar a assinatura, o comando retornará Exception calling "CheckSignature" with "2" argument(s): "Cannot find the original signer. Se não for possível verificar a assinatura, entre em contato com o AWS Support.

  7. Valide o conteúdo do documento de identidade da instância.

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

    Se o conteúdo do documento de identidade da instância for válido, o comando retornará True. Se o documento de identidade da instância não puder ser validado, entre em contato com o AWS Support.

Opção 2: verificar o documento de identidade da instância usando a assinatura codificada em base64

Este tópico explica como verificar o documento de identidade da instância usando a assinatura codificada em base64 e o certificado público RSA da AWS.

Para validar o documento de identidade da instância usando a assinatura codificada em base64 e do certificado público RSA da AWS
  1. Conecte-se à instância.

  2. Recupere a assinatura codificada em base64 dos metadados da instância, converta-a em binário e adicione-o a um arquivo chamado signature. Use um dos comandos a seguir dependendo da versão do IMDS usada pela instância.

    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. Recupere o documento de identidade da instância de texto simples dos metadados da instância e adicione-o a um arquivo chamado document. Use um dos comandos a seguir dependendo da versão do IMDS usada pela instância.

    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. Encontre o certificado público RSA para a sua região em Certificados públicos da AWS para assinaturas de documento de identidade da instância e adicione o conteúdo a um novo arquivo denominado certificate.

  5. Extraia a chave pública do certificado público RSS da AWS e salve-a em um arquivo denominado key.

    $ openssl x509 -pubkey -noout -in certificate >> key
  6. Use o comando OpenSSL dgst para verificar o documento de identidade da instância.

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

    Se a assinatura for válida, a mensagem Verification successful será exibida.

    O comando também grava o conteúdo do documento de identidade da instância em um novo arquivo denominado document. É possível comparar o conteúdo do documento de identidade da instância dos metadados da instância com o conteúdo desse arquivo usando os comandos a seguir.

    $ 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

    Se não for possível verificar a assinatura, entre em contato com o AWS Support.

Para validar o documento de identidade da instância usando a assinatura codificada em base64 e do certificado público RSA da AWS
  1. Conecte-se à instância.

  2. Recupere a assinatura codificada em base64 dos metadados da instância, converta-a em uma matriz de bytes e adicione-a à variável chamada $Signature. Use um dos comandos a seguir dependendo da versão do IMDS usada pela instância.

    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. Recupere o documento de identidade da instância de texto simples dos metadados da instância, converta-o em uma matriz de bytes e adicione-o a uma variável chamada $Document. Use um dos comandos a seguir dependendo da versão do IMDS usada pela instância.

    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. Encontre o certificado público RSA para a sua região em Certificados públicos da AWS para assinaturas de documento de identidade da instância e adicione o conteúdo a um novo arquivo denominado certificate.pem.

  5. Verifique o documento de identidade da instância.

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

    Se a assinatura for válida, o comando retornará True. Se não for possível verificar a assinatura, entre em contato com o AWS Support.

Opção 3: verificar o documento de identidade da instância usando a assinatura RSA-2048

Este tópico explica como verificar o documento de identidade da instância usando a assinatura RSA-2048 e o certificado público RSA-2048 da AWS.

Para verificar o documento de identidade da instância usando a assinatura RSA-2048 e o certificado público RSA-2048 da AWS
  1. Conecte-se à instância.

  2. Recupere a assinatura RSA-2048 dos metadados da instância e adicione-a a um novo arquivo chamado rsa2048 junto com o cabeçalho e rodapé necessários. Use um dos comandos a seguir dependendo da versão do IMDS usada pela instância.

    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. Encontre o certificado público RSA-2048 para a sua região em Certificados públicos da AWS para assinaturas de documento de identidade da instância e adicione o conteúdo a um novo arquivo denominado certificate.

  4. Use o comando OpenSSL smime para verificar a assinatura. Inclua a opção -verify para indicar que a assinatura precisa ser verificada, e a opção -noverify para indicar que o certificado não precisa ser verificado.

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

    Se a assinatura for válida, a mensagem Verification successful será exibida. Se não for possível verificar a assinatura, entre em contato com o AWS Support.

Pré-requisitos

Este procedimento exige a classe System.Security Microsoft .NET Core. Para adicionar a classe à sessão do PowerShell, execute o comando a seguir.

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

O comando adiciona a classe somente à sessão atual do PowerShell. Se você iniciar uma nova sessão, deverá executar o comando novamente.

Para verificar o documento de identidade da instância usando a assinatura RSA-2048 e o certificado público RSA-2048 da AWS
  1. Conecte-se à instância.

  2. Recupere a assinatura RSA-2048 dos metadados da instância, converta-a em uma matriz de bytes e adicione-a a uma variável chamada $Signature. Use um dos comandos a seguir dependendo da versão do IMDS usada pela instância.

    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. Recupere o documento de identidade da instância de texto simples dos metadados da instância, converta-o em uma matriz de bytes e adicione-o a uma variável chamada $Document. Use um dos comandos a seguir dependendo da versão do IMDS usada pela instância.

    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. Encontre o certificado público RSA-2048 para a sua região em Certificados públicos da AWS para assinaturas de documento de identidade da instância e adicione o conteúdo a um novo arquivo denominado certificate.pem.

  5. Extraia o certificado do arquivo de certificado e armazene-o em uma variável chamada $Store.

    PS C:\> $Store = [Security.Cryptography.X509Certificates.X509Certificate2Collection]::new([Security.Cryptography.X509Certificates.X509Certificate2]::new((Resolve-Path certificate.pem)))
  6. Verifique a assinatura.

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

    Se a assinatura for válida, o comando não retornará nenhuma saída. Se não for possível verificar a assinatura, o comando retornará Exception calling "CheckSignature" with "2" argument(s): "Cannot find the original signer. Se não for possível verificar a assinatura, entre em contato com o AWS Support.

  7. Valide o conteúdo do documento de identidade da instância.

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

    Se o conteúdo do documento de identidade da instância for válido, o comando retornará True. Se o documento de identidade da instância não puder ser validado, entre em contato com o AWS Support.