Verifique el documento de identidad de instancia para una instancia de Amazon EC2 - Amazon Elastic Compute Cloud

Verifique el documento de identidad de instancia para una instancia de Amazon EC2

Si tiene la intención de utilizar el contenido del Documentos de identidad de instancia para un propósito importante, debe verificar su contenido y autenticidad antes de usarlo.

El Documentos de identidad de instancia de texto sin formato se acompaña de tres firmas resumidas y cifradas. Puede utilizar estas firmas para verificar el origen y la autenticidad del Documentos de identidad de instancia y la información que incluye. Se proporcionan las siguientes firmas:

  • Firma codificada en base64: este es un hash SHA256 codificado en base64 del Documentos de identidad de instancia cifrado mediante un par de claves RSA.

  • Firma PKCS7: este es un hash SHA1 del Documentos de identidad de instancia cifrado mediante un par de claves DSA.

  • Firma RSA-2048: este es un hash SHA256 del Documentos de identidad de instancia cifrado utilizando un par de claves RSA-2048.

Cada firma está disponible en un punto de conexión diferente en los metadatos de la instancia. Puede usar cualquiera de estas firmas dependiendo de sus requisitos de cifrado y hash. Para verificar las firmas, debe usar el correspondiente certificado público de AWS.

Opción 1: verificar el documento de identidad de instancia mediante la firma PKCS7

En este tema, se explica cómo verificar el documento de identidad de la instancia mediante la firma PKCS7 y el certificado público DSA de AWS.

Para verificar el documento de identidad de la instancia mediante la firma PKCS7 y el certificado público DSA de AWS
  1. Conéctese a la instancia.

  2. Recupere la firma PKCS7 de los metadatos de la instancia y agréguela a un archivo nuevo denominado pkcs7 junto con el encabezado y el pie de página requeridos. Utilice uno de los siguientes comandos dependiendo de la versión IMDS utilizada por la instancia.

    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. Busque el certificado público DSA para su región en Certificados públicos de AWS para las firmas del documento de identidad de la instancia y agregue el contenido a un archivo nuevo denominado certificate.

  4. Utilice el comando openSSL smime para verificar la firma. Incluya la opción -verify para indicar que es necesario verificar la firma, y la opción -noverify para indicar que no es necesario verificar el certificado.

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

    Si la firma es válida, aparecerá el mensaje Verification successful.

    El comando también escribe el contenido del documento de identidad de la instancia en un nuevo archivo llamado document. Puede comparar el contenido del documento de identidad de la instancia de los metadatos de la instancia con el contenido de este archivo mediante los siguientes comandos.

    $ 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 no se puede verificar la firma, póngase en contacto con AWS Support.

Requisitos previos

Este procedimiento requiere la clase Microsoft .NET Core de System.Security. Para agregar la clase a la sesión de PowerShell, ejecute el siguiente comando.

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

El comando agrega la clase solo a la sesión actual de PowerShell. Si inicia una nueva sesión, debe ejecutar el comando de nuevo.

Para verificar el documento de identidad de la instancia mediante la firma PKCS7 y el certificado público DSA de AWS
  1. Conéctese a la instancia.

  2. Recupere la firma PKCS7 de los metadatos de instancia, conviértala en una matriz de bytes y agréguela a una variable denominada $Signature. Utilice uno de los siguientes comandos dependiendo de la versión IMDS utilizada por la instancia.

    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 el documento de identidad de instancia de texto sin formato de los metadatos de instancia, conviértalo en una matriz de bytes y agréguelo a una variable denominada $Document. Utilice uno de los siguientes comandos dependiendo de la versión IMDS utilizada por la instancia.

    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. Busque el certificado público DSA para su región en Certificados públicos de AWS para las firmas del documento de identidad de la instancia y agregue el contenido a un archivo nuevo denominado certificate.pem.

  5. Extraiga el certificado del archivo de certificado y guárdelo en una variable denominada $Store.

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

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

    Si la firma es válida, el comando no devuelve ningún resultado. Si no se puede verificar la firma, el comando devuelve Exception calling "CheckSignature" with "2" argument(s): "Cannot find the original signer. Si su firma no se puede verificar, póngase en contacto con AWS Support.

  7. Valide el contenido del documento de identidad de instancia.

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

    Si el contenido del documento de identidad de instancia es válido, el comando devuelve True. Si el documento de identidad de la instancia no se puede validar, póngase en contacto con AWS Support.

Opción 2: verificar el documento de identidad de instancia mediante la firma codificada en base64

En este tema, se explica cómo verificar el documento de identidad de la instancia mediante la firma codificada en base64 y el certificado público de RSA de AWS.

Para validar el documento de identidad de la instancia mediante la firma codificada en base64 y el certificado público del RSA de AWS
  1. Conéctese a la instancia.

  2. Recupere la firma codificada en base64 de los metadatos de la instancia, conviértala a binario y agréguela a un archivo denominado signature. Utilice uno de los siguientes comandos dependiendo de la versión IMDS utilizada por la instancia.

    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 el Documentos de identidad de instancia de texto sin formato de los metadatos de la instancia y agréguelo a un archivo denominado document. Utilice uno de los siguientes comandos dependiendo de la versión IMDS utilizada por la instancia.

    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. Busque el certificado público RSA para su región en Certificados públicos de AWS para las firmas del documento de identidad de la instancia y agregue el contenido a un archivo nuevo denominado certificate.

  5. Extraiga la clave pública del certificado público RSA de AWS y guárdela en un archivo denominado key.

    $ openssl x509 -pubkey -noout -in certificate >> key
  6. Utilice el comando OpenSSL dgst para verificar el documento de identidad de instancia.

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

    Si la firma es válida, aparecerá el mensaje Verification successful.

    El comando también escribe el contenido del documento de identidad de la instancia en un nuevo archivo llamado document. Puede comparar el contenido del documento de identidad de la instancia de los metadatos de la instancia con el contenido de este archivo mediante los siguientes comandos.

    $ 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 no se puede verificar la firma, póngase en contacto con AWS Support.

Para validar el documento de identidad de la instancia mediante la firma codificada en base64 y el certificado público del RSA de AWS
  1. Conéctese a la instancia.

  2. Recupere la firma codificada en base64 de los metadatos de instancia, conviértala en una matriz de bytes y agréguela a la variable denominada $Signature. Utilice uno de los siguientes comandos dependiendo de la versión IMDS utilizada por la instancia.

    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 el documento de identidad de instancia de texto sin formato de los metadatos de instancia, conviértalo en una matriz de bytes y agréguelo a una variable denominada $Document. Utilice uno de los siguientes comandos dependiendo de la versión IMDS utilizada por la instancia.

    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. Busque el certificado público RSA para su región en Certificados públicos de AWS para las firmas del documento de identidad de la instancia y agregue el contenido a un archivo nuevo denominado certificate.pem.

  5. Verifique el documento de identidad de la instancia.

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

    Si la firma es válida, el comando devuelve True. Si no se puede verificar la firma, póngase en contacto con AWS Support.

Opción 3: verificar el documento de identidad de instancia mediante la firma RSA-2048

En este tema, se explica cómo verificar el documento de identidad de la instancia mediante la firma RSA-2048 y el certificado público RSA-2048 de AWS.

Para verificar el documento de identidad de la instancia mediante la firma RSA-2048 y el certificado público RSA-2048 de AWS
  1. Conéctese a la instancia.

  2. Recupere la firma RSA-2048 de los metadatos de la instancia y agréguela a un archivo denominado rsa2048 junto con el encabezado y el pie de página requeridos. Utilice uno de los siguientes comandos dependiendo de la versión IMDS utilizada por la instancia.

    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. Busque el certificado público RSA-2048 para su región en Certificados públicos de AWS para las firmas del documento de identidad de la instancia y agregue el contenido a un archivo nuevo denominado certificate.

  4. Utilice el comando openSSL smime para verificar la firma. Incluya la opción -verify para indicar que es necesario verificar la firma, y la opción -noverify para indicar que no es necesario verificar el certificado.

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

    Si la firma es válida, aparecerá el mensaje Verification successful. Si no se puede verificar la firma, póngase en contacto con AWS Support.

Requisitos previos

Este procedimiento requiere la clase Microsoft .NET Core de System.Security. Para agregar la clase a la sesión de PowerShell, ejecute el siguiente comando.

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

El comando agrega la clase solo a la sesión actual de PowerShell. Si inicia una nueva sesión, debe ejecutar el comando de nuevo.

Para verificar el documento de identidad de la instancia mediante la firma RSA-2048 y el certificado público RSA-2048 de AWS
  1. Conéctese a la instancia.

  2. Recupere la firma RSA-2048 de los metadatos de instancia, conviértala en una matriz de bytes y agréguela a una variable denominada $Signature. Utilice uno de los siguientes comandos dependiendo de la versión IMDS utilizada por la instancia.

    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 el documento de identidad de instancia de texto sin formato de los metadatos de instancia, conviértalo en una matriz de bytes y agréguelo a una variable denominada $Document. Utilice uno de los siguientes comandos dependiendo de la versión IMDS utilizada por la instancia.

    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. Busque el certificado público RSA-2048 para su región en Certificados públicos de AWS para las firmas del documento de identidad de la instancia y agregue el contenido a un archivo nuevo denominado certificate.pem.

  5. Extraiga el certificado del archivo de certificado y guárdelo en una variable denominada $Store.

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

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

    Si la firma es válida, el comando no devuelve ningún resultado. Si no se puede verificar la firma, el comando devuelve Exception calling "CheckSignature" with "2" argument(s): "Cannot find the original signer. Si su firma no se puede verificar, póngase en contacto con AWS Support.

  7. Valide el contenido del documento de identidad de instancia.

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

    Si el contenido del documento de identidad de instancia es válido, el comando devuelve True. Si el documento de identidad de la instancia no se puede validar, póngase en contacto con AWS Support.