Share via


教學課程:為 Azure 容器執行個體 上的機密容器準備部署

在 Azure 容器執行個體 中,您可以在無伺服器平臺上使用機密容器,在硬體型且證明的信任執行環境 (TEE) 中執行容器應用程式。 這項功能可協助保護使用中的數據,並透過安全巢狀分頁提供記憶體內部加密。

在本教學課程中,您會了解如何:

  • 建立機密容器群組的 Azure Resource Manager 範本 (ARM 範本)。
  • 產生機密運算強制執行 (CCE) 原則。
  • 將機密容器群組部署至 Azure。

必要條件

若要完成本教學課程,您必須滿足下列需求:

  • Azure CLI:您必須在本機計算機上安裝 Azure CLI 2.44.1 版或更新版本。 若要尋找您的版本,請執行 az --version。 如果您需要安裝或升級,請參閱安裝 Azure CLI 模組

  • Azure CLI confcom 擴充功能:您必須安裝 Azure CLI confcom 擴充功能 0.30+ 版,才能產生機密運算強制執行原則。

    az extension add -n confcom
    
  • Docker:您需要在本機安裝 Docker。 Docker 提供在 macOSWindowsLinux 上設定 Docker 環境的套件。

    本教學課程假設基本瞭解核心 Docker 概念,例如容器、容器映射和基本 docker 命令。 如需 Docker 和容器基本概念的入門,請參閱 Docker 概觀

重要

因為 Azure Cloud Shell 不包含 Docker 精靈,因此您必須在本機電腦上安裝 Azure CLI 和 Docker 引擎,才能完成本教學課程。 本教學課程無法使用 Azure Cloud Shell。

建立 容器執行個體 容器群組的ARM樣本

在本教學課程中,您會部署產生硬體證明報告的 Hello World 應用程式。 首先,您會使用容器群組資源建立 ARM 範本,以定義此應用程式的屬性。 接著,您可以使用此 ARM 範本搭配 Azure CLI confcom 工具來產生 CCE 原則以進行證明。

本教學課程會使用此 ARM 範例 作為範例。 若要檢視此應用程式的原始程式碼,請參閱 Azure 容器執行個體 Confidential Hello World

範例範本會將兩個屬性新增至 容器執行個體 資源定義,讓容器群組成為機密:

  • sku:可讓您在機密和標準容器群組部署之間選取。 如果您未將此屬性新增至資源,容器群組將會是標準部署。
  • confidentialComputeProperties:可讓您傳入自定義 CCE 原則,以證明容器群組。 如果您未將此物件新增至資源,將不會驗證在容器群組內執行的軟體元件。

注意

ccePolicy下方confidentialComputeProperties的參數是空白的。 您稍後會在教學課程中產生原則之後填入。

使用您慣用的文字編輯器,將此 ARM 範本儲存在本機電腦上作為 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]"
      }
    }
  }

建立自定義 CCE 原則

透過您製作的 ARM 範本和 Azure CLI confcom 擴充功能,您可以產生自定義 CCE 原則。 CCE 原則用於證明。 此工具會採用ARM範本作為產生原則的輸入。 原則會強制執行特定的容器映射、環境變數、掛接和命令,然後可在容器群組啟動時進行驗證。 如需 Azure CLI confcom 擴充功能的詳細資訊,請參閱 GitHub 上的檔。

  1. 若要產生 CCE 原則,請使用 ARM 範本作為輸入來執行下列命令:

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

    當此命令完成時,產生為輸出的Base64字串應該會以下列格式顯示。 此字串是您複製並貼到 ARM 範本作為 屬性值的 ccePolicy CCE 原則。

    cGFja2FnZSBwb2xpY3kKCmFwaV9zdm4gOj0gIjAuOS4wIgoKaW1wb3J0IGZ1dHVyZS5rZXl3b3Jkcy5ldmVyeQppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCgpmcmFnbWVudHMgOj0gWwpdCgpjb250YWluZXJzIDo9IFsKICAgIHsKICAgICAgICAiY29tbWFuZCI6IFsiL3BhdXNlIl0sCiAgICAgICAgImVudl9ydWxlcyI6IFt7InBhdHRlcm4iOiAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLCAic3RyYXRlZ3kiOiAic3RyaW5nIiwgInJlcXVpcmVkIjogdHJ1ZX0seyJwYXR0ZXJuIjogIlRFUk09eHRlcm0iLCAic3RyYXRlZ3kiOiAic3RyaW5nIiwgInJlcXVpcmVkIjogZmFsc2V9XSwKICAgICAgICAibGF5ZXJzIjogWyIxNmI1MTQwNTdhMDZhZDY2NWY5MmMwMjg2M2FjYTA3NGZkNTk3NmM3NTVkMjZiZmYxNjM2NTI5OTE2OWU4NDE1Il0sCiAgICAgICAgIm1vdW50cyI6IFtdLAogICAgICAgICJleGVjX3Byb2Nlc3NlcyI6IFtdLAogICAgICAgICJzaWduYWxzIjogW10sCiAgICAgICAgImFsbG93X2VsZXZhdGVkIjogZmFsc2UsCiAgICAgICAgIndvcmtpbmdfZGlyIjogIi8iCiAgICB9LApdCmFsbG93X3Byb3BlcnRpZXNfYWNjZXNzIDo9IHRydWUKYWxsb3dfZHVtcF9zdGFja3MgOj0gdHJ1ZQphbGxvd19ydW50aW1lX2xvZ2dpbmcgOj0gdHJ1ZQphbGxvd19lbnZpcm9ubWVudF92YXJpYWJsZV9kcm9wcGluZyA6PSB0cnVlCmFsbG93X3VuZW5jcnlwdGVkX3NjcmF0Y2ggOj0gdHJ1ZQoKCm1vdW50X2RldmljZSA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQp1bm1vdW50X2RldmljZSA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQptb3VudF9vdmVybGF5IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnVubW91bnRfb3ZlcmxheSA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpjcmVhdGVfY29udGFpbmVyIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmV4ZWNfaW5fY29udGFpbmVyIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmV4ZWNfZXh0ZXJuYWwgOj0geyAiYWxsb3dlZCIgOiB0cnVlIH0Kc2h1dGRvd25fY29udGFpbmVyIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnNpZ25hbF9jb250YWluZXJfcHJvY2VzcyA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpwbGFuOV9tb3VudCA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpwbGFuOV91bm1vdW50IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmdldF9wcm9wZXJ0aWVzIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmR1bXBfc3RhY2tzIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnJ1bnRpbWVfbG9nZ2luZyA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpsb2FkX2ZyYWdtZW50IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnNjcmF0Y2hfbW91bnQgOj0geyAiYWxsb3dlZCIgOiB0cnVlIH0Kc2NyYXRjaF91bm1vdW50IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnJlYXNvbiA6PSB7ImVycm9ycyI6IGRhdGEuZnJhbWV3b3JrLmVycm9yc30K
    
  2. 將變更儲存至 ARM 範本機複本。

部署範本

在下列步驟中,您會使用 Azure 入口網站 來部署範本。 您也可以使用 Azure PowerShell、Azure CLI 或 REST API。 若要瞭解其他部署方法,請參閱 部署範本

  1. 選取 [部署至 Azure] 按鈕以登入 Azure,並開始 容器執行個體 部署。

    Button to deploy the Resource Manager template to Azure.

  2. 選取 [在編輯器中組建您自己的範本]

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

    顯示的範本 JSON 大多是空白的。

  3. 選取 [載入檔案 ] 並上傳 template.json,您在先前步驟中新增 CCE 原則來修改此檔案。

    Screenshot of the button for loading a file.

  4. 選取 [儲存]。

  5. 選取或輸入下列值:

    • 訂用帳戶:選取 Azure 訂用帳戶。
    • 資源群組:選取 [新建],輸入資源群組的唯一名稱,然後選取 [ 確定]。
    • 名稱:接受實例產生的名稱,或輸入名稱。
    • 位置:選取資源群組的位置。 選擇支援機密容器的區域。 範例: 北歐
    • 映射:接受預設映像名稱。 此範例 Linux 映像會顯示硬體證明。

    接受其餘屬性的預設值,然後選取 [ 檢閱 + 建立]。

    Screenshot of details for a custom ARM template deployment.

  6. 檢閱條款及條件。 如果您同意,請選取 [我同意上述條款及條件]。

  7. 等候部署成功通知出現。 它會確認您已成功建立 實例。

    Screenshot of a portal notification for successful deployment.

檢閱已部署的資源

在下列步驟中,您會使用 Azure 入口網站 來檢閱容器實例的屬性。 您也可以使用 Azure CLI 之類的工具。

  1. 在入口網站中,搜尋 容器執行個體,然後選取您所建立的容器實例。

  2. 在 [概 觀] 頁面上,記下實例的狀態及其IP位址。

    Screenshot of the overview page for a container group instance.

  3. 當實例的狀態為 [執行中] 時,請移至瀏覽器中的IP位址。

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

    Azure 容器執行個體 標誌下方的證明報告會確認容器正在支援 TEE 的硬體上執行。

    如果您部署到不支援 TEE 的硬體(例如,選擇無法使用 容器執行個體 機密的區域),則不會顯示任何證明報告。

既然您已在 容器執行個體 上部署機密容器群組,您可以深入瞭解如何強制執行原則: