Tutorial: Vorbereiten einer Bereitstellung für einen vertraulichen Container auf Azure Container Instances (ACI)

In Azure Container Instances können Sie vertrauliche Container auf der serverlosen Plattform verwenden, um Containeranwendungen in einer hardwarebasierten und bestätigten vertrauenswürdigen Ausführungsumgebung (TEE) auszuführen. Diese Funktion kann dazu beitragen, Daten zu schützen, die verwendet werden, und bietet Verschlüsselung im Arbeitsspeicher über Secure Nested Paging.

In diesem Tutorial lernen Sie Folgendes:

  • Erstellen Sie eine Azure Resource Manager-Vorlage (ARM-Vorlage) für eine vertrauliche Containergruppe.
  • Confidential Computing Enforcement (CCE)-Richtlinie generieren.
  • Vertrauliche Containergruppe in Azure bereitstellen.

Voraussetzungen

Um dieses Tutorial abzuschließen, müssen Sie die folgenden Anforderungen erfüllen:

  • Azure-Befehlszeilenschnittstelle: Auf dem lokalen Computer muss mindestens Version 2.44.1 der Azure-Befehlszeilenschnittstelle installiert sein. Zum Ermitteln Ihrer Version führen Sie az --version aus. Installations- und Upgradeinformationen finden Sie bei Bedarf unter Installieren von Azure CLI.

  • confcom-Erweiterung für Azure CLI: Sie müssen die confcom-Erweiterung 0.30+ oder höher für Azure CLI installiert haben, um Richtlinien zur Erzwingung von vertraulichem Computing zu generieren.

    az extension add -n confcom
    
  • Docker: Sie benötigen Docker lokal installiert. Für die Docker-Umgebung stehen Konfigurationspakete für macOS, Windows und Linux zur Verfügung.

    In diesem Tutorial wird vorausgesetzt, dass zentrale Docker-Konzepte wie Container und Containerimages sowie grundlegende docker-Befehle bekannt sind. Eine Einführung in Docker und Container finden Sie in der Docker-Übersicht.

Wichtig

Da Azure Cloud Shell den Docker-Daemon nicht enthält, müssen Sie sowohl das Azure CLI als auch das Docker-Modul auf Ihrem lokalen Computer installieren, um dieses Tutorial abzuschließen. Sie können Azure Cloud Shell für dieses Tutorial nicht verwenden.

Erstellen einer ARM-Vorlage für eine Containerinstanzen-Containergruppe

In diesem Tutorial stellen Sie eine „Hello World“-Anwendung bereit, die einen Hardwarenachweisbericht generiert. Sie erstellen zunächst eine ARM-Vorlage mit einer Containergruppenressource, um die Eigenschaften dieser Anwendung zu definieren. Anschließend verwenden Sie diese ARM-Vorlage mit dem Azure CLI Confcom-Tool, um eine CCE-Richtlinie für den Nachweis zu generieren.

In diesem Tutorial wird diese ARM-Vorlage als Beispiel verwendet. Informationen zum Anzeigen des Quellcodes für diese Anwendung finden Sie unter Azure Container Instances Confidential Hello World.

Die Beispielvorlage fügt der Containerinstanzressourcendefinition zwei Eigenschaften hinzu, um die Containergruppe vertraulich zu machen:

  • sku: Ermöglicht ihnen die Auswahl zwischen vertraulichen und standardmäßigen Containergruppenbereitstellungen. Wenn Sie diese Eigenschaft nicht zur Ressource hinzufügen, ist die Containergruppe eine Standardbereitstellung.
  • confidentialComputeProperties: Ermöglicht es Ihnen, eine benutzerdefinierte CCE-Richtlinie für den Nachweis Ihrer Containergruppe zu übergeben. Wenn Sie dieses Objekt nicht zu der Ressource hinzufügen, werden die Softwarekomponenten, die innerhalb der Containergruppe ausgeführt werden, nicht überprüft.

Hinweis

Der ccePolicy-Parameter unter confidentialComputeProperties ist leer. Sie füllen sie aus, nachdem Sie die Richtlinie später im Tutorial generiert haben.

Verwenden Sie Ihren bevorzugten Text-Editor, um diese ARM-Vorlage auf Ihrem lokalen Computer als template.json zu speichern.

{
    "$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]"
      }
    }
  }

Benutzerdefinierte CCE-Richtlinie erstellen

Mit der von Ihnen erstellten ARM-Vorlage und der confcom-Erweiterung der Azure CLI können Sie eine benutzerdefinierte CCE-Richtlinie generieren. Die CCE-Richtlinie wird für den Nachweis verwendet. Das Tool verwendet die ARM-Vorlage als Eingabe, um die Richtlinie zu generieren. Die Richtlinie erzwingt die spezifischen Containerimages, Umgebungsvariablen, Bereitstellungen und Befehle, die dann beim Starten der Containergruppe überprüft werden können. Weitere Informationen zur Azure CLI Confcom-Erweiterung finden Sie in der Dokumentation auf GitHub.

  1. Führen Sie zum Generieren der CCE-Richtlinie den folgenden Befehl aus, indem Sie die ARM-Vorlage als Eingabe verwenden:

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

    Wenn dieser Befehl abgeschlossen ist, sollte eine Base64-Zeichenfolge, die als Ausgabe generiert wird, im folgenden Format angezeigt werden. Diese Zeichenfolge ist die CCE-Richtlinie, die Sie als Wert der ccePolicy-Eigenschaft kopieren und in Ihre ARM-Vorlage einfügen.

    cGFja2FnZSBwb2xpY3kKCmFwaV9zdm4gOj0gIjAuOS4wIgoKaW1wb3J0IGZ1dHVyZS5rZXl3b3Jkcy5ldmVyeQppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCgpmcmFnbWVudHMgOj0gWwpdCgpjb250YWluZXJzIDo9IFsKICAgIHsKICAgICAgICAiY29tbWFuZCI6IFsiL3BhdXNlIl0sCiAgICAgICAgImVudl9ydWxlcyI6IFt7InBhdHRlcm4iOiAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLCAic3RyYXRlZ3kiOiAic3RyaW5nIiwgInJlcXVpcmVkIjogdHJ1ZX0seyJwYXR0ZXJuIjogIlRFUk09eHRlcm0iLCAic3RyYXRlZ3kiOiAic3RyaW5nIiwgInJlcXVpcmVkIjogZmFsc2V9XSwKICAgICAgICAibGF5ZXJzIjogWyIxNmI1MTQwNTdhMDZhZDY2NWY5MmMwMjg2M2FjYTA3NGZkNTk3NmM3NTVkMjZiZmYxNjM2NTI5OTE2OWU4NDE1Il0sCiAgICAgICAgIm1vdW50cyI6IFtdLAogICAgICAgICJleGVjX3Byb2Nlc3NlcyI6IFtdLAogICAgICAgICJzaWduYWxzIjogW10sCiAgICAgICAgImFsbG93X2VsZXZhdGVkIjogZmFsc2UsCiAgICAgICAgIndvcmtpbmdfZGlyIjogIi8iCiAgICB9LApdCmFsbG93X3Byb3BlcnRpZXNfYWNjZXNzIDo9IHRydWUKYWxsb3dfZHVtcF9zdGFja3MgOj0gdHJ1ZQphbGxvd19ydW50aW1lX2xvZ2dpbmcgOj0gdHJ1ZQphbGxvd19lbnZpcm9ubWVudF92YXJpYWJsZV9kcm9wcGluZyA6PSB0cnVlCmFsbG93X3VuZW5jcnlwdGVkX3NjcmF0Y2ggOj0gdHJ1ZQoKCm1vdW50X2RldmljZSA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQp1bm1vdW50X2RldmljZSA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQptb3VudF9vdmVybGF5IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnVubW91bnRfb3ZlcmxheSA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpjcmVhdGVfY29udGFpbmVyIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmV4ZWNfaW5fY29udGFpbmVyIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmV4ZWNfZXh0ZXJuYWwgOj0geyAiYWxsb3dlZCIgOiB0cnVlIH0Kc2h1dGRvd25fY29udGFpbmVyIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnNpZ25hbF9jb250YWluZXJfcHJvY2VzcyA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpwbGFuOV9tb3VudCA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpwbGFuOV91bm1vdW50IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmdldF9wcm9wZXJ0aWVzIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmR1bXBfc3RhY2tzIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnJ1bnRpbWVfbG9nZ2luZyA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpsb2FkX2ZyYWdtZW50IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnNjcmF0Y2hfbW91bnQgOj0geyAiYWxsb3dlZCIgOiB0cnVlIH0Kc2NyYXRjaF91bm1vdW50IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnJlYXNvbiA6PSB7ImVycm9ycyI6IGRhdGEuZnJhbWV3b3JrLmVycm9yc30K
    
  2. Speichern Sie die Änderungen Ihrer lokalen Kopie der ARM-Vorlage.

Bereitstellen der Vorlage

In den folgenden Schritten verwenden Sie das Azure-Portal, um die Vorlage bereitzustellen. Sie können auch Azure PowerShell, die Azure CLI oder die REST-API verwenden. Informationen über andere Bereitstellungsmethoden finden Sie unter Bereitstellen von Vorlagen.

  1. Wählen Sie die Schaltfläche Bereitstellen in Azure aus, um sich bei Azure anzumelden und eine Containerinstanzbereitstellung zu starten.

    Button to deploy the Resource Manager template to Azure.

  2. Wählen Sie Eigene Vorlage im Editor erstellen.

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

    Die angezeigte JSON-Vorlage ist meist leer.

  3. Wählen Sie Datei laden aus und laden Sie template.json hoch, die Sie geändert haben, indem Sie die CCE-Richtlinie in den vorherigen Schritten hinzufügen.

    Screenshot of the button for loading a file.

  4. Wählen Sie Speichern.

  5. Wählen Sie die folgenden Werte aus, bzw. geben Sie sie ein:

    • Abonnement: Wählen Sie ein Azure-Abonnement aus.
    • Ressourcengruppe: Wählen Sie die Option Neu erstellen aus, geben Sie einen eindeutigen Namen für die Ressourcengruppe ein, und wählen Sie dann OK aus.
    • Name: Übernehmen Sie den generierten Namen für die Instanz, oder geben Sie einen Namen ein.
    • Standort: Wählen Sie einen Standort für die Ressourcengruppe aus. Wählen Sie eine Region aus, in der vertrauliche Container unterstützt werden. Beispiel: Europa, Norden.
    • Image: Übernehmen Sie den Standardnamen für das Image. Dieses Linux-Beispielimage zeigt einen Hardwarenachweis an.

    Übernehmen Sie Standardwerte für die verbleibenden Eigenschaften und wählen Sie dann Überprüfen + erstellen aus.

    Screenshot of details for a custom ARM template deployment.

  6. Sehen Sie sich die Geschäftsbedingungen an. Wenn Sie einverstanden sind, aktivieren Sie Ich stimme den oben genannten Geschäftsbedingungen zu.

  7. Warten Sie, bis die Bereitstellung erfolgreich angezeigt wird. Es bestätigt, dass Sie die Instanz erfolgreich erstellt haben.

    Screenshot of a portal notification for successful deployment.

Überprüfen der bereitgestellten Ressourcen

In den folgenden Schritten verwenden Sie das Azure-Portal, um die Eigenschaften der Containerinstanz zu überprüfen. Sie können auch ein Tool wie die Azure CLI verwenden.

  1. Suchen Sie im Portal nach Containerinstanzen und wählen Sie dann die von Ihnen erstellte Containerinstanz aus.

  2. Sehen Sie sich auf der Seite Übersicht den Status der Instanz sowie den Wert unter IP-Adresse an.

    Screenshot of the overview page for a container group instance.

  3. Wenn der Status der Instanz Wird ausgeführt ist, wechseln Sie zur IP-Adresse in Ihrem Browser.

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

    Das Vorhandensein des Nachweisberichts unterhalb des Azure Container Instances-Logos bestätigt, dass der Container auf Hardware ausgeführt wird, die eine TEE unterstützt.

    Wenn Sie auf Hardware bereitstellen, die ein TEE nicht unterstützt (z. B. durch Auswählen einer Region, in der Container Instances Confidential nicht verfügbar ist), wird kein Nachweisbericht angezeigt.

Nachdem Sie nun eine vertrauliche Containergruppe für Containerinstanzen bereitgestellt haben, erfahren Sie mehr darüber, wie Richtlinien erzwungen werden: