チュートリアル: Azure Container Instances での機密コンテナーのデプロイの準備

Azure Container Instances では、サーバーレス プラットフォーム上の機密コンテナーを使用して、ハードウェア ベースで構成証明された信頼された実行環境 (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 overview」(Docker の概要) を参照してください。

重要

Azure Cloud Shell には Docker デーモンが含まれていないため、このチュートリアルを完了するためには、Azure CLI と Docker エンジンの両方を自分でローカル コンピューターにインストールする必要があります。 このチュートリアルでは、Azure Cloud Shell は使用できません。

Azure Container Instances コンテナー グループ用の ARM テンプレートの作成

このチュートリアルでは、ハードウェア構成証明レポートを生成する Hello World アプリケーションをデプロイします。 まず、コンテナー グループ リソースを使用して ARM テンプレートを作成し、このアプリケーションのプロパティを定義します。 次に、この ARM テンプレートを Azure CLI confcom ツールと共に使用して、構成証明用の CCE ポリシーを生成します。

このチュートリアルでは、この ARM テンプレートを例として使用します。 このアプリケーションのソース コードを表示するには、「Azure Container Instances 機密 Hello World」を参照してください。

このテンプレート例では、コンテナー グループを機密にするために、Azure Container Instances リソース定義に次の 2 つのプロパティを追加します。

  • sku: 機密コンテナー グループと標準コンテナー グループのデプロイを選択できます。 このプロパティをリソースに追加しない場合、コンテナー グループは標準のデプロイになります。
  • confidentialComputeProperties: コンテナー グループの構成証明用のカスタム CCE ポリシーを渡すことができます。 このオブジェクトをリソースに追加しない場合、コンテナー グループ内で実行されるソフトウェア コンポーネントは検証されません。

Note

confidentialComputeProperties の下の ccePolicy パラメーターは空白です。 この情報は、チュートリアルの後半でポリシーを生成した後で入力します。

任意のテキスト エディターを使用して、この 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 portal を使用してテンプレートをデプロイします。 Azure PowerShell、Azure CLI、REST API を使用することもできます。 他のデプロイ方法については、「テンプレートのデプロイ」を参照してください。

  1. [Azure へのデプロイ] ボタンを選択して Azure にサインインし、Azure Container Instances のデプロイを開始します。

    Button to deploy the Resource Manager template to Azure.

  2. [Build your own template in the editor] (エディターで独自のテンプレートをビルド) を選択します。

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

    表示されるテンプレート JSON は、ほとんど空白です。

  3. [ファイルの読み込み] を選択し、前の手順の CCE ポリシーを追加して変更した template.json をアップロードします。

    Screenshot of the button for loading a file.

  4. [保存] を選択します。

  5. 次の値を選択または入力します。

    • サブスクリプション:Azure サブスクリプションを選択します。
    • [リソース グループ] : [新規作成] を選択し、リソース グループの一意の名前を入力し、 [OK] を選択します。
    • 名前: 生成されたインスタンス名を受け入れるか、名前を入力します。
    • 場所: リソース グループの場所を選択します。 機密コンテナーがサポートされているリージョンを選択します。 例: 北ヨーロッパ
    • イメージ: 既定のイメージ名を受け入れます。 このサンプル Linux イメージには、ハードウェア構成証明が表示されます。

    残りのプロパティの既定値をそのまま使用し、[確認と作成] を選択します。

    Screenshot of details for a custom ARM template deployment.

  6. 使用条件をご確認ください。 同意する場合は [上記の使用条件に同意する] を選択します。

  7. デプロイメント成功通知が表示されるまで待ちます。 インスタンスが正常に作成されたことを確認します。

    Screenshot of a portal notification for successful deployment.

デプロイされているリソースを確認する

次の手順では、Azure portal を使用してコンテナー インスタンスのプロパティを確認します。 Azure CLI などのツールを使用することもできます。

  1. ポータルで Azure Container Instances を検索し、作成したコンテナー インスタンスを選択します。

  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 Container Instances ロゴの下の構成証明レポートの存在は、そのコンテナーが TEE をサポートするハードウェアで実行されていることを確認するものです。

    TEE をサポートしていないハードウェアにデプロイする場合 (たとえば、Container Instances Confidential を使用できないリージョンを選択するなど)、構成証明レポートは表示されません。

Azure Container Instances に機密コンテナー グループをデプロイしたので、ポリシーの適用方法の詳細を確認できます。