Creación y aprovisionamiento de dispositivos IoT Edge a gran escala con un TPM en Linux

Se aplica a:yes icon IoT Edge 1.1 Otras versiones:IoT Edge 1.2

Se aplica a:yes icon IoT Edge 1.2 Otras versiones:IoT Edge 1.1

En este artículo se proporcionan instrucciones para aprovisionar automáticamente un dispositivo Azure IoT Edge para Linux mediante un Módulo de plataforma segura (TPM). Puede aprovisionar de forma automática los dispositivos Azure IoT Edge con el servicio de aprovisionamiento de dispositivos de Azure IoT Hub. Si no está familiarizado con el proceso de aprovisionamiento automático, revise la información general sobre el aprovisionamiento antes de continuar.

En este artículo, se describen dos metodologías. Seleccione sus preferencias en función de la arquitectura de la solución:

  • Aprovisionamiento automático de un dispositivo Linux con hardware de TPM físico. Un ejemplo es el dispositivo Infineon OPTIGA TPM SLB 9670.
  • Aprovisionamiento automático de una máquina virtual (VM) Linux con un TPM simulado que se ejecuta en una máquina Windows de desarrollo con Hyper-V habilitado. Se recomienda usar esta metodología solo como escenario de prueba. Un TPM simulado no ofrece la misma seguridad que un TPM físico.

Las instrucciones difieren en función de la metodología, por lo que debe asegurarse de que se encuentra en la pestaña correcta para continuar.

Las tareas son las siguientes:

  1. Recuperar la información de aprovisionamiento del TPM.
  2. Crear una inscripción individual para el dispositivo en una instancia del servicio de aprovisionamiento de dispositivos de IoT Hub.
  3. Instalar el entorno de ejecución de IoT Edge y conectar el dispositivo al centro de IoT.

Requisitos previos

Recursos en la nube

Requisitos de los dispositivos

Un dispositivo Linux físico para que sea el dispositivo IoT Edge físico.

Nota

TPM 2.0 es necesario cuando se usa la atestación de TPM con el servicio de aprovisionamiento de dispositivos.

Solo puede crear inscripciones individuales, no de grupo, del servicio de aprovisionamiento de dispositivos cuando se usa un TPM.

Configuración del dispositivo

Si usa un dispositivo físico Linux con un TPM, no hay ningún paso adicional para configurar el dispositivo.

Está listo para continuar.

Recuperación de la información de aprovisionamiento del TPM

En esta sección, se crea una herramienta que podrá utilizar para recuperar el identificador de registro y la clave de aprobación del TPM.

  1. Inicie sesión en el dispositivo y luego siga los pasos de Configuración de un entorno de desarrollo con Linux para instalar y compilar el SDK de dispositivo IoT de Azure para C.

  2. Ejecute los comandos siguientes para compilar la herramienta del SDK que recupera la información de aprovisionamiento de dispositivos desde el 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. En la ventana de salida se muestra el Id. de registro y la Clave de aprobación. Copie estos valores; los usará más adelante cuando cree una inscripción individual para el dispositivo en el servicio de aprovisionamiento de dispositivos.

Sugerencia

Si no quiere usar la herramienta SDK para recuperar la información, debe encontrar otra manera de obtener la información de aprovisionamiento. La clave de aprobación, que es única para cada chip de TPM, se obtiene del fabricante del chip de TPM asociado a ella. Puede derivar un identificador de registro único para el dispositivo TPM. Por ejemplo, puede crear un hash SHA-256 de la clave de aprobación.

Una vez que tenga el identificador de registro y la clave de aprobación, estará listo para continuar.

Creación de una inscripción del servicio de aprovisionamiento de dispositivos

Use la información de aprovisionamiento del TPM para crear una inscripción individual en servicio de aprovisionamiento de dispositivos.

Al crear una inscripción en el servicio de aprovisionamiento de dispositivos, tiene la oportunidad de declarar un estado inicial de dispositivo gemelo. En el dispositivo gemelo, puede establecer etiquetas para agrupar dispositivos por cualquier métrica utilizada en la solución, como la región, el entorno, la ubicación o el tipo de dispositivo. Estas etiquetas se usan para crear implementaciones automáticas.

Sugerencia

Los pasos de este artículo son para Azure Portal, pero también puede crear inscripciones individuales mediante la CLI de Azure. Para más información, consulte az iot dps enrollment. Como parte del comando de la CLI, use la marca edge-enabled para especificar que la inscripción es para un dispositivo de IoT Edge.

  1. En Azure Portal, vaya a la instancia del servicio de aprovisionamiento de dispositivos de IoT Hub.

  2. En Configuración, seleccione Administrar inscripciones.

  3. Seleccione Agregar inscripción individual y, después, complete los pasos siguientes para configurar la inscripción:

    1. En Mecanismo, seleccione TPM.

    2. Proporcione la clave de aprobación y el identificador de registro que ha copiado de la máquina virtual o el dispositivo físico.

    3. Si quiere, proporcione un identificador para el dispositivo. Si no proporciona un id. de dispositivo, se usará el id. de registro.

    4. Seleccione Verdadero para declarar que esta máquina virtual o el dispositivo físico es un dispositivo IoT Edge.

    5. Elija el centro de IoT vinculado al que quiere conectar el dispositivo o seleccione Link to new IoT Hub (Vincular a un nuevo centro de IoT). Puede elegir varios centros y el dispositivo se asignará a uno de ellos según la directiva de asignación seleccionada.

    6. Si quiere, agregue un valor de etiqueta a Estado inicial de dispositivo gemelo. Puede usar etiquetas para los grupos de dispositivos de destino para la implementación del módulo. Para más información, consulte Implementación de módulos IoT Edge a escala.

    7. Seleccione Guardar.

Ahora que existe una inscripción para este dispositivo, el entorno de ejecución de Azure IoT Edge puede aprovisionar automáticamente el dispositivo durante la instalación.

Instalación de IoT Edge

En esta sección, preparará la máquina virtual Linux o el dispositivo físico para IoT Edge. A continuación, instalará IoT Edge.

Tendrá que completar dos pasos en el dispositivo antes de que esté listo para instalar el entorno de ejecución de IoT Edge. El dispositivo necesita acceso a los paquetes de instalación de Microsoft y requiere la instalación de un motor de contenedor.

Acceso a los paquetes de instalación de Microsoft

  1. Descargue el paquete de configuración del repositorio que coincida con el sistema operativo del dispositivo.

    • Ubuntu Server 18.04:

      curl https://packages.microsoft.com/config/ubuntu/18.04/multiarch/prod.list > ./microsoft-prod.list
      
    • Raspberry Pi OS Stretch:

      curl https://packages.microsoft.com/config/debian/stretch/multiarch/prod.list > ./microsoft-prod.list
      
  2. Copie la lista generada en el directorio sources.list.d.

    sudo cp ./microsoft-prod.list /etc/apt/sources.list.d/
    
  3. Instale la clave pública de GPG de Microsoft.

    curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
    sudo cp ./microsoft.gpg /etc/apt/trusted.gpg.d/
    

Nota

Los paquetes de software de Azure IoT Edge están sujetos a los términos de licencia que se encuentran cada paquete (usr/share/doc/{package-name} o el directorio LICENSE). Lea los términos de licencia antes de usar el paquete. La instalación y el uso de un paquete constituyen la aceptación de estos términos. Si no acepta los términos de licencia, no utilice ese paquete.

Instalación de un motor del contenedor

Azure IoT Edge utiliza un runtime de contenedor compatible con OCI. En los escenarios de producción, se recomienda utilizar el motor de Moby. El motor de Moby es el único motor de contenedor compatible oficialmente con IoT Edge. Las imágenes de contenedor de Docker CE/EE son totalmente compatibles con el entorno de ejecución de Moby.

  1. Actualice las listas de paquetes en el dispositivo.

    sudo apt-get update
    
  2. Instale el motor de Moby.

    sudo apt-get install moby-engine
    

    Sugerencia

    Si se producen errores al instalar el motor del contenedor Moby, compruebe la compatibilidad con Moby del kernel de Linux. Algunos fabricantes de dispositivos incrustados distribuyen imágenes de dispositivos que contienen kernels de Linux personalizados sin las características necesarias para la compatibilidad del motor del contenedor. Ejecute el siguiente comando, que usa el script check-config suministrado por Moby, para comprobar la configuración del 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
    

    En la salida del script, compruebe que todos los elementos que figuran en Generally Necessary y Network Drivers estén habilitados. Si faltan características, puede habilitarlas si vuelve a generar el kernel a partir del origen y selecciona los módulos asociados para incluirlos en el archivo .config de kernel adecuado. Igualmente, si usa un generador de configuración de kernel como defconfig o menuconfig, busque y habilite las características correspondientes y vuelva a generar el kernel como corresponda. Una vez que implemente el kernel recién modificado, vuelva a ejecutar el script check-config para comprobar que se han habilitado correctamente todas las características necesarias.

Instalación del entorno de ejecución de IoT Edge

El demonio de seguridad de IoT Edge proporciona y mantiene los estándares de seguridad en el dispositivo IoT Edge. El demonio se inicia en cada arranque e inicia el resto del entorno de ejecución de IoT Edge para arrancar el dispositivo.

Los pasos de esta sección representan el proceso habitual para instalar la versión más reciente en un dispositivo que tenga conexión a Internet. Si tiene que instalar una versión específica, como una versión preliminar, o tiene que realizar la instalación mientras está sin conexión, siga los pasos de Instalación sin conexión o de una versión específica, más adelante en este artículo.

Actualice las listas de paquetes en el dispositivo.

sudo apt-get update

Instale IoT Edge versión 1.1.* junto con el paquete libiothsm-std:

sudo apt-get install iotedge

Nota

IoT Edge versión 1.1 es la rama de soporte técnico a largo plazo de IoT Edge. Si ejecuta una versión anterior, se recomienda instalar o actualizar a la revisión más reciente, ya que ya no se admiten las versiones anteriores.

El servicio IoT Edge proporciona y mantiene los estándares de seguridad en el dispositivo IoT Edge. El servicio se inicia en cada arranque e inicia el resto del entorno de ejecución de IoT Edge para arrancar el dispositivo.

El servicio de identidad de IoT se introdujo junto con la versión 1.2 de IoT Edge. Este servicio controla el aprovisionamiento y la administración de identidades para IoT Edge y otros componentes de dispositivo que necesitan comunicarse con IoT Hub.

Los pasos de esta sección representan el proceso habitual para instalar la versión más reciente en un dispositivo que tenga conexión a Internet. Si tiene que instalar una versión específica, como una versión preliminar, o tiene que realizar la instalación mientras está sin conexión, siga los pasos de Instalación sin conexión o de una versión específica, más adelante en este artículo.

Nota

Los pasos de esta sección le muestran cómo instalar la versión 1.2 de IoT Edge.

Si ya tiene un dispositivo IoT Edge que ejecuta una versión anterior y desea actualizar a 1.2, siga los pasos descritos en Actualización del demonio de seguridad de IoT Edge y el entorno de ejecución. La versión 1.2 es suficientemente diferente de las versiones anteriores de IoT Edge para que sean necesarios pasos específicos para la actualización.

Actualice las listas de paquetes en el dispositivo.

sudo apt-get update

Compruebe qué versiones de IoT Edge y el servicio de identidad de IoT están disponibles.

apt list -a aziot-edge aziot-identity-service

Para instalar la versión más reciente de IoT Edge y el paquete de servicio de identidad de IoT, use el comando siguiente:

sudo apt-get install aziot-edge

Aprovisionamiento del dispositivo con su identidad de nube

Una vez que el entorno de ejecución está instalado en el dispositivo, configure el dispositivo con la información que usa para conectarse al servicio de aprovisionamiento de dispositivos y a IoT Hub.

  1. Tome el Ámbito de identificador del servicio de aprovisionamiento de dispositivos y el Identificador de registro del dispositivo que se han recopilado antes.

  2. Abra el archivo de configuración en el dispositivo IoT Edge.

    sudo nano /etc/iotedge/config.yaml
    
  3. Busque la sección de configuración de aprovisionamiento del archivo. Quite las marcas de comentario del aprovisionamiento TPM y asegúrese de que cualquier otra línea de aprovisionamiento esté comentada.

    La línea provisioning: no debe ir precedida por espacios en blanco y se debe aplicar una sangría de dos espacios a los elementos anidados.

    # 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. Actualice los valores de scope_id y registration_id con la información del servicio de aprovisionamiento de dispositivos y del dispositivo. El valor scope_id es el scope_id de la página de información general de la instancia del servicio de aprovisionamiento de dispositivos.

  5. También puede usar las líneas always_reprovision_on_startup o dynamic_reprovisioning para configurar el comportamiento de reaprovisionamiento del dispositivo. Si un dispositivo se establece para que se vuelva a aprovisionar en el inicio, siempre se intentará aprovisionar primero con el servicio de aprovisionamiento de dispositivos y, después, revertir a la copia de seguridad de aprovisionamiento si se produce un error. Si un dispositivo se establece para que se vuelva a aprovisionar dinámicamente por sí mismo, IoT Edge se reiniciará y volverá a aprovisionar si se detecta un evento de reaprovisionamiento. Para más información, consulte Conceptos sobre el reaprovisionamiento de dispositivos de IoT Hub.

  6. Guarde y cierre el archivo.

  1. Tome el Ámbito de identificador del servicio de aprovisionamiento de dispositivos y el Identificador de registro del dispositivo que se han recopilado antes.

  2. Cree un archivo de configuración para el dispositivo en función de un archivo de plantilla que se proporciona como parte de la instalación de IoT Edge.

    sudo cp /etc/aziot/config.toml.edge.template /etc/aziot/config.toml
    
  3. Abra el archivo de configuración en el dispositivo IoT Edge.

    sudo nano /etc/aziot/config.toml
    
  4. Busque la sección de configuraciones de aprovisionamiento del archivo. Quite las marcas de comentario del aprovisionamiento TPM y asegúrese de que cualquier otra línea de aprovisionamiento esté comentada.

    # 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"
    
  5. Actualice los valores de id_scope y registration_id con la información del servicio de aprovisionamiento de dispositivos y del dispositivo. El valor scope_id es el scope_id de la página de información general de la instancia del servicio de aprovisionamiento de dispositivos.

  6. Opcionalmente, busque la sección del modo de reaprovisionamiento automático del archivo. Use el parámetro auto_reprovisioning_mode para configurar el comportamiento de reaprovisionamiento del dispositivo en Dynamic, AlwaysOnStartup o OnErrorOnly. Para más información, consulte Conceptos sobre el reaprovisionamiento de dispositivos de IoT Hub.

  7. Guarde y cierre el archivo.

Conceder acceso a IoT Edge en el TPM

Para que el entorno de ejecución de IoT Edge aprovisione automáticamente el dispositivo, necesita acceso al TPM.

Puede conceder acceso TPM al entorno de ejecución de Azure IoT Edge mediante la invalidación de la configuración de systemd para que el servicio iotedge tenga privilegios raíz. Si no desea elevar los privilegios de servicio, también puede usar los pasos siguientes para proporcionar manualmente el acceso TPM.

  1. Cree una regla que conceda al entorno de ejecución de IoT Edge acceso a tpm0 y tpmrm0.

    sudo touch /etc/udev/rules.d/tpmaccess.rules
    
  2. Abra el archivo de reglas.

    sudo nano /etc/udev/rules.d/tpmaccess.rules
    
  3. Copie la siguiente información de acceso en el archivo de reglas. Es posible que tpmrm0 no esté presente en los dispositivos que usan un kernel anterior a 4.12. Los dispositivos que no tengan tpmrm0 omitirán esa regla de forma segura.

    # allow iotedge access to tpm0
    KERNEL=="tpm0", SUBSYSTEM=="tpm", OWNER="iotedge", MODE="0600"
    KERNEL=="tpmrm0", SUBSYSTEM=="tpmrm", OWNER="iotedge", MODE="0600"
    
  4. Guarde y cierre el archivo.

  5. Desencadene el sistema udev para evaluar la nueva regla.

    /bin/udevadm trigger --subsystem-match=tpm --subsystem-match=tpmrm
    
  6. Compruebe que la regla se haya aplicado correctamente.

    ls -l /dev/tpm*
    

    Una salida correcta tiene el siguiente aspecto:

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

    Si no ve que se hayan aplicado los permisos correctos, intente reiniciar la máquina para actualizar udev.

  7. Reinicie el entorno de ejecución de IoT Edge para que aplique todos los cambios de configuración realizados en el dispositivo.

    sudo systemctl restart iotedge
    

El entorno de ejecución de IoT Edge se basa en un servicio TPM que accede mediante agentes al TPM de un dispositivo. Para que este servicio aprovisione automáticamente el dispositivo, necesita acceso al TPM.

Puede conceder acceso al TPM mediante la invalidación de la configuración de systemd para que el servicio aziottpm tenga privilegios raíz. Si no desea elevar los privilegios de servicio, también puede usar los pasos siguientes para proporcionar manualmente el acceso TPM.

  1. Cree una regla que conceda al entorno de ejecución de IoT Edge acceso a tpm0 y tpmrm0.

    sudo touch /etc/udev/rules.d/tpmaccess.rules
    
  2. Abra el archivo de reglas.

    sudo nano /etc/udev/rules.d/tpmaccess.rules
    
  3. Copie la siguiente información de acceso en el archivo de reglas. Es posible que tpmrm0 no esté presente en los dispositivos que usan un kernel anterior a 4.12. Los dispositivos que no tengan tpmrm0 omitirán esa regla de forma segura.

    # allow aziottpm access to tpm0 and tpmrm0
    KERNEL=="tpm0", SUBSYSTEM=="tpm", OWNER="aziottpm", MODE="0660"
    KERNEL=="tpmrm0", SUBSYSTEM=="tpmrm", OWNER="aziottpm", MODE="0660"
    
  4. Guarde y cierre el archivo.

  5. Desencadene el sistema udev para evaluar la nueva regla.

    /bin/udevadm trigger --subsystem-match=tpm --subsystem-match=tpmrm
    
  6. Compruebe que la regla se haya aplicado correctamente.

    ls -l /dev/tpm*
    

    Una salida correcta tiene el siguiente aspecto:

    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
    

    Si no ve que se hayan aplicado los permisos correctos, intente reiniciar la máquina para actualizar udev.

  7. Aplique los cambios de configuración realizados en el dispositivo.

    sudo iotedge config apply
    

Comprobación de instalación correcta

Si todavía no la hecho, reinicie el entorno de ejecución de IoT Edge para que aplique todos los cambios de configuración realizados en el dispositivo.

sudo systemctl restart iotedge

Compruebe que el entorno de ejecución de IoT Edge esté en ejecución.

sudo systemctl status iotedge

Examine los registros del daemon.

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

Si ve errores de aprovisionamiento, es posible que los cambios de configuración no hayan surtido efecto todavía. Pruebe a reiniciar de nuevo el demonio de IoT Edge.

sudo systemctl daemon-reload

O bien, pruebe a reiniciar la máquina virtual para ver si los cambios surten efecto con un inicio nuevo.

Si todavía no lo ha hecho, aplique los cambios de configuración realizados en el dispositivo.

sudo iotedge config apply

Compruebe que el entorno de ejecución de IoT Edge esté en ejecución.

sudo iotedge system status

Examine los registros del daemon.

sudo iotedge system logs

Si ve errores de aprovisionamiento, es posible que los cambios de configuración no hayan surtido efecto todavía. Pruebe a reiniciar el demonio de IoT Edge.

sudo systemctl daemon-reload

O bien, pruebe a reiniciar la máquina virtual para ver si los cambios surten efecto con un inicio nuevo.

Si el entorno de ejecución se ha iniciado correctamente, puede entrar en la instancia de IoT Hub y ver que el nuevo dispositivo se aprovisionado automáticamente. Ahora el dispositivo está listo para ejecutar módulos de IoT Edge.

Enumere los módulos en ejecución.

iotedge list

Puede comprobar que se ha utilizado la inscripción individual que ha creado en el servicio de aprovisionamiento de dispositivos. En Azure Portal, vaya a la instancia del servicio de aprovisionamiento de dispositivos. Abra los detalles de la inscripción para la inscripción individual que ha creado. Tenga en cuenta que el estado de la inscripción está asignado y se muestra el id. de dispositivo.

Pasos siguientes

El proceso de inscripción en Device Provisioning Service permite establecer el id. de dispositivo y las etiquetas del dispositivo gemelo al mismo tiempo que se aprovisiona el nuevo dispositivo. Puede usar esos valores para dirigirse a dispositivos individuales o grupos de dispositivos mediante la administración automática de dispositivos.

Aprenda a implementar y supervisar los módulos de IoT Edge a gran escala mediante Azure Portal o la CLI de Azure.