Detectar se um host é uma instância do EC2 - Amazon Elastic Compute Cloud

Detectar se um host é uma instância do EC2

Talvez seja necessário determinar se a aplicação ou o site está sendo executado em uma instância do EC2, especialmente se você tiver um ambiente de computação misto. Você pode usar uma das opções a seguir para determinar se o host da aplicação ou do site é uma instância do EC2.

Inspecione o documento de identidade da instância

Cada instância tem um documento de identidade de instância assinado que você pode verificar criptograficamente. Você pode encontrar esses documentos usando o serviço de metadados de instância (IMDS).

Para ter mais informações, consulte Documentos de identidade da instância.

Inspecione o UUID do sistema

Você pode obter o UUID do sistema e procurar no octeto inicial do UUID por EC2 (no Linux, pode ser ec2 em letras minúsculas). Esse método é rápido, mas potencialmente impreciso, pois há uma pequena possibilidade de que um sistema que não seja uma instância do EC2 possa ter um UUID que comece com esses caracteres. Além disso, algumas versões do SMBIOS usam o formato little-endian, que não inclui EC2 no início do UUID. Esse pode ser o caso de instâncias do EC2 que usam o SMBIOS 2.4 para Windows ou para distribuições do Linux diferentes do Amazon Linux que têm as próprias implementações de SMBIOS.

Exemplo do Linux: obtenha o UUID da DMI (somente para AMIs de HVM)

Use o seguinte comando para obter o UUID usando a Desktop Management Interface (DMI):

[ec2-user ~]$ sudo dmidecode --string system-uuid

Na próxima saída de exemplo, o UUID começa com "EC2", que indica que o sistema é provavelmente uma instância do EC2.

EC2E1916-9099-7CAF-FD21-012345ABCDEF

No exemplo de saída a seguir, o UUID é representado no formato little-endian.

45E12AEC-DCD1-B213-94ED-012345ABCDEF

Como alternativa, para instâncias criadas no sistema Nitro, é possível usar o seguinte comando:

[ec2-user ~]$ cat /sys/devices/virtual/dmi/id/board_asset_tag

Se a saída for um ID de instância, como a saída de exemplo a seguir, o sistema será uma instância do EC2:

i-0af01c0123456789a
Exemplo do Linux: obtenha o UUID do hipervisor (somente para AMIs PV)

Use o seguinte comando para obter o UUID do hipervisor:

[ec2-user ~]$ cat /sys/hypervisor/uuid

Na próxima saída de exemplo, o UUID começa com "ec2", que indica que o sistema é provavelmente uma instância do EC2.

ec2e1916-9099-7caf-fd21-012345abcdef
Exemplo do Windows: obtenha o UUID usando o WMI ou o Windows PowerShell

Use a linha de comando de Instrumentação de Gerenciamento do Windows (WMIC) da seguinte forma:

wmic path win32_computersystemproduct get uuid

Alternativamente, se você estiver usando o Windows PowerShell, use o cmdlet Get-WmiObject da seguinte maneira:

PS C:\> Get-WmiObject -query "select uuid from Win32_ComputerSystemProduct" | Select UUID

Na próxima saída de exemplo, o UUID começa com "EC2", que indica que o sistema é provavelmente uma instância do EC2.

EC2AE145-D1DC-13B2-94ED-012345ABCDEF

Para instâncias que usam o SMBIOS 2.4, o UUID pode ser representado no formato little-endian; por exemplo:

45E12AEC-DCD1-B213-94ED-012345ABCDEF

Inspecione o identificador de geração da máquina virtual do sistema

Um identificador de geração de máquina virtual consiste em um buffer exclusivo de 128 bits interpretado como identificador de inteiro aleatório criptográfico. É possível recuperar o identificador de geração de máquina virtual para identificar sua instância do Amazon Elastic Compute Cloud. O identificador de geração é exposto no sistema operacional convidado da instância por meio de uma entrada de tabela ACPI. O valor mudará se sua máquina for clonada, copiada ou importada para AWS, como com VM Import/Export.

Exemplo: como recuperar o identificador de geração de máquina virtual do Linux

É possível usar os seguintes comandos para recuperar o identificador de geração de máquina virtual de suas instâncias que executem o Linux:

Amazon Linux 2
  1. Atualize seus pacotes de software existentes, conforme necessário, usando o seguinte comando:

    sudo yum update
  2. Se necessário, utilize o pacote busybox com o seguinte comando:

    sudo curl https://www.rpmfind.net/linux/epel/next/8/Everything/x86_64/Packages/b/busybox-1.35.0-2.el8.next.x86_64.rpm --output busybox.rpm
  3. Se necessário, instale os pacotes de pré-requisitos usando o seguinte comando:

    sudo yum install busybox.rpm iasl -y
  4. Execute o seguinte iasl para produzir saída da tabela ACPI:

    sudo iasl -p ./SSDT2 -d /sys/firmware/acpi/tables/SSDT2
  5. Execute o seguinte comando para revisar a saída do comando iasl:

    cat SSDT2.dsl

    A saída deve gerar o espaço de endereço necessário para recuperar o identificador de geração da máquina virtual:

    Intel ACPI Component Architecture ASL+ Optimizing Compiler/Disassembler version 20190509 Copyright (c) 2000 - 2019 Intel Corporation File appears to be binary: found 32 non-ASCII characters, disassembling Binary file appears to be a valid ACPI table, disassembling Input file /sys/firmware/acpi/tables/SSDT2, Length 0x7B (123) bytes ACPI: SSDT 0x0000000000000000 00007B (v01 AMAZON AMZNSSDT 00000001 AMZN 00000001) Pass 1 parse of [SSDT] Pass 2 parse of [SSDT] Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions) Parsing completed Disassembly completed ASL Output: ./SSDT2.dsl - 1065 bytes $ /* * Intel ACPI Component Architecture * AML/ASL+ Disassembler version 20190509 (64-bit version) * Copyright (c) 2000 - 2019 Intel Corporation * * Disassembling to symbolic ASL+ operators * * Disassembly of /sys/firmware/acpi/tables/SSDT2, Tue Mar 29 16:15:14 2022 * * Original Table Header: * Signature "SSDT" * Length 0x0000007B (123) * Revision 0x01 * Checksum 0xB8 * OEM ID "AMAZON" * OEM Table ID "AMZNSSDT" * OEM Revision 0x00000001 (1) * Compiler ID "AMZN" * Compiler Version 0x00000001 (1) */ DefinitionBlock ("", "SSDT", 1, "AMAZON", "AMZNSSDT", 0x00000001) { Scope (\_SB) { Device (VMGN) { Name (_CID, "VM_Gen_Counter") // _CID: Compatible ID Name (_DDN, "VM_Gen_Counter") // _DDN: DOS Device Name Name (_HID, "AMZN0000") // _HID: Hardware ID Name (ADDR, Package (0x02) { 0xFED01000, Zero }) } } }
  6. (Opcional) Eleve suas permissões de terminal para as etapas restantes com o seguinte comando:

    sudo -s
  7. Use o comando a seguir para armazenar o espaço de endereço coletado anteriormente:

    VMGN_ADDR=0xFED01000
  8. Use o seguinte comando para iterar pelo espaço de endereço e criar o identificador de geração de máquina virtual:

    for offset in 0x0 0x4 0x8 0xc; do busybox devmem $(($VMGN_ADDR + $offset)) | sed 's/0x//' | sed -z '$ s/\n$//' >> vmgenid; done
  9. Recupere o identificador de geração da máquina virtual do arquivo de saída com o seguinte comando:

    cat vmgenid ; echo

    Sua saída deve ser similar à seguinte:

    EC2F335D979132C4165896753E72BD1C
Ubuntu
  1. Atualize seus pacotes de software existentes, conforme necessário, usando o seguinte comando:

    sudo apt update
  2. Se necessário, instale os pacotes de pré-requisitos usando o seguinte comando:

    sudo apt install busybox iasl -y
  3. Execute o seguinte iasl para produzir saída da tabela ACPI:

    sudo iasl -p ./SSDT2 -d /sys/firmware/acpi/tables/SSDT2
  4. Execute o seguinte comando para revisar a saída do comando iasl:

    cat SSDT2.dsl

    A saída deve gerar o espaço de endereço necessário para recuperar o identificador de geração da máquina virtual:

    Intel ACPI Component Architecture
    ASL+ Optimizing Compiler/Disassembler version 20190509
    Copyright (c) 2000 - 2019 Intel Corporation
    
    File appears to be binary: found 32 non-ASCII characters, disassembling
    Binary file appears to be a valid ACPI table, disassembling
    Input file /sys/firmware/acpi/tables/SSDT2, Length 0x7B (123) bytes
    ACPI: SSDT 0x0000000000000000 00007B (v01 AMAZON AMZNSSDT 00000001 AMZN 00000001)
    Pass 1 parse of [SSDT]
    Pass 2 parse of [SSDT]
    Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)
    
    Parsing completed
    Disassembly completed
    ASL Output:    ./SSDT2.dsl - 1065 bytes
    $
    /*
    * Intel ACPI Component Architecture
    * AML/ASL+ Disassembler version 20190509 (64-bit version)
    * Copyright (c) 2000 - 2019 Intel Corporation
    *
    * Disassembling to symbolic ASL+ operators
    *
    * Disassembly of /sys/firmware/acpi/tables/SSDT2, Tue Mar 29 16:15:14 2022
    *
    * Original Table Header:
    *     Signature        "SSDT"
    *     Length           0x0000007B (123)
    *     Revision         0x01
    *     Checksum         0xB8
    *     OEM ID           "AMAZON"
    *     OEM Table ID     "AMZNSSDT"
    *     OEM Revision     0x00000001 (1)
    *     Compiler ID      "AMZN"
    *     Compiler Version 0x00000001 (1)
    */
    DefinitionBlock ("", "SSDT", 1, "AMAZON", "AMZNSSDT", 0x00000001)
    {
    Scope (\_SB)
    {
        Device (VMGN)
        {
            Name (_CID, "VM_Gen_Counter")  // _CID: Compatible ID
            Name (_DDN, "VM_Gen_Counter")  // _DDN: DOS Device Name
            Name (_HID, "AMZN0000")  // _HID: Hardware ID
            Name (ADDR, Package (0x02)
            {
                0xFED01000,
                Zero
            })
        }
    }
    }
  5. (Opcional) Eleve suas permissões de terminal para as etapas restantes com o seguinte comando:

    sudo -s
  6. Use os seguintes comandos para armazenar o espaço de endereço coletado anteriormente:

    VMGN_ADDR=0xFED01000
  7. Use o seguinte comando para iterar pelo espaço de endereço e criar o identificador de geração de máquina virtual:

    for offset in 0x0 0x4 0x8 0xc; do busybox devmem $(($VMGN_ADDR + $offset)) | sed 's/0x//' | sed -z '$ s/\n$//' >> vmgenid; done
  8. Recupere o identificador de geração da máquina virtual do arquivo de saída com o seguinte comando:

    cat vmgenid ; echo

    Sua saída deve ser similar à seguinte:

    EC2F335D979132C4165896753E72BD1C
Exemplo: como recuperar o identificador de geração de máquina virtual do Windows

É possível criar uma aplicação de exemplo para recuperar o identificador de geração de máquina virtual de suas instâncias que executam o Windows. Para obter mais informações, consulte Obter o identificador de geração de máquina virtual na documentação da Microsoft.