Tutorial: Preparación de una implementación para un contenedor confidencial en Azure Container Instances

En Azure Container Instances, puede usar contenedores confidenciales en la plataforma sin servidor para ejecutar aplicaciones de contenedor en un entorno de ejecución de confianza (TEE) basado en hardware y atestiguado. Esta funcionalidad puede ayudar a proteger los datos en uso y proporcionar cifrado en memoria a través de paginación anidada segura.

En este tutorial, aprenderá a:

  • Cree una plantilla de Azure Resource Manager (plantilla de ARM) para un grupo de contenedores confidencial.
  • Genere una directiva de cumplimiento de computación confidencial (CCE).
  • Implemente el grupo de contenedores confidenciales en Azure.

Requisitos previos

Para completar este tutorial es preciso cumplir los siguientes requisitos:

  • CLI de Azure: debe tener la versión 2.44.1 de la CLI de Azure o cualquier versión posterior instalada en el equipo local. Para buscar su versión, ejecute az --version. Si necesita instalarla o actualizarla, consulte Instalación de la CLI de Azure.

  • Extensión confcom de la CLI de Azure: debe tener instalada la versión 0.30+ de la extensión confcom de la CLI de Azure para generar directivas de cumplimiento de computación confidencial.

    az extension add -n confcom
    
  • Docker: necesita Docker instalado localmente. Docker dispone de paquetes que configuran el entorno de Docker en macOS, Windows y Linux.

    en este tutorial se supone que el usuario tiene un conocimiento básico de los principales conceptos de Docker, como los contenedores, las imágenes de contenedor y los comandos básicos de docker. Para conocer los principios básicos de Docker y de los contenedores, consulte Introducción a Docker.

Importante

Dado que Azure Cloud Shell no incluye el demonio de Docker, para completar este tutorial es preciso instalar tanto la CLI de Azure como el motor de Docker en el equipo local. Azure Cloud Shell no se puede instalar para este tutorial.

Creación de una plantilla de ARM para un grupo de contenedores de Container Instances

En este tutorial, implementará una aplicación Hola mundo que genera un informe de atestación de hardware. Para empezar, cree una plantilla de ARM con un recurso de grupo de contenedores para definir las propiedades de esta aplicación. Después, use esta plantilla de ARM con las herramientas confcom de la CLI de Azure para generar una directiva de CCE para la atestación.

En este tutorial se usa esta plantilla de ARM como ejemplo. Para ver el código fuente de esta aplicación, consulte Hola mundo de Azure Container Instances confidencial.

La plantilla de ejemplo agrega dos propiedades a la definición de recursos de Container Instances para que el grupo de contenedores sea confidencial:

  • sku: permite seleccionar entre implementaciones de grupos de contenedores confidenciales y estándar. Si no agrega esta propiedad al recurso, el grupo de contenedores será una implementación estándar.
  • confidentialComputeProperties: permite pasar una directiva de CCE personalizada para la atestación del grupo de contenedores. Si no agrega este objeto al recurso, no se validarán los componentes de software que se ejecutan en el grupo de contenedores.

Nota:

El parámetro ccePolicy en confidentialComputeProperties está en blanco. Lo rellenará después de generar la directiva más adelante en el tutorial.

Use el editor de texto que prefiera para guardar esta plantilla de ARM en el equipo local como template.json.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
      "name": {
        "type": "string",
        "defaultValue": "helloworld",
        "metadata": {
          "description": "Name for the container group"
        }
      },
      "location": {
        "type": "string",
        "defaultValue": "North Europe",
        "metadata": {
          "description": "Location for all resources."
        }
      },
      "image": {
        "type": "string",
        "defaultValue": "mcr.microsoft.com/aci/aci-confidential-helloworld:v1",
        "metadata": {
          "description": "Container image to deploy. Should be of the form repoName/imagename:tag for images stored in public Docker Hub, or a fully qualified URI for other registries. Images from private registries require additional registry credentials."
        }
      },
      "port": {
        "type": "int",
        "defaultValue": 80,
        "metadata": {
          "description": "Port to open on the container and the public IP address."
        }
      },
      "cpuCores": {
        "type": "int",
        "defaultValue": 1,
        "metadata": {
          "description": "The number of CPU cores to allocate to the container."
        }
      },
      "memoryInGb": {
        "type": "int",
        "defaultValue": 1,
        "metadata": {
          "description": "The amount of memory to allocate to the container in gigabytes."
        }
      },
      "restartPolicy": {
        "type": "string",
        "defaultValue": "Never",
        "allowedValues": [
          "Always",
          "Never",
          "OnFailure"
        ],
        "metadata": {
          "description": "The behavior of Azure runtime if container has stopped."
        }
      }
    },
    "resources": [
      {
        "type": "Microsoft.ContainerInstance/containerGroups",
        "apiVersion": "2023-05-01",
        "name": "[parameters('name')]",
        "location": "[parameters('location')]",
        "properties": {
          "confidentialComputeProperties": {
            "ccePolicy": ""
          },
          "containers": [
            {
              "name": "[parameters('name')]",
              "properties": {
                "image": "[parameters('image')]",
                "ports": [
                  {
                    "port": "[parameters('port')]",
                    "protocol": "TCP"
                  }
                ],
                "resources": {
                  "requests": {
                    "cpu": "[parameters('cpuCores')]",
                    "memoryInGB": "[parameters('memoryInGb')]"
                  }
                }
              }
            }
          ],
          "sku": "Confidential",
          "osType": "Linux",
          "restartPolicy": "[parameters('restartPolicy')]",
          "ipAddress": {
            "type": "Public",
            "ports": [
              {
                "port": "[parameters('port')]",
                "protocol": "TCP"
              }
            ]
          }
        }
      }
    ],
    "outputs": {
      "containerIPv4Address": {
        "type": "string",
        "value": "[reference(resourceId('Microsoft.ContainerInstance/containerGroups', parameters('name'))).ipAddress.ip]"
      }
    }
  }

Creación de una directiva de CCE personalizada

Con la plantilla de ARM que ha diseñado y la extensión confcom de la CLI de Azure, puede generar una directiva de CCE personalizada. La directiva de CCE se usa para la atestación. La herramienta toma la plantilla de ARM como entrada para generar la directiva. La directiva aplica las imágenes de contenedor específicas, las variables de entorno, los montajes y los comandos, que luego se pueden validar cuando se inicia el grupo de contenedores. Para más información sobre la extensión confcom de la CLI de Azure, consulte la documentación de en GitHub.

  1. Para generar la directiva de CCE, ejecute el siguiente comando con la plantilla de ARM como entrada:

    az confcom acipolicygen -a .\template.json --print-policy
    

    Cuando finalice este comando, una cadena base64 generada como salida debería aparecer en el formato siguiente. Esta cadena es la directiva de CCE que copia y pega en la plantilla de ARM como valor de la propiedad ccePolicy.

    cGFja2FnZSBwb2xpY3kKCmFwaV9zdm4gOj0gIjAuOS4wIgoKaW1wb3J0IGZ1dHVyZS5rZXl3b3Jkcy5ldmVyeQppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCgpmcmFnbWVudHMgOj0gWwpdCgpjb250YWluZXJzIDo9IFsKICAgIHsKICAgICAgICAiY29tbWFuZCI6IFsiL3BhdXNlIl0sCiAgICAgICAgImVudl9ydWxlcyI6IFt7InBhdHRlcm4iOiAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLCAic3RyYXRlZ3kiOiAic3RyaW5nIiwgInJlcXVpcmVkIjogdHJ1ZX0seyJwYXR0ZXJuIjogIlRFUk09eHRlcm0iLCAic3RyYXRlZ3kiOiAic3RyaW5nIiwgInJlcXVpcmVkIjogZmFsc2V9XSwKICAgICAgICAibGF5ZXJzIjogWyIxNmI1MTQwNTdhMDZhZDY2NWY5MmMwMjg2M2FjYTA3NGZkNTk3NmM3NTVkMjZiZmYxNjM2NTI5OTE2OWU4NDE1Il0sCiAgICAgICAgIm1vdW50cyI6IFtdLAogICAgICAgICJleGVjX3Byb2Nlc3NlcyI6IFtdLAogICAgICAgICJzaWduYWxzIjogW10sCiAgICAgICAgImFsbG93X2VsZXZhdGVkIjogZmFsc2UsCiAgICAgICAgIndvcmtpbmdfZGlyIjogIi8iCiAgICB9LApdCmFsbG93X3Byb3BlcnRpZXNfYWNjZXNzIDo9IHRydWUKYWxsb3dfZHVtcF9zdGFja3MgOj0gdHJ1ZQphbGxvd19ydW50aW1lX2xvZ2dpbmcgOj0gdHJ1ZQphbGxvd19lbnZpcm9ubWVudF92YXJpYWJsZV9kcm9wcGluZyA6PSB0cnVlCmFsbG93X3VuZW5jcnlwdGVkX3NjcmF0Y2ggOj0gdHJ1ZQoKCm1vdW50X2RldmljZSA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQp1bm1vdW50X2RldmljZSA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQptb3VudF9vdmVybGF5IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnVubW91bnRfb3ZlcmxheSA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpjcmVhdGVfY29udGFpbmVyIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmV4ZWNfaW5fY29udGFpbmVyIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmV4ZWNfZXh0ZXJuYWwgOj0geyAiYWxsb3dlZCIgOiB0cnVlIH0Kc2h1dGRvd25fY29udGFpbmVyIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnNpZ25hbF9jb250YWluZXJfcHJvY2VzcyA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpwbGFuOV9tb3VudCA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpwbGFuOV91bm1vdW50IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmdldF9wcm9wZXJ0aWVzIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmR1bXBfc3RhY2tzIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnJ1bnRpbWVfbG9nZ2luZyA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpsb2FkX2ZyYWdtZW50IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnNjcmF0Y2hfbW91bnQgOj0geyAiYWxsb3dlZCIgOiB0cnVlIH0Kc2NyYXRjaF91bm1vdW50IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnJlYXNvbiA6PSB7ImVycm9ycyI6IGRhdGEuZnJhbWV3b3JrLmVycm9yc30K
    
  2. Guarde los cambios en la copia local de la plantilla de ARM.

Implementación de la plantilla

En los pasos siguientes, usará Azure Portal para implementar la plantilla. También puede usar Azure PowerShell, la CLI de Azure o la API de REST. Para obtener información sobre otros métodos de implementación, consulte Implementación de plantillas.

  1. Seleccione el botón Implementar en Azure para iniciar sesión en Azure e iniciar una implementación de Container Instances.

    Button to deploy the Resource Manager template to Azure.

  2. Seleccione Cree su propia plantilla en el editor.

    Screenshot of the button for building your own template in the editor.

    El JSON de plantilla que aparece está principalmente en blanco.

  3. Seleccione Cargar archivo y cargue template.json, que ha modificado agregando la directiva de CCE en los pasos anteriores.

    Screenshot of the button for loading a file.

  4. Seleccione Guardar.

  5. Seleccione o escriba los siguientes valores:

    • Suscripción: Seleccione una suscripción de Azure.
    • Grupo de recursos: Seleccione Crear nuevo, escriba un nombre único para el grupo de recursos y seleccione Aceptar.
    • Nombre: acepte el nombre que se genera para la instancia o escriba otro nombre.
    • Ubicación: seleccione una ubicación para el grupo de recursos. Elija una región en la que se admitan contenedores confidenciales. Ejemplo: Norte de Europa.
    • Imagen: acepte el nombre de imagen predeterminado. Esta imagen de Linux de ejemplo muestra una atestación de hardware.

    Acepte los valores predeterminados para las propiedades restantes y, a continuación, seleccione Revisar y crear.

    Screenshot of details for a custom ARM template deployment.

  6. Revise los términos y condiciones. Si está de acuerdo con ellos, seleccione Acepto los términos y condiciones indicados anteriormente.

  7. Espere hasta que aparezca la notificación de Implementación correcta. Confirma que ha creado correctamente la instancia.

    Screenshot of a portal notification for successful deployment.

Revisión de los recursos implementados

En los pasos siguientes, usará Azure Portal para revisar las propiedades de la instancia de contenedor. También puede usar una herramienta como la CLI de Azure.

  1. En Azure Portal, busque Container Instances y seleccione la instancia de contenedor que creó.

  2. En la página de información general, observe el valor del campo Estado de la instancia y el de Dirección IP.

    Screenshot of the overview page for a container group instance.

  3. Cuando el estado de la instancia es En ejecución, vaya a la dirección IP del explorador.

    Screenshot of a browser view of an app deployed via Azure Container Instances.

    La presencia del informe de atestación debajo del logotipo de Azure Container Instances confirma que el contenedor se ejecuta en un hardware que admite un TEE.

    Si implementa en un hardware que no admite un TEE (por ejemplo, eligiendo una región en la que Container Instances confidencial no está disponible), no aparece ningún informe de atestación.

Ahora que ha implementado un grupo de contenedores confidenciales en Container Instances, puede obtener más información sobre cómo se aplican las directivas: