Share via


カスタマー マネージド キーで暗号化されたストレージ アカウントをデプロイする Azure マネージド アプリケーションを作成する

この記事では、カスタマー マネージド キーを使用して暗号化されたストレージ アカウントをデプロイする Azure マネージド アプリケーションを作成する方法について説明します。 ストレージ アカウント、Cosmos DB、Azure Database for Postgres では、カスタマー マネージド キーまたは Microsoft マネージド キーを使用した保存データの暗号化がサポートされています。 独自の暗号化キーを使用して、ストレージ アカウントのデータを保護できます。 カスタマー マネージド キーを指定すると、データを暗号化するキーへのアクセスを保護および制御するために、そのキーが使用されます。 カスタマー マネージド キーを使用すると、アクセス制御をより柔軟に管理できます。

前提条件

マネージド ID

マネージド アプリケーションによってデプロイされたストレージ アカウントのカスタマー マネージド キーをマネージド リソース グループ内のリソースとして構成するには、ユーザー割り当てマネージド ID が必要です。 このユーザー割り当てマネージド ID を使用して、マネージド アプリケーションに他の既存のリソースへのアクセスを付与できます。 ユーザー割り当てマネージド ID を使用してマネージド アプリケーションを構成する方法については、マネージド ID を持つ Azure マネージド アプリケーションに関するページを参照してください。

アプリケーションには 2 種類の ID を付与できます。

  • システム割り当てマネージド ID はアプリケーションに割り当てられているため、アプリが削除されると削除されます。 アプリは 1 つのシステム割り当てマネージド ID しか持つことはできません。
  • ユーザー割り当てマネージド ID は、アプリに割り当てることができるスタンドアロン Azure リソースです。 アプリは複数のユーザー割り当てマネージド ID を持つことができます。

既存のキー コンテナーのカスタマー キーで暗号化されたマネージド アプリケーションのマネージド リソース グループにストレージ アカウントをデプロイするには、追加の構成が必要です。 マネージド アプリケーションで構成されたマネージド ID には、キー コンテナーにアクセスできるマネージド ID に対して、組み込みの Azure ロールベースのアクセス制御 マネージド ID オペレーター が必要です。 詳細については、「マネージド ID オペレーター ロール」を参照してください。

消去保護を使用してキー コンテナーを作成する

  1. Azure portal にサインインします。
  2. Azure portal メニューまたは [ホーム] ページで、 [リソースの作成] を選択します。
  3. 検索ボックスに「Key Vault」と入力します。
  4. 結果の一覧から [Key Vault] を選択します。
  5. [Key Vault] セクションで [作成] を選択します。
  6. [キー コンテナーの作成] セクションで、次の情報を入力します。
    • [サブスクリプション]:サブスクリプションを選択します。
    • リソース グループ: [新規作成] を選択し、demo-cmek-rg などの名前を入力します。
    • [名前]: demo-keyvault-cmek など、一意の名前が必要です。
    • [リージョン]: 米国東部などの場所を選択します。
    • [価格レベル]: ドロップダウン リストから [Standard] を選択します。
    • [消去保護]: [消去保護を有効にします] を選択します。
  7. [次へ] を選択し、[アクセス ポリシー] タブに移動します。
    • [アクセス構成]: [Azure ロールベースのアクセス制御] を選択します。
    • 他のすべてのオプションについては、既定値をそのまま使用します。
  8. [Review + create](レビュー + 作成) を選択します。
  9. 設定が正しいことを確認し、[作成] を選択します。

デプロイが成功したら、[リソースに移動] を選択します。 [概要] タブで、次のプロパティをメモします。

  • [コンテナー名]: この例では、コンテナー名は demo-keyvault-cmek です。 この名前は他の手順で使用します。
  • [コンテナー URI]: この例では、コンテナー URI は https://demo-keyvault-cmek.vault.azure.net/ です。

ユーザー割り当てマネージド ID を作成する

ユーザー割り当てマネージド ID を作成するには、お使いのアカウントにマネージド ID 共同作成者ロールの割り当てが必要です。

  1. 検索ボックスに、「マネージド ID」と入力します。
  2. [サービス] の下で、[マネージド ID] を選択します。
  3. [作成] を選択し、[基本] タブに次の値を入力します。
    • [サブスクリプション]:サブスクリプションを選択します。
    • [リソース グループ]: 前の手順で作成したリソース グループ demo-cmek-rg を選択します。
    • [リージョン]: [米国東部] などのリージョンを選択します。
    • [名前]: ユーザー割り当てマネージド ID の名前です。たとえば、demokeyvaultmi とします。
  4. [Review + create](レビュー + 作成) を選択します。
  5. [検証に成功しました] が表示されたら、[作成] を選択します。

デプロイが成功したら、[リソースに移動] を選択します。

ロールの割り当ての作成

キー コンテナーに対して 2 つのロールの割り当てを作成する必要があります。 詳細については、「Azure portal を使用して Azure ロールを割り当てる」を参照してください。

マネージド ID にキー コンテナーに対するキー アクセス許可を付与する

キー コンテナーのマネージド ID demokeyvaultmi のロール割り当てを作成して、キーをラップおよびラップ解除します。

  1. キー コンテナーの demo-cmek-keyvault に移動します。
  2. [アクセス制御 (IAM)] を選択します。
  3. [追加]>[ロール割り当ての追加] の順に選択します。
  4. 次のロールを割り当てます。
    • [ロール]: Key Vault Crypto Service Encryption User
    • [アクセスの割り当て先]: マネージド ID
    • [メンバー]: demokeyvaultmi
  5. [確認と割り当て] を選択して設定を表示します。
  6. [確認と割り当て] を選択して、ロールの割り当てを作成します。

アカウントのロールの割り当てを作成する

アカウントがキー コンテナーに新しいキーを作成できるように、別のロールの割り当てを作成します。

  1. 次のロールを割り当てます。
    • [ロール]: Key Vault Crypto Officer
    • [アクセスの割り当て先]: ユーザー、グループ、またはサービス プリンシパル
    • メンバー: Microsoft Entra アカウント
  2. [確認と割り当て] を選択して設定を表示します。
  3. [確認と割り当て] を選択して、ロールの割り当てを作成します。

キー コンテナーのロールの割り当ては、[アクセス制御 (IAM)]>[ロールの割り当て] で確認できます。

キーの作成

キー コンテナーがストレージ アカウントの暗号化に使用するキーを作成する必要があります。

  1. キー コンテナーの demo-cmek-keyvault に移動します。
  2. [キー] を選択します。
  3. [Generate/Import](生成/インポート) を選択します。
  4. [キーの作成] ページで、次の値を選択します。
    • [オプション]: 生成
    • [名前]: demo-cmek-key
  5. 他のオプションについては、既定値をそのまま使用します。
  6. [作成] を選択します。

キーの名前をメモします。 マネージド アプリケーションをデプロイするときに使用します。

マネージド アプリケーションのユーザー割り当てマネージド ID を作成する

マネージド アプリケーションのマネージド ID として使用するユーザー割り当てマネージド ID を作成します。

  1. 検索ボックスに、「マネージド ID」と入力します。
  2. [サービス] の下で、[マネージド ID] を選択します。
  3. [作成] を選択します。
    • [サブスクリプション]:サブスクリプションを選択します。
    • [リソース グループ]: リソース グループ demo-cmek-rg を選択します。
    • [リージョン]: [米国東部] などのリージョンを選択します。
    • [名前]: ユーザー割り当てマネージド ID の名前です。たとえば、demomanagedappmi とします。
  4. [Review + create](レビュー + 作成) を選択します。
  5. [検証に成功しました] が表示されたら、[作成] を選択します。

デプロイが成功したら、[リソースに移動] を選択します。

マネージド ID にロールのアクセス許可を割り当てる

demokeyvaultmi という名前のユーザー割り当てマネージド ID のスコープで、マネージド ID オペレーター ロールをマネージド ID に割り当てます。

  1. demokeyvaultmi という名前のユーザー割り当てマネージド ID に移動します。
  2. [アクセス制御 (IAM)] を選択します。
  3. [追加]>[ロールの割り当ての追加] を選択して、[ロールの割り当ての追加] ページを開きます。
  4. 次のロールを割り当てます。
    • [ロール]: Managed Identity Operator
    • [アクセスの割り当て先]: マネージド ID
    • [メンバー]: demomanagedappmi
  5. [確認と割り当て] を選択して設定を表示します。
  6. [確認と割り当て] を選択して、ロールの割り当てを作成します。

demokeyvaultmi のロールの割り当ては、[アクセス制御 (IAM)]>[ロールの割り当て] で確認できます。

マネージド アプリケーション テンプレートのサンプル

マネージド リソース グループにストレージ アカウントをデプロイするマネージド アプリケーションを作成し、既存のキー コンテナーのキーを使用してストレージ アカウント内のデータを暗号化します。

サービス カタログにマネージド アプリケーションを発行するには、次の操作を行う必要があります。

  1. この記事のサンプルから creatUIDefinition.json ファイルを作成します。 テンプレートは、マネージド アプリケーションをデプロイするときにポータルのユーザー インターフェイス要素を定義します。
  2. この記事の Bicep ファイルを JSON に変換して、mainTemplate.json という名前の Azure Resource Manager テンプレートを作成します。 テンプレートは、マネージド アプリケーションでデプロイするリソースを定義します。
  3. 必要な JSON ファイルを含む .zip パッケージを作成します: createUiDefinition.jsonmainTemplate.json
  4. マネージド アプリケーション定義を発行し、サービス カタログで使用できるようにする。 詳細については、「クイック スタート: Azure マネージド アプリケーションの定義を作成および発行する」を参照してください。

テンプレート createUiDefinition.json を作成する

次のテンプレートは、マネージド アプリケーションのユーザー割り当てマネージド ID を作成します。 この例では、キー コンテナーのマネージド ID に対するマネージド ID オペレーターのアクセス許可を使用してユーザー割り当てマネージド ID を事前に構成する必要があるため、システム割り当てマネージド ID を無効にします。

  1. Visual Studio Code で、creatUIDefinition.json という名前の新しいファイルを作成します。
  2. 次のコードをコピーしてファイルに貼り付けます。
  3. ファイルを保存します。
{
  "$schema": "https://schema.management.azure.com/schemas/0.1.2-preview/CreateUIDefinition.MultiVm.json#",
  "handler": "Microsoft.Azure.CreateUIDef",
  "version": "0.1.2-preview",
  "parameters": {
    "basics": [],
    "steps": [
      {
        "name": "managedApplicationSetting",
        "label": "Application Settings",
        "subLabel": {
          "preValidation": "Configure your application settings and Managed Identity for the application",
          "postValidation": "Done"
        },
        "bladeTitle": "Application Settings - Config",
        "elements": [
          {
            "name": "appIdentity",
            "type": "Microsoft.ManagedIdentity.IdentitySelector",
            "label": "Managed Identity Configuration for the Application (Needs Managed Identity Operator permissions over KV Managed Identity).",
            "toolTip": {
              "systemAssignedIdentity": "Enable system assigned identity to grant the managed application access to additional existing resources.",
              "userAssignedIdentity": "Add user assigned identities to grant the managed application access to additional existing resources."
            },
            "defaultValue": {
              "systemAssignedIdentity": "Off"
            },
            "options": {
              "hideSystemAssignedIdentity": true,
              "hideUserAssignedIdentity": false,
              "readOnlySystemAssignedIdentity": true
            },
            "visible": true
          }
        ]
      },
      {
        "name": "configuration",
        "type": "Microsoft.Common.Section",
        "label": "Configuration",
        "elements": [
          {
            "name": "cmek",
            "type": "Microsoft.Common.Section",
            "label": "Customer Managed Encryption Key (CMEK)",
            "elements": [
              {
                "name": "cmekEnable",
                "type": "Microsoft.Common.CheckBox",
                "label": "Enable CMEK",
                "toolTip": "Enable to provide a CMEK",
                "constraints": {
                  "required": false
                }
              },
              {
                "name": "cmekKeyVaultUrl",
                "type": "Microsoft.Common.TextBox",
                "label": "Key Vault URL",
                "toolTip": "Specify the CMEK Key Vault URL",
                "defaultValue": "",
                "constraints": {
                  "required": "[steps('configuration').cmek.cmekEnable]",
                  "regex": ".*",
                  "validationMessage": "The value must not be empty."
                },
                "visible": "[steps('configuration').cmek.cmekEnable]"
              },
              {
                "name": "cmekKeyName",
                "type": "Microsoft.Common.TextBox",
                "label": "Key Name",
                "toolTip": "Specify the key name from your key vault.",
                "defaultValue": "",
                "constraints": {
                  "required": "[steps('configuration').cmek.cmekEnable]",
                  "regex": ".*",
                  "validationMessage": "The value must not be empty."
                },
                "visible": "[steps('configuration').cmek.cmekEnable]"
              },
              {
                "name": "cmekKeyIdentity",
                "type": "Microsoft.ManagedIdentity.IdentitySelector",
                "label": "Managed Identity Configuration for Key Vault Access",
                "toolTip": {
                  "systemAssignedIdentity": "Enable system assigned identity to grant the managed application access to additional existing resources.",
                  "userAssignedIdentity": "Add user assigned identities to grant the managed application access to additional existing resources."
                },
                "defaultValue": {
                  "systemAssignedIdentity": "Off"
                },
                "options": {
                  "hideSystemAssignedIdentity": true,
                  "hideUserAssignedIdentity": false,
                  "readOnlySystemAssignedIdentity": true
                },
                "visible": "[steps('configuration').cmek.cmekEnable]"
              }
            ],
            "visible": true
          }
        ]
      }
    ],
    "outputs": {
      "location": "[location()]",
      "managedIdentity": "[steps('managedApplicationSetting').appIdentity]",
      "cmekConfig": {
        "kvUrl": "[if(empty(steps('configuration').cmek.cmekKeyVaultUrl), '', steps('configuration').cmek.cmekKeyVaultUrl)]",
        "keyName": "[if(empty(steps('configuration').cmek.cmekKeyName), '', steps('configuration').cmek.cmekKeyName)]",
        "identityId": "[if(empty(steps('configuration').cmek.cmekKeyIdentity), '', steps('configuration').cmek.cmekKeyIdentity)]"
      }
    }
  }
}

テンプレート mainTemplate.json を作成する

次の Bicep ファイルは、mainTemplate.json のソース コードです。 テンプレートでは、createUiDefinition.json ファイルで定義されているユーザー割り当てマネージド ID が使用されます。

  1. Visual Studio Code で、mainTemplate.bicep という名前の新しいファイルを作成します。
  2. 次のコードをコピーしてファイルに貼り付けます。
  3. ファイルを保存します。
param cmekConfig object = {
  kvUrl: ''
  keyName: ''
  identityId: {}
}
@description('Specify the Azure region to place the application definition.')
param location string = resourceGroup().location
/////////////////////////////////
// Common Resources Configuration
/////////////////////////////////
var commonproperties = {
  name: 'cmekdemo'
  displayName: 'Common Resources'
  storage: {
    sku: 'Standard_LRS'
    kind: 'StorageV2'
    accessTier: 'Hot'
    minimumTlsVersion: 'TLS1_2'

  }
}
var identity = items(cmekConfig.identityId.userAssignedIdentities)[0].key

resource storage 'Microsoft.Storage/storageAccounts@2022-05-01' = {
  name: '${commonproperties.name}${uniqueString(resourceGroup().id)}'
  location: location
  sku: {
    name: commonproperties.storage.sku
  }
  kind: commonproperties.storage.kind
  identity: cmekConfig.identityId
  properties: {
    accessTier: commonproperties.storage.accessTier
    minimumTlsVersion: commonproperties.storage.minimumTlsVersion
    encryption: {
      identity: {
        userAssignedIdentity: identity
      }
      services: {
        blob: {
          enabled: true
        }
        table: {
          enabled: true
        }
        file: {
          enabled: true
        }
      }
      keySource: 'Microsoft.Keyvault'
      keyvaultproperties: {
        keyname: '${cmekConfig.keyName}'
        keyvaulturi: '${cmekConfig.kvUrl}'
      }
    }
  }
}

PowerShell または Azure CLI を使用して mainTemplate.json ファイルをビルドします。 Bicep ファイルを保存したディレクトリに移動し、build コマンドを実行します。

bicep build mainTemplate.bicep

Bicep ファイルを JSON に変換した後、mainTemplate.json ファイルは次の例と一致している必要があります。 versiontemplateHashmetadata プロパティの値が異なる場合があります。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": {
    "_generator": {
      "name": "bicep",
      "version": "0.16.2.56959",
      "templateHash": "1234567891234567890"
    }
  },
  "parameters": {
    "cmekConfig": {
      "type": "object",
      "defaultValue": {
        "kvUrl": "",
        "keyName": "",
        "identityId": {}
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Specify the Azure region to place the application definition."
      }
    }
  },
  "variables": {
    "commonproperties": {
      "name": "cmekdemo",
      "displayName": "Common Resources",
      "storage": {
        "sku": "Standard_LRS",
        "kind": "StorageV2",
        "accessTier": "Hot",
        "minimumTlsVersion": "TLS1_2"
      }
    },
    "identity": "[items(parameters('cmekConfig').identityId.userAssignedIdentities)[0].key]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-05-01",
      "name": "[format('{0}{1}', variables('commonproperties').name, uniqueString(resourceGroup().id))]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[variables('commonproperties').storage.sku]"
      },
      "kind": "[variables('commonproperties').storage.kind]",
      "identity": "[parameters('cmekConfig').identityId]",
      "properties": {
        "accessTier": "[variables('commonproperties').storage.accessTier]",
        "minimumTlsVersion": "[variables('commonproperties').storage.minimumTlsVersion]",
        "encryption": {
          "identity": {
            "userAssignedIdentity": "[variables('identity')]"
          },
          "services": {
            "blob": {
              "enabled": true
            },
            "table": {
              "enabled": true
            },
            "file": {
              "enabled": true
            }
          },
          "keySource": "Microsoft.Keyvault",
          "keyvaultproperties": {
            "keyname": "[format('{0}', parameters('cmekConfig').keyName)]",
            "keyvaulturi": "[format('{0}', parameters('cmekConfig').kvUrl)]"
          }
        }
      }
    }
  ]
}

マネージド アプリケーションのデプロイ

サービス カタログの定義が作成されたら、マネージド アプリケーションをデプロイできます。 詳細については、「クイックスタート: サービス カタログ マネージド アプリケーションのデプロイ」を参照してください。

デプロイ中は、ユーザー割り当てマネージド ID、キー コンテナー名、キー コンテナー URL、キー コンテナーのキー名を使用します。 createUiDefinition.json ファイルは、use インターフェイスを作成します。

たとえば、ポータルのデプロイでは、[アプリケーション設定] タブで demomanagedappmi を追加します。

Screenshot of the Application Settings tab to add a user-assigned managed identity.

[構成] タブで、カスタマー マネージド キーを有効にし、キー コンテナー demokeyvaultmi のユーザー割り当てマネージド ID を追加します。 また、作成したキー コンテナーの URL とキー コンテナーのキー名も指定します。

Screenshot of the Configuration to enable the customer-managed key, add key vault URL and key name, and add a user-assigned managed identity.

デプロイを検証する

デプロイが完了したら、マネージド アプリケーションの ID 割り当てを確認できます。 ユーザー割り当てマネージド ID demomanagedappmi がマネージド アプリケーションに割り当てられます。

  1. マネージド アプリケーションをデプロイしたリソース グループに移動します。
  2. [設定]>[ID][ユーザー割り当て (プレビュー)] を選択します。

マネージド アプリケーションがデプロイしたストレージ アカウントを確認することもできます。 [暗号化] タブには、ユーザー割り当てマネージド ID のキー demo-cmek-key とリソース ID が表示されます。

  1. マネージド アプリケーションのストレージ アカウントがデプロイされているマネージド リソース グループに移動します。
  2. [セキュリティとネットワーク] で、[暗号化] を選択します。

次のステップ