Esercitazione: Preparare una distribuzione per un contenitore riservato in Istanze di Azure Container

In Istanze di Azure Container è possibile usare contenitori riservati nella piattaforma serverless per eseguire applicazioni contenitore in un ambiente di esecuzione attendibile basato su hardware (T edizione Enterprise). Questa funzionalità consente di proteggere i dati in uso e fornisce la crittografia in memoria tramite il paging annidato sicuro.

In questa esercitazione apprenderai a:

  • Creare un modello di Azure Resource Manager per un gruppo di contenitori riservati.
  • Generare criteri di imposizione del confidential computing (CCE).
  • Distribuire il gruppo di contenitori riservati in Azure.

Prerequisiti

Per completare questa esercitazione, è necessario soddisfare i requisiti seguenti:

  • Interfaccia della riga di comando di Azure: nel computer locale è installata la versione 2.44.1 o successiva dell'interfaccia della riga di comando di Azure. Per trovare la versione, eseguire az --version. Se è necessario eseguire l'installazione o l'aggiornamento, vedere Installare l'interfaccia della riga di comando di Azure.

  • Estensione confcom dell'interfaccia della riga di comando di Azure: è necessario che sia installata l'estensione confcom dell'interfaccia della riga di comando di Azure versione 0.30+ per generare criteri di imposizione del confidential computing.

    az extension add -n confcom
    
  • Docker: è necessario installare Docker in locale. Docker offre pacchetti per la configurazione dell'ambiente Docker in macOS, Windows e Linux.

    questa esercitazione presuppone una conoscenza di base dei concetti principali di Docker, tra cui contenitori, immagini dei contenitori e comandi docker di base. Per una panoramica dei concetti fondamentali relativi a Docker e ai contenitori, vedere Docker overview (Panoramica di Docker).

Importante

Poiché Azure Cloud Shell non include il daemon Docker, è necessario installare sia l'interfaccia della riga di comando di Azure che il motore Docker nel computer locale per completare questa esercitazione. Non è possibile usare Azure Cloud Shell per questa esercitazione.

Creare un modello di Resource Manager per un gruppo di contenitori Istanze di Container

In questa esercitazione si distribuisce un'applicazione Hello World che genera un report di attestazione hardware. Per iniziare, creare un modello di Resource Manager con una risorsa del gruppo di contenitori per definire le proprietà di questa applicazione. Usare quindi questo modello di Resource Manager con gli strumenti di confcom dell'interfaccia della riga di comando di Azure per generare un criterio CCE per l'attestazione.

Questa esercitazione usa questo modello di Resource Manager come esempio. Per visualizzare il codice sorgente per questa applicazione, vedere Istanze di Azure Container Confidential Hello World.

Il modello di esempio aggiunge due proprietà alla definizione della risorsa Istanze di Container per rendere riservato il gruppo di contenitori:

  • sku: consente di selezionare tra distribuzioni di gruppi di contenitori riservati e standard. Se non si aggiunge questa proprietà alla risorsa, il gruppo di contenitori sarà una distribuzione standard.
  • confidentialComputeProperties: consente di passare un criterio CCE personalizzato per l'attestazione del gruppo di contenitori. Se non si aggiunge questo oggetto alla risorsa, i componenti software eseguiti all'interno del gruppo di contenitori non verranno convalidati.

Nota

Il ccePolicy parametro in confidentialComputeProperties è vuoto. Verrà compilato dopo aver generato il criterio più avanti nell'esercitazione.

Usare l'editor di testo preferito per salvare questo modello di Resource Manager nel computer locale come 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]"
      }
    }
  }

Creare un criterio CCE personalizzato

Con il modello arm creato e l'estensione confcom dell'interfaccia della riga di comando di Azure, è possibile generare un criterio CCE personalizzato. Il criterio CCE viene usato per l'attestazione. Lo strumento accetta il modello di Resource Manager come input per generare i criteri. Il criterio applica le immagini del contenitore, le variabili di ambiente, i montaggi e i comandi specifici, che possono quindi essere convalidati all'avvio del gruppo di contenitori. Per altre informazioni sull'estensione confcom dell'interfaccia della riga di comando di Azure, vedere la documentazione su GitHub.

  1. Per generare il criterio CCE, eseguire il comando seguente usando il modello di Resource Manager come input:

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

    Al termine di questo comando, verrà visualizzata una stringa Base64 generata come output nel formato seguente. Questa stringa è il criterio CCE copiato e incollato nel modello di Resource Manager come valore della ccePolicy proprietà.

    cGFja2FnZSBwb2xpY3kKCmFwaV9zdm4gOj0gIjAuOS4wIgoKaW1wb3J0IGZ1dHVyZS5rZXl3b3Jkcy5ldmVyeQppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCgpmcmFnbWVudHMgOj0gWwpdCgpjb250YWluZXJzIDo9IFsKICAgIHsKICAgICAgICAiY29tbWFuZCI6IFsiL3BhdXNlIl0sCiAgICAgICAgImVudl9ydWxlcyI6IFt7InBhdHRlcm4iOiAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLCAic3RyYXRlZ3kiOiAic3RyaW5nIiwgInJlcXVpcmVkIjogdHJ1ZX0seyJwYXR0ZXJuIjogIlRFUk09eHRlcm0iLCAic3RyYXRlZ3kiOiAic3RyaW5nIiwgInJlcXVpcmVkIjogZmFsc2V9XSwKICAgICAgICAibGF5ZXJzIjogWyIxNmI1MTQwNTdhMDZhZDY2NWY5MmMwMjg2M2FjYTA3NGZkNTk3NmM3NTVkMjZiZmYxNjM2NTI5OTE2OWU4NDE1Il0sCiAgICAgICAgIm1vdW50cyI6IFtdLAogICAgICAgICJleGVjX3Byb2Nlc3NlcyI6IFtdLAogICAgICAgICJzaWduYWxzIjogW10sCiAgICAgICAgImFsbG93X2VsZXZhdGVkIjogZmFsc2UsCiAgICAgICAgIndvcmtpbmdfZGlyIjogIi8iCiAgICB9LApdCmFsbG93X3Byb3BlcnRpZXNfYWNjZXNzIDo9IHRydWUKYWxsb3dfZHVtcF9zdGFja3MgOj0gdHJ1ZQphbGxvd19ydW50aW1lX2xvZ2dpbmcgOj0gdHJ1ZQphbGxvd19lbnZpcm9ubWVudF92YXJpYWJsZV9kcm9wcGluZyA6PSB0cnVlCmFsbG93X3VuZW5jcnlwdGVkX3NjcmF0Y2ggOj0gdHJ1ZQoKCm1vdW50X2RldmljZSA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQp1bm1vdW50X2RldmljZSA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQptb3VudF9vdmVybGF5IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnVubW91bnRfb3ZlcmxheSA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpjcmVhdGVfY29udGFpbmVyIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmV4ZWNfaW5fY29udGFpbmVyIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmV4ZWNfZXh0ZXJuYWwgOj0geyAiYWxsb3dlZCIgOiB0cnVlIH0Kc2h1dGRvd25fY29udGFpbmVyIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnNpZ25hbF9jb250YWluZXJfcHJvY2VzcyA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpwbGFuOV9tb3VudCA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpwbGFuOV91bm1vdW50IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmdldF9wcm9wZXJ0aWVzIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmR1bXBfc3RhY2tzIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnJ1bnRpbWVfbG9nZ2luZyA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpsb2FkX2ZyYWdtZW50IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnNjcmF0Y2hfbW91bnQgOj0geyAiYWxsb3dlZCIgOiB0cnVlIH0Kc2NyYXRjaF91bm1vdW50IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnJlYXNvbiA6PSB7ImVycm9ycyI6IGRhdGEuZnJhbWV3b3JrLmVycm9yc30K
    
  2. Salvare le modifiche apportate alla copia locale del modello di Resource Manager.

Distribuire il modello

Nei passaggi seguenti viene usato il portale di Azure per distribuire il modello. È anche possibile usare Azure PowerShell, l'interfaccia della riga di comando di Azure o l'API REST. Per informazioni su altri metodi di distribuzione, vedere Distribuire modelli.

  1. Selezionare il pulsante Distribuisci in Azure per accedere ad Azure e iniziare una distribuzione Istanze di Container.

    Button to deploy the Resource Manager template to Azure.

  2. Selezionare Creare un modello personalizzato nell'editor.

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

    Il codice JSON del modello visualizzato è per lo più vuoto.

  3. Selezionare Carica file e caricare template.json modificati aggiungendo i criteri CCE nei passaggi precedenti.

    Screenshot of the button for loading a file.

  4. Seleziona Salva.

  5. Immetti o seleziona i valori seguenti:

    • Sottoscrizione: selezionare una sottoscrizione di Azure.
    • Gruppo di risorse: selezionare Crea nuovo, immettere un nome univoco per il gruppo di risorse e quindi selezionare OK.
    • Nome: accettare il nome generato per l'istanza o immettere un nome.
    • Posizione: selezionare una posizione per il gruppo di risorse. Scegliere un'area in cui sono supportati i contenitori riservati. Esempio: Europa settentrionale.
    • Immagine: accettare il nome dell'immagine predefinito. Questa immagine linux di esempio visualizza un'attestazione hardware.

    Accettare i valori predefiniti per le proprietà rimanenti e quindi selezionare Rivedi e crea.

    Screenshot of details for a custom ARM template deployment.

  6. Esaminare le condizioni per l'utilizzo del servizio. Per accettarle, selezionare Accetto le condizioni riportate sopra.

  7. Attendere che venga visualizzata la notifica Distribuzione completata . Conferma che l'istanza è stata creata correttamente.

    Screenshot of a portal notification for successful deployment.

Esaminare le risorse distribuite

Nei passaggi seguenti si usa il portale di Azure per esaminare le proprietà dell'istanza del contenitore. È anche possibile usare uno strumento come l'interfaccia della riga di comando di Azure.

  1. Nel portale cercare Istanze di Container e quindi selezionare l'istanza del contenitore creata.

  2. Nella pagina Panoramica prendere nota dello stato dell'istanza e del relativo indirizzo IP.

    Screenshot of the overview page for a container group instance.

  3. Quando lo stato dell'istanza è In esecuzione, passare all'indirizzo IP nel browser.

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

    La presenza del report di attestazione sotto il logo Istanze di Azure Container conferma che il contenitore è in esecuzione nell'hardware che supporta un T edizione Enterprise.

    Se si esegue la distribuzione nell'hardware che non supporta un T edizione Enterprise (ad esempio, scegliendo un'area in cui Istanze di Container Riservato non è disponibile), non viene visualizzato alcun report di attestazione.

Dopo aver distribuito un gruppo di contenitori riservati in Istanze di Container, è possibile ottenere altre informazioni su come vengono applicati i criteri: