次の方法で共有


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

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

[前提条件]

管理されたアイデンティティー

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

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

  • システム割り当てマネージド ID はアプリケーションに割り当てられ、アプリが削除されると削除されます。 1 つのアプリに割り当てることができるシステム割り当てマネージド ID は 1 つだけです。
  • ユーザー割り当てマネージド 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 を選択します。
    • リージョン: 米国東部などのリージョンを選択します。
    • 名前: demokeyvaultmi など、ユーザー割り当てマネージド ID の名前を入力します。
  4. [Review + create](レビュー + 作成) を選択します。
  5. 検証に成功が表示されたら、[作成] を選択します。

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

ロールの割り当てを作成する

キー ボールトに対して 2 つのロール割り当てを作成する必要があります。 詳細については、 Azure portal を使用した Azure ロールの割り当てに関するページを参照してください。

マネージドIDにキー保管庫のキー権限を付与する

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

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

アカウントの役割の割り当てを作成する

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

  1. 次のロールを割り当てます。
    • ロール: Key Vault 暗号担当者
    • アクセスを割り当てる: ユーザー、グループ、またはサービス プリンシパル
    • メンバー: 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 を選択します。
    • リージョン: 米国東部などのリージョンを選択します。
    • 名前: demomanagedappmi など、ユーザー割り当てマネージド ID の名前を入力します。
  4. [Review + create](レビュー + 作成) を選択します。
  5. 検証に成功が表示されたら、[作成] を選択します。

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

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

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

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

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

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

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

マネージド アプリケーションをサービス カタログに発行するには、次のタスクを実行します。

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

テンプレート createUiDefinition.json の作成

次のテンプレートは、マネージド アプリケーションのユーザー割り当てマネージド ID を作成します。 この例では、キー コンテナーのマネージド ID に対する Managed Identity Operator のアクセス許可を使用して、ユーザー割り当てマネージド 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 ファイルは次の例と一致する必要があります。 metadataversiontemplateHashプロパティの値が異なる場合があります。

{
  "$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 を追加します。

ユーザー割り当てマネージド ID を追加するための [アプリケーション設定] タブのスクリーンショット。

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

カスタマー マネージド キーを有効にし、キー コンテナーの URL とキー名を追加し、ユーザー割り当てマネージド ID を追加するための構成のスクリーンショット。

デプロイメントを確認する

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

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

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

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

次のステップ