Share via


Självstudie: Förbereda en distribution för en konfidentiell container på Azure Container Instances

I Azure Container Instances kan du använda konfidentiella containrar på den serverlösa plattformen för att köra containerprogram i en maskinvarubaserad och intygad betrodd körningsmiljö (TEE). Den här funktionen kan hjälpa till att skydda data som används och ger minnesintern kryptering via säker kapslad växling.

I den här självstudien lär du dig att:

  • Skapa en Azure Resource Manager-mall (ARM-mall) för en konfidentiell containergrupp.
  • Generera en cce-princip (confidential computing enforcement).
  • Distribuera den konfidentiella containergruppen till Azure.

Förutsättningar

För att slutföra den här självstudien måste du uppfylla följande krav:

  • Azure CLI: Du måste ha Azure CLI version 2.44.1 eller senare installerat på den lokala datorn. Du hittar din version genom att köra az --version. Om du behöver installera eller uppgradera kan du läsa informationen i Installera Azure CLI.

  • Azure CLI-konfigurationstillägg: Du måste ha Azure CLI confcom-tillägget version 0.30+ installerat för att generera principer för efterlevnad av konfidentiell databehandling.

    az extension add -n confcom
    
  • Docker: Du behöver Docker installerat lokalt. Docker innehåller paket som konfigurerar Docker-miljön på macOS, Windows och Linux.

    Den här självstudien förutsätter en grundläggande förståelse av grundläggande Docker-begrepp som containrar, containeravbildningar och grundläggande docker kommandon. En introduktion till grunderna för Docker och containrar finns i Docker-översikt.

Viktigt!

Eftersom Azure Cloud Shell inte innehåller Docker-daemon måste du installera både Azure CLI och Docker Engine på den lokala datorn för att slutföra den här självstudien. Du kan inte använda Azure Cloud Shell för den här självstudien.

Skapa en ARM-mall för en containergrupp för containerinstanser

I den här självstudien distribuerar du ett Hello World-program som genererar en rapport om maskinvaruattestering. Du börjar med att skapa en ARM-mall med en containergruppresurs för att definiera egenskaperna för det här programmet. Sedan använder du den här ARM-mallen med Azure CLI-konfigurationsverktyget för att generera en CCE-princip för attestering.

I den här självstudien används den här ARM-mallen som exempel. Information om hur du visar källkoden för det här programmet finns i Azure Container Instances Confidential Hello World.

Exempelmallen lägger till två egenskaper i resursdefinitionen containerinstanser för att göra containergruppen konfidentiell:

  • sku: Gör att du kan välja mellan konfidentiella distributioner och standarddistributioner av containergrupper. Om du inte lägger till den här egenskapen i resursen blir containergruppen en standarddistribution.
  • confidentialComputeProperties: Gör att du kan skicka in en anpassad CCE-princip för attestering av din containergrupp. Om du inte lägger till det här objektet i resursen verifieras inte de programvarukomponenter som körs i containergruppen.

Kommentar

Parametern ccePolicy under confidentialComputeProperties är tom. Du fyller i den när du har genererat principen senare i självstudien.

Använd önskad textredigerare för att spara arm-mallen på den lokala datorn när 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]"
      }
    }
  }

Skapa en anpassad CCE-princip

Med ARM-mallen som du skapade och Azure CLI-konfigurationstillägget kan du generera en anpassad CCE-princip. CCE-principen används för attestering. Verktyget tar ARM-mallen som indata för att generera principen. Principen tillämpar de specifika containeravbildningarna, miljövariablerna, monteringarna och kommandona, som sedan kan verifieras när containergruppen startas. Mer information om Azure CLI-konfigurationstillägget finns i dokumentationen på GitHub.

  1. Om du vill generera CCE-principen kör du följande kommando med hjälp av ARM-mallen som indata:

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

    När det här kommandot har slutförts ska en Base64-sträng som genereras som utdata visas i följande format. Den här strängen är den CCE-princip som du kopierar och klistrar in i ARM-mallen som värdet för ccePolicy egenskapen.

    cGFja2FnZSBwb2xpY3kKCmFwaV9zdm4gOj0gIjAuOS4wIgoKaW1wb3J0IGZ1dHVyZS5rZXl3b3Jkcy5ldmVyeQppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCgpmcmFnbWVudHMgOj0gWwpdCgpjb250YWluZXJzIDo9IFsKICAgIHsKICAgICAgICAiY29tbWFuZCI6IFsiL3BhdXNlIl0sCiAgICAgICAgImVudl9ydWxlcyI6IFt7InBhdHRlcm4iOiAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLCAic3RyYXRlZ3kiOiAic3RyaW5nIiwgInJlcXVpcmVkIjogdHJ1ZX0seyJwYXR0ZXJuIjogIlRFUk09eHRlcm0iLCAic3RyYXRlZ3kiOiAic3RyaW5nIiwgInJlcXVpcmVkIjogZmFsc2V9XSwKICAgICAgICAibGF5ZXJzIjogWyIxNmI1MTQwNTdhMDZhZDY2NWY5MmMwMjg2M2FjYTA3NGZkNTk3NmM3NTVkMjZiZmYxNjM2NTI5OTE2OWU4NDE1Il0sCiAgICAgICAgIm1vdW50cyI6IFtdLAogICAgICAgICJleGVjX3Byb2Nlc3NlcyI6IFtdLAogICAgICAgICJzaWduYWxzIjogW10sCiAgICAgICAgImFsbG93X2VsZXZhdGVkIjogZmFsc2UsCiAgICAgICAgIndvcmtpbmdfZGlyIjogIi8iCiAgICB9LApdCmFsbG93X3Byb3BlcnRpZXNfYWNjZXNzIDo9IHRydWUKYWxsb3dfZHVtcF9zdGFja3MgOj0gdHJ1ZQphbGxvd19ydW50aW1lX2xvZ2dpbmcgOj0gdHJ1ZQphbGxvd19lbnZpcm9ubWVudF92YXJpYWJsZV9kcm9wcGluZyA6PSB0cnVlCmFsbG93X3VuZW5jcnlwdGVkX3NjcmF0Y2ggOj0gdHJ1ZQoKCm1vdW50X2RldmljZSA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQp1bm1vdW50X2RldmljZSA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQptb3VudF9vdmVybGF5IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnVubW91bnRfb3ZlcmxheSA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpjcmVhdGVfY29udGFpbmVyIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmV4ZWNfaW5fY29udGFpbmVyIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmV4ZWNfZXh0ZXJuYWwgOj0geyAiYWxsb3dlZCIgOiB0cnVlIH0Kc2h1dGRvd25fY29udGFpbmVyIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnNpZ25hbF9jb250YWluZXJfcHJvY2VzcyA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpwbGFuOV9tb3VudCA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpwbGFuOV91bm1vdW50IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmdldF9wcm9wZXJ0aWVzIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmR1bXBfc3RhY2tzIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnJ1bnRpbWVfbG9nZ2luZyA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpsb2FkX2ZyYWdtZW50IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnNjcmF0Y2hfbW91bnQgOj0geyAiYWxsb3dlZCIgOiB0cnVlIH0Kc2NyYXRjaF91bm1vdW50IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnJlYXNvbiA6PSB7ImVycm9ycyI6IGRhdGEuZnJhbWV3b3JrLmVycm9yc30K
    
  2. Spara ändringarna i din lokala kopia av ARM-mallen.

Distribuera mallen

I följande steg använder du Azure-portalen för att distribuera mallen. Du kan också använda Azure PowerShell, Azure CLI eller REST-API:et. Mer information om andra distributionsmetoder finns i Distribuera mallar.

  1. Välj knappen Distribuera till Azure för att logga in på Azure och starta en containerinstansdistribution.

    Button to deploy the Resource Manager template to Azure.

  2. Välj alternativet för att skapa din egen mall i redigeringsprogrammet.

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

    Mallens JSON som visas är mestadels tom.

  3. Välj Läs in fil och ladda upp template.json, som du ändrade genom att lägga till CCE-principen i föregående steg.

    Screenshot of the button for loading a file.

  4. Välj Spara.

  5. Välj eller ange följande värden:

    • Prenumeration: Välj en Azure-prenumeration.
    • Resursgrupp: Välj Skapa ny, ange ett unikt namn för resursgruppen och välj sedan OK.
    • Namn: Acceptera det genererade namnet för instansen eller ange ett namn.
    • Plats: Välj en plats för resursgruppen. Välj en region där konfidentiella containrar stöds. Exempel: Europa, norra.
    • Bild: Acceptera standardbildens namn. Den här Linux-exempelbilden visar en maskinvaruattestering.

    Acceptera standardvärden för de återstående egenskaperna och välj sedan Granska + skapa.

    Screenshot of details for a custom ARM template deployment.

  6. Granska villkoren. Om du samtycker väljer du Jag godkänner de villkor som anges ovan.

  7. Vänta tills meddelandet Distributionen lyckades visas. Det bekräftar att du har skapat instansen.

    Screenshot of a portal notification for successful deployment.

Granska distribuerade resurser

I följande steg använder du Azure-portalen för att granska egenskaperna för containerinstansen. Du kan också använda ett verktyg som Azure CLI.

  1. I portalen söker du efter Container Instances och väljer sedan den containerinstans som du skapade.

  2. På sidan Översikt noterar du status för instansen och dess IP-adress.

    Screenshot of the overview page for a container group instance.

  3. När statusen för instansen körs går du till IP-adressen i webbläsaren.

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

    Förekomsten av attesteringsrapporten under Azure Container Instances-logotypen bekräftar att containern körs på maskinvara som stöder en TEE.

    Om du distribuerar till maskinvara som inte stöder en TEE (till exempel genom att välja en region där Container Instances Confidential inte är tillgängligt) visas ingen attesteringsrapport.

Nu när du har distribuerat en konfidentiell containergrupp på Container Instances kan du lära dig mer om hur principer tillämpas: