Criar e provisionar dispositivos do Azure IoT Edge em escala com um TPM no Linux

Aplica-se a:ícone sim IoT Edge 1.1 Outras versões:IoT Edge 1.2, IoT Edge 1.3

Aplica-se a:marca de verificação do IoT Edge 1.2 IoT Edge 1.2 marca de verificação do IoT Edge 1.3 IoT Edge 1.3 Outras versões:IoT Edge 1.1

Este artigo fornece instruções de provisionamento automático de um Azure IoT Edge de dispositivo Linux usando um Trusted Platform Module (TPM). É possível provisionar automaticamente dispositivos do Azure IoT Edge com o Serviço de provisionamento de dispositivos no Hub IoT do Azure. Se você não estiver familiarizado com o processo de provisionamento automático, reveja a visão geral de provisionamento antes de continuar.

Este artigo descreve duas metodologias. Selecione sua preferência com base na arquitetura de sua solução:

  • Provisionar automaticamente um dispositivo Linux com hardware de TPM físico. Um exemplo seria o TPM Infineon OPTIGA™ TPM SLB 9670.
  • Provisionar automaticamente uma VM (máquina virtual) do Linux com um TPM simulado em execução em um computador de desenvolvimento Windows com o Hyper-V habilitado. É recomendável usar essa metodologia apenas como um cenário de teste. Um TPM simulado não oferece a mesma segurança que um TPM físico.

As instruções são diferentes com base na metodologia, portanto, verifique se você está na guia correta no futuro.

As tarefas são as seguintes:

  1. Recuperar informações de provisionamento para o TPM.
  2. Crie um registro individual do dispositivo em uma instância do Serviço de Provisionamento de Dispositivos no Hub IoT do Azure.
  3. Instale o runtime do IoT Edge e conecte o dispositivo ao hub IoT.

Pré-requisitos

Recursos de nuvem

Requisitos do dispositivo

Um dispositivo Linux físico que será o dispositivo de Azure IoT Edge.

Observação

O TPM 2.0 é necessário quando você usa o atestado do TPM com o serviço de provisionamento de dispositivos.

Ao usar um TPM, você só pode criar registros de serviço de provisionamento de dispositivos individuais, não de grupo.

Configurar seu dispositivo

Se você está usando um dispositivo Linux físico com um TPM, não há etapas adicionais para configurá-lo.

Você pode continuar.

Recuperar informações de provisionamento para o TPM

Nesta seção, você criará uma ferramenta que poderá usar para recuperar a ID de registro e a chave de endosso do TPM.

  1. Entre no dispositivo e então siga as etapas em Configurar um ambiente de desenvolvimento do Linux para instalar e criar o SDK do dispositivo IoT do Azure para C.

  2. Execute os comandos a seguir para compilar a ferramenta do SDK que recupera as informações de provisionamento de dispositivos para o TPM.

    cd azure-iot-sdk-c/cmake
    cmake -Duse_prov_client:BOOL=ON ..
    cd provisioning_client/tools/tpm_device_provision
    make
    sudo ./tpm_device_provision
    
  3. A janela de saída exibe a ID de Registro e a Chave de Endosso do dispositivo. Copie esses valores para uso posterior quando criar um registro individual do dispositivo no serviço de provisionamento de dispositivos.

Dica

Se você não quiser usar a ferramenta SDK para recuperar as informações, será necessário encontrar outra maneira de obter as informações de provisionamento. A chave de endosso, que é exclusiva de cada chip do TPM, é obtida por meio do fabricante do chip do TPM associado a ela. É possível derivar uma ID de registro exclusiva para o dispositivo TPM. Por exemplo, é possível criar um hash SHA-256 da chave de endosso.

Depois que tiver a ID de registro e a chave de endosso, você estará pronto para continuar.

Criar um registro de serviço de provisionamento de dispositivos

Use as informações de provisionamento do TPM para criar um registro individual no serviço de provisionamento de dispositivos.

Ao criar um registro no serviço de provisionamento de dispositivos, você tem a oportunidade de declarar um Estado Inicial do Dispositivo Gêmeo. No dispositivo gêmeo, você pode definir marcas para agrupar dispositivos segundo qualquer métrica que precisar em sua solução, como região, ambiente, local ou tipo de dispositivo. Essas marcas são usadas para criar implantações automáticas.

Dica

As etapas neste artigo são para o portal do Microsoft Azure, mas também é possível criar registros individuais usando a CLI do Azure. Para obter mais informações, confira Registro az iot dps. Como parte do comando da CLI, use o sinalizador habilitado para o Edge para especificar que o registro é para um dispositivo do IoT Edge.

  1. No Portal do Azure, navegue até sua instância do Serviço de Provisionamento de Dispositivos no Hub IoT.

  2. Em Configurações, selecione Gerenciar registros.

  3. Selecione Adicionar registro individual e conclua as seguintes etapas para configurar o registro:

    1. Em Mecanismo, selecione TPM.

    2. Forneça a Chave de endosso e a ID de Registro que você copiou da sua VM ou do dispositivo físico.

    3. Forneça uma ID para seu dispositivo se desejar. Se você não fornecer uma ID de dispositivo, a ID de registro será usada.

    4. Selecione True para declarar que a VM ou o dispositivo físico é um dispositivo do IoT Edge.

    5. Escolha o hub IoT vinculado ao qual deseja conectar o dispositivo ou selecione Vincular ao novo Hub IoT. Você pode escolher vários hubs e o dispositivo será atribuído a um deles, de acordo com a política de atribuição selecionada.

    6. Adicione um valor de marca ao estado inicial do dispositivo gêmeo se desejar. Você pode usar marcas para grupos de dispositivos de destino para a implantação do módulo. Para obter mais informações, confira Implantar módulos do IoT Edge em escala.

    7. Selecione Salvar.

Agora que existe um registro para esse dispositivo, o runtime do IoT Edge pode provisionar automaticamente o dispositivo durante a instalação.

Instalar o Edge IoT

Nesta seção, você preparará a VM ou o dispositivo físico Linux para o IoT Edge. Em seguida, você instalará o IoT Edge.

Primeiro, execute os comandos a seguir para adicionar o repositório de pacotes e depois adicione a chave de assinatura de pacote da Microsoft à lista de chaves confiáveis.

A instalação pode ser feita com alguns comandos. Abra um terminal e execute os seguintes comandos:

  • 20.04:

    wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
    sudo dpkg -i packages-microsoft-prod.deb
    rm packages-microsoft-prod.deb
    
  • 18.04:

    wget https://packages.microsoft.com/config/ubuntu/18.04/multiarch/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
    sudo dpkg -i packages-microsoft-prod.deb
    rm packages-microsoft-prod.deb
    

Observação

Os pacotes de software do Azure IoT Edge estão sujeitos aos termos de licença localizados em cada pacote (usr/share/doc/{package-name} ou o diretório LICENSE). Leia os termos da licença antes de usar o pacote. A instalação e o uso do pacote constitui a aceitação desses termos. Se você não concorda com os termos de licença, não utilize o pacote.

Instalar um mecanismo de contêiner

O Azure IoT Edge depende de um runtime de contêiner compatível com OCI. Em cenários de produção, recomendamos o uso do mecanismo Moby. O mecanismo Moby é o único mecanismo de contêiner com suporte oficial do Azure IoT Edge. Imagens de contêiner do docker CE/EE são compatíveis com o runtime Moby.

Instale o mecanismo de Moby.

sudo apt-get update; \
  sudo apt-get install moby-engine

Depois que o mecanismo Moby for instalado com êxito, configure-o para usar o driver de log do local como o mecanismo de registro em log. Para saber mais sobre a configuração de log, confira Lista de verificação de implantação em produção.

  • Crie ou abra o arquivo de configuração do daemon do Docker em /etc/docker/daemon.json.

  • Defina o driver de log padrão para o driver de log local, conforme mostrado no exemplo abaixo.

       {
          "log-driver": "local"
       }
    
  • Reinicie o mecanismo de contêiner para que as alterações entrem em vigor.

    Dica

    Se receber erros ao instalar o mecanismo de contêiner Moby, verifique a compatibilidade de kernel Linux com Moby. Alguns fabricantes de dispositivos inseridos fornecem imagens de dispositivos que contêm kernels Linux personalizados sem os recursos necessários para compatibilidade com mecanismos de contêiner. Execute o seguinte comando, que usa o script check-config fornecido pelo Moby, para verificar a configuração do kernel:

    curl -ssl https://raw.githubusercontent.com/moby/moby/master/contrib/check-config.sh -o check-config.sh
    chmod +x check-config.sh
    ./check-config.sh
    

    Na saída do script, verifique se todos os itens em Generally Necessary e Network Drivers estão habilitados. Se algum recurso estiver faltando, habilite-o recompilando o kernel da fonte e selecionando os módulos associados para inclusão no .config do kernel adequado. De maneira semelhante, se estiver usando um gerador de configuração de kernel como defconfig ou menuconfig, localize e habilite os respectivos recursos e recompile o kernel. Após a implantação do kernel recém-modificado, execute o script check-config novamente para verificar se todos os recursos necessários foram habilitados com êxito.

Instalar o runtime do Azure IoT Edge

O daemon de segurança do IoT Edge fornece e mantém padrões de segurança no dispositivo IoT Edge. O daemon é iniciado a cada inicialização e inicializa o dispositivo iniciando o restante do runtime do IoT Edge.

As etapas nesta seção representam o processo comum para instalar a última versão em um dispositivo conectado à Internet. Se precisar instalar uma versão específica, como uma versão de pré-lançamento, ou precisar instalar enquanto estiver offline, siga as etapas de Instalação offline ou de versão específica mais adiante neste artigo.

Instale a versão 1.1* do IoT Edge juntamente com o pacotelibiothsm-std:

sudo apt-get update; \
  sudo apt-get install iotedge

Observação

A versão 1.1 do IoT Edge é o ramo de suporte de longo prazo do IoT Edge. Se você estiver executando uma versão mais antiga, recomendamos instalar ou atualizar para o patch mais recente, pois não há mais suporte para versões mais antigas.

O serviço do IoT Edge fornece e mantém padrões de segurança no dispositivo IoT Edge. O serviço é iniciado a cada inicialização e inicializa o dispositivo iniciando o restante do runtime do IoT Edge.

A partir da versão 1.2, o serviço de identidade da IoT cuida do provisionamento e gerenciamento de identidades para o IoT Edge e para outros componentes de dispositivo que precisam se comunicar com o Hub IoT.

As etapas nesta seção representam o processo comum para instalar a última versão em um dispositivo conectado à Internet. Se precisar instalar uma versão específica, como uma versão de pré-lançamento, ou precisar instalar enquanto estiver offline, siga as etapas de Instalação offline ou de versão específica mais adiante neste artigo.

Observação

As etapas nesta seção mostram como instalar a versão mais recente do IoT Edge.

Se você já tem um dispositivo IoT Edge executando uma versão mais antiga e quer atualizar para a versão mais recente, siga as etapas em Atualizar o daemon de segurança e o runtime do IoT Edge. As versões posteriores são diferentes o bastante das versões anteriores do IoT Edge para que etapas específicas sejam necessárias para a atualização.

Instale a versão mais recente do IoT Edge e o pacote do serviço de identidade de IoT:

sudo apt-get update; \
  sudo apt-get install aziot-edge defender-iot-micro-agent-edge

O pacote defender-iot-micro-agent-edge inclui o microagente de segurança do Microsoft Defender para IoT que fornece visibilidade do ponto de extremidade sobre gerenciamento de postura de segurança da loT, vulnerabilidades, detecção de ameaças, gerenciamento de frota e muito mais para ajudá-lo a proteger seus dispositivos IoT Edge. É recomendável instalar o micro agente com o agente do Edge para habilitar o monitoramento de segurança e a proteção de seus dispositivos do Edge. Para saber mais sobre o Microsoft Defender para IoT, consulte O que é o Microsoft Defender para IoT para compiladores de dispositivos.

Provisionar o dispositivo com a identidade de nuvem dele

Depois que o runtime for instalado no dispositivo, configure o dispositivo com as informações usadas para se conectar ao serviço de provisionamento de dispositivos e ao Hub IoT do Azure.

  1. Conheça o escopo da ID do serviço de provisionamento de dispositivos e a ID de registro do dispositivo que foram coletados anteriormente.

  2. Abra o arquivo de configuração no dispositivo do IoT Edge.

    sudo nano /etc/iotedge/config.yaml
    
  3. Localize a seção de configuração de provisionamento do arquivo. Remova a marca de comentário das linhas de provisionamento do TPM e verifique se todas as outras linhas de provisionamento estão com a marca de comentário.

    A linha provisioning: não deve ter espaços em branco anteriores e os itens aninhados devem estar recuados em dois espaços.

    # DPS TPM provisioning configuration
    provisioning:
      source: "dps"
      global_endpoint: "https://global.azure-devices-provisioning.net"
      scope_id: "SCOPE_ID_HERE"
      attestation:
        method: "tpm"
        registration_id: "REGISTRATION_ID_HERE"
    
    # always_reprovision_on_startup: true
    # dynamic_reprovisioning: false
    
  4. Atualize os valores de scope_id e registration_id com as informações do dispositivo e do serviço de provisionamento de dispositivos. O valor scope_id é o escopo de ID da página de visão geral da instância do serviço de provisionamento de dispositivos.

  5. Opcionalmente, use as linhas always_reprovision_on_startup ou dynamic_reprovisioning para configurar o comportamento de reprovisionamento do seu dispositivo. Se um dispositivo estiver configurado para reprovisionar na inicialização, ele sempre tentará provisionar com o DPS primeiro e, se falhar, retornará para o backup de provisionamento. Se um dispositivo estiver configurado para se reprovisionar dinamicamente, o IoT Edge (e todos os módulos) reiniciará e reprovisionará se um evento de reprovisionamento for detectado, como se o dispositivo fosse transferido de um Hub IoT para outro. Especificamente, o IoT Edge verifica se há erros bad_credential ou device_disabled do SDK para detectar o evento de reprovisionamento. Para acionar o gatilho desse evento manualmente, desabilite o dispositivo no Hub IoT. Para obter mais informações, confira Conceitos de reprovisionamento de dispositivo do Hub IoT.

  6. Salve e feche o arquivo.

  1. Conheça o escopo da ID do serviço de provisionamento de dispositivos e a ID de registro do dispositivo que foram coletados anteriormente.

  2. Crie um arquivo de configuração no dispositivo com base em um arquivo de modelo fornecido como parte da instalação do Azure IoT Edge.

    sudo cp /etc/aziot/config.toml.edge.template /etc/aziot/config.toml
    
  3. Abra o arquivo de configuração no dispositivo do IoT Edge.

    sudo nano /etc/aziot/config.toml
    
  4. Localize a seção de configurações de provisionamento do arquivo. Remova a marca de comentário das linhas de provisionamento do TPM e verifique se todas as outras linhas de provisionamento estão com a marca de comentário.

    # DPS provisioning with TPM
    [provisioning]
    source = "dps"
    global_endpoint = "https://global.azure-devices-provisioning.net"
    id_scope = "SCOPE_ID_HERE"
    
    [provisioning.attestation]
    method = "tpm"
    registration_id = "REGISTRATION_ID_HERE"
    
    # auto_reprovisioning_mode = Dynamic
    
  5. Atualize os valores de id_scope e registration_id com as informações do dispositivo e do serviço de provisionamento de dispositivos. O valor scope_id é o escopo de ID da página de visão geral da instância do serviço de provisionamento de dispositivos.

  6. Opcionalmente, localize a seção modo de reprovisionamento automático do arquivo. Use o parâmetro auto_reprovisioning_mode para configurar o comportamento de reprovisionamento do seu dispositivo. Dinâmico - Reprovisionar quando o dispositivo detectar que ele pode ter sido movido de um Hub IoT para outro. Esse é o padrão. AlwaysOnStartup – Reprovisionar quando o dispositivo é reinicializado ou uma falha faz com que o daemon seja reiniciado. OnErrorOnly – Nunca dispare o reprovisionamento de dispositivo automaticamente. Cada modo terá um fallback de reprovisionamento de dispositivo implícito se o dispositivo não puder se conectar ao Hub IoT durante o provisionamento de identidade devido a erros de conectividade. Para obter mais informações, confira Conceitos de reprovisionamento de dispositivo do Hub IoT.

  7. Salve e feche o arquivo.

Conceder acesso de IoT Edge no TPM

O runtime do IoT Edge precisa acessar o TPM para provisionar automaticamente o seu dispositivo.

Você pode conceder ao TPM acesso ao runtime do IoT Edge, substituindo as configurações do systemd, de modo que o serviço iotedge tenha privilégios de raiz. Se você não deseja elevar os privilégios de serviço, você também pode usar as etapas a seguir para fornecer manualmente o acesso TPM.

  1. Crie uma nova regra que dará ao runtime do IoT Edge acesso a tpm0 e tpmrm0.

    sudo touch /etc/udev/rules.d/tpmaccess.rules
    
  2. Abra o arquivo de regras.

    sudo nano /etc/udev/rules.d/tpmaccess.rules
    
  3. Copie as seguintes informações de acesso para o arquivo de regras. O tpmrm0 pode não estar presente em dispositivos que usam um kernel anterior a 4.12. Dispositivos que não têm tpmrm0 ignorarão com segurança essa regra.

    # allow iotedge access to tpm0
    KERNEL=="tpm0", SUBSYSTEM=="tpm", OWNER="iotedge", MODE="0600"
    KERNEL=="tpmrm0", SUBSYSTEM=="tpmrm", OWNER="iotedge", MODE="0600"
    
  4. Salve e feche o arquivo.

  5. Dispare o sistema udev para avaliar a nova regra.

    /bin/udevadm trigger --subsystem-match=tpm --subsystem-match=tpmrm
    
  6. Verifique se a regra foi aplicada com êxito.

    ls -l /dev/tpm*
    

    A saída de sucesso é exibida da seguinte maneira:

    crw------- 1 iotedge root 10, 224 Jul 20 16:27 /dev/tpm0
    crw------- 1 iotedge root 10, 224 Jul 20 16:27 /dev/tpmrm0
    

    Se você não vir que as permissões corretas foram aplicadas, tente reinicializar o computador para atualizar udev.

  7. Reinicie o runtime do IoT Edge para que ele pega todas as alterações de configuração feitas no dispositivo.

    sudo systemctl restart iotedge
    

O runtime do IoT Edge depende de um serviço TPM que intermedia o acesso ao TPM de um dispositivo. O serviço precisa acessar o TPM para provisionar automaticamente o seu dispositivo.

Você pode conceder acesso ao TPM, substituindo as configurações do systemd, de modo que o serviço aziottpm tenha privilégios de raiz. Se você não deseja elevar os privilégios de serviço, você também pode usar as etapas a seguir para fornecer manualmente o acesso TPM.

  1. Crie uma nova regra que dará ao runtime do IoT Edge acesso a tpm0 e tpmrm0.

    sudo touch /etc/udev/rules.d/tpmaccess.rules
    
  2. Abra o arquivo de regras.

    sudo nano /etc/udev/rules.d/tpmaccess.rules
    
  3. Copie as seguintes informações de acesso para o arquivo de regras. O tpmrm0 pode não estar presente em dispositivos que usam um kernel anterior a 4.12. Dispositivos que não têm tpmrm0 ignorarão com segurança essa regra.

    # allow aziottpm access to tpm0 and tpmrm0
    KERNEL=="tpm0", SUBSYSTEM=="tpm", OWNER="aziottpm", MODE="0660"
    KERNEL=="tpmrm0", SUBSYSTEM=="tpmrm", OWNER="aziottpm", MODE="0660"
    
  4. Salve e feche o arquivo.

  5. Dispare o sistema udev para avaliar a nova regra.

    /bin/udevadm trigger --subsystem-match=tpm --subsystem-match=tpmrm
    
  6. Verifique se a regra foi aplicada com êxito.

    ls -l /dev/tpm*
    

    A saída de sucesso é exibida da seguinte maneira:

    crw-rw---- 1 root aziottpm 10, 224 Jul 20 16:27 /dev/tpm0
    crw-rw---- 1 root aziottpm 10, 224 Jul 20 16:27 /dev/tpmrm0
    

    Se você não vir que as permissões corretas foram aplicadas, tente reinicializar o computador para atualizar udev.

  7. Aplique as alterações de configuração feitas no dispositivo.

    sudo iotedge config apply
    

Verifique se a instalação bem-sucedida

Se você ainda não fez isso, reinicie o runtime do IoT Edge para que ele escolha todas as alterações de configuração feitas no dispositivo.

sudo systemctl restart iotedge

Verifique se o runtime do IoT Edge está sendo executado.

sudo systemctl status iotedge

Examine os logs do daemon.

journalctl -u iotedge --no-pager --no-full

Se você vê erros de provisionamento, é possível que as alterações de configuração ainda não entraram em vigor. Tente reiniciar o daemon do IoT Edge novamente.

sudo systemctl daemon-reload

Ou tente reiniciar a VM para ver se as alterações entram em vigor em um novo início.

Se você ainda não fez isso, aplique as alterações de configuração feitas no dispositivo.

sudo iotedge config apply

Verifique se o runtime do IoT Edge está sendo executado.

sudo iotedge system status

Examine os logs do daemon.

sudo iotedge system logs

Se você vê erros de provisionamento, é possível que as alterações de configuração ainda não entraram em vigor. Tente reiniciar o daemon do IoT Edge.

sudo systemctl daemon-reload

Ou tente reiniciar a VM para ver se as alterações entram em vigor em um novo início.

Se o runtime foi iniciado com êxito, é possível entrar no hub IoT e ver que o novo dispositivo foi provisionado automaticamente. Agora seu dispositivo está pronto para executar os módulos do IoT Edge.

Módulos de execução da lista.

iotedge list

Você pode verificar se o registro individual criado no serviço de provisionamento de dispositivos foi usado. No portal do Azure, acesse a instância do serviço de provisionamento de dispositivos. Abra os detalhes de registro para o registro individual que você criou. Observe que o status do registro é atribuído e a ID do dispositivo está listada.

Próximas etapas

O processo de registro do serviço de provisionamento de dispositivos permite definir a ID do dispositivo e as marcas do dispositivo gêmeo ao mesmo tempo quando você provisiona o novo dispositivo. Você pode usar esses valores e o gerenciamento automático de dispositivos para direcionar a dispositivos individuais ou grupos de dispositivos.

Saiba como implantar e monitorar os módulos de IoT Edge em escala usando o portal do Azure ou a CLI do Azure.