デプロイ データの暗号化

クラウドで Azure Container Instances (ACI) リソースを実行すると、ACI サービスにより、コンテナーに関連するデータが収集されて永続化されます。 ACI では、このデータはクラウドに永続化されるときに自動的に暗号化されます。 この暗号化によってデータは保護され、組織のセキュリティとコンプライアンスのコミットメントを満たすのに役立ちます。 ACI では、ユーザー独自のキーでこのデータを暗号化するオプションも用意されており、ACI のデプロイに関するデータをさらにきめ細かく制御できます。

ACI のデータ暗号化について

ACI のデータは、256 ビット AES 暗号化を使用して暗号化および暗号化解除されます。 ACI のすべてのデプロイで有効になっているため、この暗号化を利用するために、デプロイまたはコンテナーを変更する必要はありません。 これには、デプロイに関するメタデータ、環境変数、コンテナーに渡されるキー、コンテナーが停止した後でも見られるように保持されるログが含まれます。 暗号化によってコンテナー グループのパフォーマンスが影響を受けることはなく、暗号化に追加コストはかかりません。

Microsoft のマネージド キーを利用してコンテナー データを暗号化することも、独自のキーで暗号化を管理することもできます。 次の表では、これらのオプションを比較します。

Microsoft のマネージド キー カスタマー マネージド キー
暗号化/暗号化解除の操作 Azure Azure
キー記憶域 Microsoft キー ストア Azure Key Vault
キーのローテーションの責任 Microsoft Customer
キーへのアクセス Microsoft のみ Microsoft、顧客

この記事では、カスタマー マネージド キーを使用してデータを暗号化するための次の 2 つのフローを確認します。

  • 標準の Azure Key Vault に格納されているカスタマー マネージド キーを使用してデータを暗号化する
  • 信頼されたサービスが有効になっているネットワークで保護された Azure Key Vault に格納されているカスタマー マネージド キーを使用してデータを暗号化する。

標準の Azure Key Vault に格納されているカスタマー マネージド キーを使用してデータを暗号化する

前提条件

  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。

  • CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。

    • ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。

    • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

ACI 用のサービス プリンシパルを作成する

最初のステップでは、Azure テナントに、Azure Container Instances サービスへのアクセス許可を付与するためのサービス プリンシパルが割り当てられていることを確認します。

重要

次のコマンドを実行してサービス プリンシパルを正常に作成するには、お使いのテナントでサービス プリンシパルを作成するためのアクセス許可があることを確認します。

次の CLI コマンドを実行すると、Azure 環境に ACI の SP がセットアップされます。

az ad sp create --id 6bb8e274-af5d-4df2-98a3-4fd78b4cafd9

このコマンドを実行すると、"displayName": "Azure Container Instance Service" で設定されたサービス プリンシパルが表示されます。

サービス プリンシパルを正常に作成できない場合は、次のようにします。

  • テナントでこれを行うためのアクセス許可があることを確認します
  • ACI にデプロイするためのサービス プリンシパルがテナントに既に存在するかどうかを確認します。 そのためには、az ad sp show --id 6bb8e274-af5d-4df2-98a3-4fd78b4cafd9 を実行し、代わりにそのサービス プリンシパルを使用します

Key Vault リソースを作成する

Azure portalAzure CLI、または Azure PowerShell を使用して、Azure Key Vault を作成します。

キー コンテナーのプロパティについては、次のガイドラインを使用します。

  • 名前:一意の名前が必要です。
  • サブスクリプション:サブスクリプションを選択します。
  • [リソース グループ] で、既存のリソース グループを選択するか、新しく作成してリソース グループ名を入力します。
  • [場所] プルダウン メニューで、場所を選択します。
  • 他のオプションは、既定値のままにしておいても、追加の要件に基づいて選択してもかまいません。

重要

カスタマー マネージド キーを使用して ACI のデプロイ テンプレートを暗号化する場合は、キー コンテナーで [論理的な削除] と [Do Not Purge](消去しない) の 2 つのプロパティを設定することをお勧めします。 これらのプロパティは既定では有効になっていませんが、新規または既存のキー コンテナーに対して PowerShell または Azure CLI を使用して有効にすることができます。

新しいキーを生成する

キー コンテナーが作成されたら、Azure portal でリソースに移動します。 リソース ブレードの左側のナビゲーション メニューで、[設定] の [キー] をクリックします。 [キー] のビューで、[生成/インポート] をクリックして新しいキーを生成します。 このキーに対する一意の名前を指定し、他の設定は必要に応じて使用します。

新しいキーを生成する

アクセス ポリシーを設定する

ACI サービスによるキーへのアクセスを許可するための、新しいアクセス ポリシーを作成します。

  • キーが生成されたら、キー コンテナー リソース ブレードに戻り、[設定] の下にある [アクセス ポリシー] をクリックします。
  • キー コンテナーの [アクセス ポリシー] ページで、 [アクセス ポリシーの追加] をクリックします。
  • [キーのアクセス許可] を、[取得][キーの折り返しを解除]キーのアクセス許可を設定する を含むように設定します
  • [プリンシパルの選択] で、Azure Container Instance Service を選択します
  • 下部にある [追加] をクリックします

アクセス ポリシーがお使いのキー コンテナーのアクセス ポリシーに表示されるようになります。

新しいアクセス ポリシー

JSON デプロイ テンプレートを変更する

重要

カスタマー マネージド キーによるデプロイ データの暗号化は、現在ロールアウト中の最新の API バージョン (2019-12-01) で使用できます。デプロイ テンプレートでこの API バージョンを指定してください。 これに関して何か問題がある場合は、Azure サポートにご連絡ください。

キー コンテナーのキーとアクセス ポリシーを設定した後は、次のプロパティを ACI のデプロイ テンプレートに追加します。 テンプレートを使用した ACI リソースのデプロイについて詳しくは、「チュートリアル: Resource Manager テンプレートを使用してマルチコンテナー グループをデプロイする」のテンプレートを編集した完全なテンプレートです。

  • resources の下で、apiVersion2019-12-01 に設定します。
  • デプロイ テンプレートのコンテナー グループ プロパティ セクションに、次の値を含む encryptionProperties を追加します。
    • vaultBaseUrl: お使いのキー コンテナーの DNS 名。ポータルのキー コンテナー リソースの概要ブレードで確認できます。
    • keyName: 前に生成したキーの名前。
    • keyVersion: スキーマの現在のバージョン。 これは、キー自体をクリックして確認できます (キー コンテナー リソースの [設定] セクションの [キー] の下)
  • コンテナー グループのプロパティの下に、Standard プロパティと値 sku を追加します。 API version 2019-12-01 では sku プロパティは必須です。

次のテンプレート スニペットは、デプロイ データを暗号化するための追加のプロパティを示しています。

[...]
"resources": [
    {
        "name": "[parameters('containerGroupName')]",
        "type": "Microsoft.ContainerInstance/containerGroups",
        "apiVersion": "2019-12-01",
        "location": "[resourceGroup().location]",    
        "properties": {
            "encryptionProperties": {
                "vaultBaseUrl": "https://example.vault.azure.net",
                "keyName": "acikey",
                "keyVersion": "xxxxxxxxxxxxxxxx"
            },
            "sku": "Standard",
            "containers": {
                [...]
            }
        }
    }
]

次に示すのは、「チュートリアル: Resource Manager テンプレートを使用してマルチコンテナー グループをデプロイする」のテンプレートを編集した完全なテンプレートです。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "containerGroupName": {
      "type": "string",
      "defaultValue": "myContainerGroup",
      "metadata": {
        "description": "Container Group name."
      }
    }
  },
  "variables": {
    "container1name": "aci-tutorial-app",
    "container1image": "mcr.microsoft.com/azuredocs/aci-helloworld:latest",
    "container2name": "aci-tutorial-sidecar",
    "container2image": "mcr.microsoft.com/azuredocs/aci-tutorial-sidecar"
  },
  "resources": [
    {
      "name": "[parameters('containerGroupName')]",
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2019-12-01",
      "location": "[resourceGroup().location]",
      "properties": {
        "encryptionProperties": {
            "vaultBaseUrl": "https://example.vault.azure.net",
            "keyName": "acikey",
            "keyVersion": "xxxxxxxxxxxxxxxx"
        },
        "sku": "Standard",  
        "containers": [
          {
            "name": "[variables('container1name')]",
            "properties": {
              "image": "[variables('container1image')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGb": 1.5
                }
              },
              "ports": [
                {
                  "port": 80
                },
                {
                  "port": 8080
                }
              ]
            }
          },
          {
            "name": "[variables('container2name')]",
            "properties": {
              "image": "[variables('container2image')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGb": 1.5
                }
              }
            }
          }
        ],
        "osType": "Linux",
        "ipAddress": {
          "type": "Public",
          "ports": [
            {
              "protocol": "tcp",
              "port": "80"
            },
            {
                "protocol": "tcp",
                "port": "8080"
            }
          ]
        }
      }
    }
  ],
  "outputs": {
    "containerIPv4Address": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.ContainerInstance/containerGroups/', parameters('containerGroupName'))).ipAddress.ip]"
    }
  }
}

リソースをデプロイする

デスクトップ上でテンプレート ファイルを作成および編集した場合は、そのファイルをドラッグすることによって Cloud Shell ディレクトリにアップロードできます。

az group create コマンドを使用して、リソース グループを作成します。

az group create --name myResourceGroup --location eastus

az deployment group create コマンドを使用してテンプレートをデプロイします。

az deployment group create --resource-group myResourceGroup --template-file deployment-template.json

数秒以内に、Azure から最初の応答を受信します。 デプロイが完了すると、ACI サービスによって保持されているそのデプロイに関連したデータはすべて、指定したキーで暗号化されます。

信頼されたサービスが有効になっているネットワークで保護された Azure Key Vault でカスタマー マネージド キーを使用してデータを暗号化する

Key Vault リソースを作成する

Azure portalAzure CLI、または Azure PowerShell を使用して、Azure Key Vault を作成します。 まず、必要なキーをコンテナーに追加できるように、ネットワーク制限を適用しないでください。 以降の手順では、ネットワーク制限を追加し、信頼できるサービスを有効にします。

キー コンテナーのプロパティについては、次のガイドラインを使用します。

  • 名前:一意の名前が必要です。
  • サブスクリプション:サブスクリプションを選択します。
  • [リソース グループ] で、既存のリソース グループを選択するか、新しく作成してリソース グループ名を入力します。
  • [場所] プルダウン メニューで、場所を選択します。
  • 他のオプションは、既定値のままにしておいても、追加の要件に基づいて選択してもかまいません。

重要

カスタマー マネージド キーを使用して ACI のデプロイ テンプレートを暗号化する場合は、キー コンテナーで [論理的な削除] と [Do Not Purge](消去しない) の 2 つのプロパティを設定することをお勧めします。 これらのプロパティは既定では有効になっていませんが、新規または既存のキー コンテナーに対して PowerShell または Azure CLI を使用して有効にすることができます。

新しいキーを生成する

キー コンテナーが作成されたら、Azure portal でリソースに移動します。 リソース ブレードの左側のナビゲーション メニューで、[設定] の [キー] をクリックします。 [キー] のビューで、[生成/インポート] をクリックして新しいキーを生成します。 このキーに対する一意の名前を指定し、他の設定は必要に応じて使用します。 以降の手順では、必ずキー名とバージョンをキャプチャしてください。

キー作成設定 (PNG) のスクリーンショット。

コンテナー グループのユーザー割り当てマネージド ID を作成する

az identity create コマンドを使用して、サブスクリプション内に ID を作成します。 Key Vault の作成に使ったのと同じリソース グループを使用することも、別のものを使用することもできます。

az identity create \
  --resource-group myResourceGroup \
  --name myACIId

後続のステップで ID を使用するために、az identity show コマンドを使って ID のサービス プリンシパル ID とリソース ID を変数に格納します。

# Get service principal ID of the user-assigned identity
spID=$(az identity show \
  --resource-group myResourceGroup \
  --name myACIId \
  --query principalId --output tsv)

アクセス ポリシーを設定する

ユーザー割り当て ID で暗号化のためにキーにアクセスしたり、ラップ解除したりできるようにするための新しいアクセス ポリシーを作成します。

az keyvault set-policy \
    --name mykeyvault \
    --resource-group myResourceGroup \
    --object-id $spID \
    --key-permissions get unwrapKey

Azure Key Vault のネットワーク アクセス許可を変更する

次のコマンドは、Azure Key Vault 向けに Azure Firewall を設定し、ACI アクセスなどの Azure の信頼されたサービスを許可します。

az keyvault update \
    --name mykeyvault \
    --resource-group myResourceGroup \
    --default-action Deny
az keyvault update \
    --name mykeyvault \
    --resource-group myResourceGroup \
    --bypass AzureServices

JSON デプロイ テンプレートを変更する

重要

カスタマー マネージド キーによるデプロイ データの暗号化は、2022-09-01 API バージョン以降で使用できます。 2022-09-01 API バージョンは、ARM または REST 経由でのみ使用できます。 これに関して何か問題がある場合は、Azure サポートにご連絡ください。 キー コンテナーのキーとアクセス ポリシーを設定した後は、次のプロパティを ACI のデプロイ テンプレートに追加します。 テンプレートを使用した ACI リソースのデプロイについて詳しくは、「チュートリアル: Resource Manager テンプレートを使用してマルチコンテナー グループをデプロイする」のテンプレートを編集した完全なテンプレートです。

  • resources の下で、apiVersion2022-09-01 に設定します。
  • デプロイ テンプレートのコンテナー グループ プロパティ セクションに、次の値を含む encryptionProperties を追加します。
    • vaultBaseUrl: キー コンテナーの DNS 名。 ポータルのキー コンテナー リソースの概要ブレードで確認できます
    • keyName: 前に生成したキーの名前。
    • keyVersion: スキーマの現在のバージョン。 これは、キー自体をクリックして確認できます (キー コンテナー リソースの [設定] セクションの [キー] の下)
    • identity: これは、前に作成したマネージド ID インスタンスのリソース URI です
  • コンテナー グループのプロパティの下に、Standard プロパティと値 sku を追加します。 API バージョン 2022-09-01 では sku プロパティは必須です。
  • リソースの下に、次の値を含む、ACI でマネージド ID を使用するために必要な identity オブジェクトを追加します。
    • type: 使用されている ID の種類 (ユーザー割り当てまたはシステム割り当て)。 このケースでは "UserAssigned" に設定されます
    • userAssignedIdentities: 上記の encryptionProperties オブジェクトで使用したのと同じユーザー割り当て ID のリソース URI。

次のテンプレート スニペットは、デプロイ データを暗号化するための追加のプロパティを示しています。

[...]
"resources": [
    {
        "name": "[parameters('containerGroupName')]",
        "type": "Microsoft.ContainerInstance/containerGroups",
        "apiVersion": "2019-12-01",
        "location": "[resourceGroup().location]",    
        "identity": {
         "type": "UserAssigned",
         "userAssignedIdentities": {
           "/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId": {}
         }
        },
        "properties": {
            "encryptionProperties": {
                "vaultBaseUrl": "https://example.vault.azure.net",
                "keyName": "acikey",
                "keyVersion": "xxxxxxxxxxxxxxxx",
                "identity": "/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId"
            },
            "sku": "Standard",
            "containers": {
                [...]
            }
        }
    }
]

次に示すのは、「チュートリアル: Resource Manager テンプレートを使用してマルチコンテナー グループをデプロイする」のテンプレートを編集した完全なテンプレートです。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "containerGroupName": {
      "type": "string",
      "defaultValue": "myContainerGroup",
      "metadata": {
        "description": "Container Group name."
      }
    }
  },
  "variables": {
    "container1name": "aci-tutorial-app",
    "container1image": "mcr.microsoft.com/azuredocs/aci-helloworld:latest",
    "container2name": "aci-tutorial-sidecar",
    "container2image": "mcr.microsoft.com/azuredocs/aci-tutorial-sidecar"
  },
  "resources": [
    {
      "name": "[parameters('containerGroupName')]",
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2022-09-01",
      "location": "[resourceGroup().location]",
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId": {}
        }
      },
      "properties": {
        "encryptionProperties": {
          "vaultBaseUrl": "https://example.vault.azure.net",
          "keyName": "acikey",
          "keyVersion": "xxxxxxxxxxxxxxxx",
          "identity": "/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId"
        },
        "sku": "Standard",
        "containers": [
          {
            "name": "[variables('container1name')]",
            "properties": {
              "image": "[variables('container1image')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGb": 1.5
                }
              },
              "ports": [
                {
                  "port": 80
                },
                {
                  "port": 8080
                }
              ]
            }
          },
          {
            "name": "[variables('container2name')]",
            "properties": {
              "image": "[variables('container2image')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGb": 1.5
                }
              }
            }
          }
        ],
        "osType": "Linux",
        "ipAddress": {
          "type": "Public",
          "ports": [
            {
              "protocol": "tcp",
              "port": "80"
            },
            {
              "protocol": "tcp",
              "port": "8080"
            }
          ]
        }
      }
    }
  ],
  "outputs": {
    "containerIPv4Address": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.ContainerInstance/containerGroups/', parameters('containerGroupName'))).ipAddress.ip]"
    }
  }
}

リソースをデプロイする

デスクトップ上でテンプレート ファイルを作成および編集した場合は、そのファイルをドラッグすることによって Cloud Shell ディレクトリにアップロードできます。

az group create コマンドを使用して、リソース グループを作成します。

az group create --name myResourceGroup --location eastus

az deployment group create コマンドを使用してテンプレートをデプロイします。

az deployment group create --resource-group myResourceGroup --template-file deployment-template.json

数秒以内に、Azure から最初の応答を受信します。 デプロイが完了すると、ACI サービスによって保持されているそのデプロイに関連したデータはすべて、指定したキーで暗号化されます。