Azure AI Search でデータ暗号化用にカスタマー マネージド キーを構成する

Azure AI Search は、 サービスマネージド キーを使用して保存データを自動的に暗号化します。 保護を強化する必要がある場合は、Azure Key Vault 内で作成して管理するキーを使用して、既定の暗号化を別の暗号化レイヤーで補完できます。

この記事では、カスタマー マネージド キー (CMK) または "Bring-Your-Own-Key" (BYOK) の暗号化を設定する手順について説明します。 次の点にご注意ください。

  • CMK 暗号化は、個々のオブジェクトに対して適用されます。 検索サービス全体で CMK が必要な場合は、適用ポリシーを設定します

  • CMK 暗号化は Azure Key Vault に依存します。 独自の暗号化キーを作成してキー コンテナーに格納したり、Azure Key Vault の API を使用して暗号化キーを生成したりできます。 Azure Key Vault は Azure AI Search と同じサブスクリプション/テナントにある必要があります。 Azure AI Search では、システムまたはユーザーマネージドの ID を介して接続し、マネージド キーを取得します。 この動作では、両方のサービスで同じテナントを共有する必要があります。

  • CMK 暗号化は、オブジェクトが作成されるときに操作可能になります。 既に存在するオブジェクトを暗号化することはできません。 CMK 暗号化は、オブジェクトがディスクに保存されるたびに発生します。長期ストレージの場合は保存データ、短期ストレージの場合は一時データのいずれかです。 CMK では、ディスクに暗号化されていないデータが表示されることはありません。

Note

インデックスが CMK で暗号化されている場合、検索サービスでキーにアクセスできる場合にのみ、そのインデックスにアクセスできます。 アクセスが取り消された場合、インデックスは使用できず、インデックスが削除されるか、キーへのアクセスが復元されるまで、サービスをスケーリングできません。

CMK 暗号化されたオブジェクト

暗号化できるオブジェクトには、インデックス、シノニム リスト、インデクサー、データ ソース、スキルセットがあります。 暗号化すると復号に評価コストがかかるため、機密性の高いコンテンツのみが暗号化されます。

暗号化は、次のコンテンツに対して実行されます。

  • 説明を含む、インデックスとシノニム リスト内のすべてのコンテンツ。

  • インデクサー、データ ソース、スキルセットについては、接続文字列、説明、キー、ユーザー入力を格納するフィールドのみが暗号化されます。 たとえば、スキルセットには Azure AI サービス キーがあり、一部のスキルではカスタム エンティティなどのユーザー入力が受け取られます。 どちらの場合も、キーとスキルへのユーザー入力は暗号化されます。

完全な二重暗号化

CMK 暗号化を導入すると、コンテンツが 2 回暗号化されます。 前のセクションで説明したオブジェクトとフィールドの場合、コンテンツは最初に CMK で暗号化され、次に Microsoft マネージド キーを使用して暗号化されます。 コンテンツは、長期ストレージ用のデータ ディスクと、短期ストレージに使用される一時ディスク上で二重に暗号化されます。

CMK での暗号化を有効にすると、インデックスのサイズが増加し、クエリのパフォーマンスが低下します。 これまでの観測に基づくと、実際のパフォーマンスはインデックスの定義やクエリの種類によって異なりますが、クエリ時間が 30 から 60 パーセント増加することが予想されます。 パフォーマンスが低下するため、この機能をインデックスに対して有効にするのは、実際に必要な場合のみにすることをお勧めします。

二重暗号化は、すべてのリージョンで使用できるようになりましたが、サポートは 2 つのフェーズでロール アウトされました。

  • 最初のロールアウトは 2020 年 8 月 1 日に行われ、以下に示す 5 つのリージョンが含まれていました。 次のリージョンで作成された検索サービスでは、データ ディスクの CMK がサポートされていましたが、一時ディスクはサポートされていませんでした。

    • 米国西部 2
    • 米国東部
    • 米国中南部
    • US Gov バージニア州
    • US Gov アリゾナ
  • 2021 年 5 月 13 日の 2 回目のロールアウトでは、一時ディスクの暗号化が追加され、CMK 暗号化がすべてのサポートされているリージョンへ拡張されました。

    最初のロールアウト中に作成されたサービスから CMK を使用していて、一時ディスクに対する CMK 暗号化も必要な場合は、選択したリージョンで新しい検索サービスを作成し、コンテンツを再デプロイする必要があります。

前提条件

このシナリオでは、以下のツールとサービスが使用されます。

暗号化されたオブジェクトを作成できる検索クライアントが必要です。 このコードでは、キー コンテナーのキーとアプリケーションの登録情報を参照します。 このコードは、動作しているアプリや、C# コードサンプル DotNetHowToEncryptionUsingCMK などのプロトタイプ コードなどになります。

ヒント

REST クライアントまたは Azure PowerShell を使用して、暗号化キー パラメーターを含むインデックスおよび同意語マップを作成できます。 Azure SDK を使用することもできます。 インデックスまたはシノニム マップにポータルでキーを追加することはサポートされていません。

Key Vault に関するヒント

Azure Key Vault を初めて使用する場合は、このクイック スタート「PowerShell を使用して Azure Key Vault との間でシークレットの設定と取得を行う」を参照して、基本的なタスクについてご確認ください。 Key Vault を使用するときのヒントを次に示します。

  • 必要な数のキー コンテナーを使用します。 マネージド キーは異なるキー コンテナーに配置できます。 それぞれが異なるカスタマー マネージド暗号化キーで暗号化されて異なるキー コンテナーに格納されている、複数の暗号化されたオブジェクトに 1 つの検索サービスで対応できます。

  • キーの使用状況を監視できるように、Key Vault でログを有効にします

  • キー コンテナー キーと Active Directory アプリケーション シークレットの定期的なローテーションおよび登録時には、必ず厳密な手順に従います。 必ず、暗号化されたコンテンツすべてを新しいシークレットとキーを使用するように更新してから、古いものを削除します。 この手順を実行しないと、コンテンツの暗号化を解除できません。

1 - 消去保護の有効化

最初のステップとして、キー コンテナーで論理的な削除消去保護が有効になっていることを確認します。 カスタマー マネージド キーを使用する暗号化の性質上、Azure Key Vault キーが削除された場合、データを取得できません。

Key Vault キーの誤った削除によるデータ損失を防ぐため、キー コンテナーで論理的な削除と消去保護を有効にする必要があります。 論理的な削除は既定で有効になっているため、この機能を意図的に無効にした場合にのみ問題が発生します。 消去保護は既定では有効になっていませんが、Azure AI Search のカスタマー マネージド キー暗号化に必要です。

ポータル、PowerShell、または Azure CLI コマンドを使用して、両方のプロパティを設定できます。

  1. Azure portal にサインインして、キー コンテナーの概要ページを開きます。

  2. [概要] ページの [Essentials] で、[論理的な削除][消去保護] を有効にします。

2 - キー コンテナー内のキーの作成

使用する Azure Key Vault にキーが既に存在するが、キー識別子を収集する場合は、キーの生成をスキップします。 この情報は、暗号化されたオブジェクトを作成するときに必要です。

  1. Azure portal にサインインして、キー コンテナーの概要ページを開きます。

  2. 左側の [キー] を選択し、[+ 生成/インポート] を選択します。

  3. [キーの作成] ウィンドウで、[オプション] 一覧から、キーの作成に使用する方法を選択します。 新しいキーを生成したり、既存のキーをアップロードしたり、キーのバックアップを選択してバックアップを復元したりできます。

  4. キーの [名前] を入力し、必要に応じてその他のキー プロパティを選択します。

  5. [作成] を選択してデプロイを開始します。

  6. キーを選択し、現在のバージョンを選択してから、キー識別子をメモしておきます。 これは、キー値の URIキー名キー バージョンで構成されます。 Azure AI Search で暗号化されたインデックスを定義するには、識別子が必要です。

    新しい Key Vault キーを作成する

3 - セキュリティ プリンシパルを作成する

実行時に暗号化キーにアクセスするには、いくつかのオプションがあります。 最も簡単な方法は、検索サービスのマネージド ID とアクセス許可を使用してキーを取得することです。 システムまたはユーザーのマネージド ID を使用できます。 そうすることで、アプリケーション登録とアプリケーション シークレットの手順を省略し、暗号化キー定義を簡略化できます。

または、Microsoft Entra アプリケーションを作成して登録できます。 この検索サービスでは、要求に応じてアプリケーション ID が提供されます。

マネージド ID を使用すると、コードに資格情報 (ApplicationID や ApplicationSecret) を格納することなく、検索サービスで Azure Key Vault に対する認証を行うことができます。 この種類のマネージド ID のライフサイクルは、検索サービスのライフサイクルに関連付けられます。そのため、割り当てることのできるマネージド ID は 1 つだけです。 マネージド ID が機能する方法について詳しくは、「Azure リソースのマネージド ID とは」を参照してください。

  1. 検索サービスを信頼されたサービスにします。

    システム割り当てマネージド ID を有効にする

このアプローチを採用できない条件には、次のようなものがあります。

  • 検索サービスのアクセス許可をキー コンテナーに直接付与することはできません (たとえば、検索サービスが Azure Key Vault ではなく別の Microsoft Entra ID テナント内にある場合などです)。

  • 暗号化された複数の (別のキー コンテナーからの異なるキーをそれぞれが使用する) インデックスまたはシノニム マップをホストするには、1 つの検索サービスが必要です。各キー コンテナーでは異なる ID を使用して認証を行う必要があります。 検索サービスはマネージド ID を 1 つしか持つことができないため、複数の ID の要件によってシナリオの簡略化されたアプローチが除外されます。

4 - アクセス許可の付与

この手順では、キー コンテナーのアクセス ポリシーを作成します。 このポリシーにより、登録したアプリケーションに、カスタマー マネージド キーを使用するための Microsoft Entra ID アクセス許可を付与します。

アクセス許可はいつでも取り消すことができます。 取り消すと、そのキー コンテナーを使用する検索サービスのインデックスまたは同意語マップを使用できなくなります。 キー コンテナーのアクセス許可を後から復元すると、インデックス/同意語マップへのアクセスが復元されます。 詳細については、「キー コンテナーへのアクセスをセキュリティで保護する」を参照してください。

  1. Azure portal にまだいる場合は、キー コンテナーの [概要] ページを開きます。

  2. 左側の [アクセスポリシー] を選択し、[+ 作成] を選択して、アクセス ポリシーの作成ウィザードを開始します。

    アクセス ポリシーを作成します。

  3. [アクセス許可] ページで、[キーのアクセス許可][シークレットのアクセス許可][証明書のアクセス許可] で [取得]を選択します。 キーの ** 暗号化操作には、[キーの折り返しを解除]と [キーを折り返す]を選択します。

    [アクセス許可] ページでアクセス許可を選びます。

  4. [次へ] を選択します。

  5. [原則] ページで、暗号化キーにアクセスするために検索サービスによって使用されるセキュリティ プリンシパルを見つけて選択します。 これは、検索サービスのシステム マネージド ID またはユーザー マネージド ID、または登録済みアプリケーションのいずれかです。

  6. [次へ][作成] を選択します。

重要

Azure AI Search の暗号化されたコンテンツは、特定の バージョンので特定の Azure Key Vault キーを使用するように構成されています。 キーまたはバージョンを変更する場合は、それを使用するようにインデックスまたはシノニム マップを更新してから、前のキーまたはシノニム マップを削除する必要があります。 そうしないと、インデックスまたはシノニム マップが使用できなくなります。 キーが失われると、コンテンツの暗号化を解除できなくなります。

5 - コンテンツの暗号化

暗号化キーは、オブジェクトを作成するときに追加されます。 インデックス、シノニム マップ、インデクサー、データ ソース、またはスキルセットにカスタマー マネージド キーを追加するには、Search REST API または Azure SDK を使用して、暗号化が有効になっているオブジェクトを作成します。 ポータルでは、オブジェクトの作成時に暗号化プロパティが許可されません。

  1. 作成の API を呼び出して encryptionKey プロパティを指定します。

  2. オブジェクト定義に encryptionKey コンストラクトを挿入します。 このプロパティは、名前および説明と同じレベルにある第 1 レベルのプロパティです。 次の REST の例では、プロパティの配置を示します。 同じコンテナー、キー、バージョンを使用している場合は、同じ "encryptionKey" コンストラクトを各オブジェクト定義に貼り付けることができます。

    最初の例は、マネージド ID を使用して接続する検索サービスの "encryptionKey" を示しています。

    {
      "encryptionKey": {
        "keyVaultUri": "https://demokeyvault.vault.azure.net",
        "keyVaultKeyName": "myEncryptionKey",
        "keyVaultKeyVersion": "eaab6a663d59439ebb95ce2fe7d5f660"
      }
    }
    

    2 番目の例には、Microsoft Entra ID にアプリケーションを登録した場合に必要な "accessCredentials" が含まれています。

    {
      "encryptionKey": {
        "keyVaultUri": "https://demokeyvault.vault.azure.net",
        "keyVaultKeyName": "myEncryptionKey",
        "keyVaultKeyVersion": "eaab6a663d59439ebb95ce2fe7d5f660",
        "accessCredentials": {
          "applicationId": "00000000-0000-0000-0000-000000000000",
          "applicationSecret": "myApplicationSecret"
        }
      }
    }
    

暗号化されたオブジェクトを検索サービス上で作成したら、それをその種類の他のオブジェクトと同様に使用できます。 暗号化は、ユーザーと開発者に対して透過的です。

Note

Key Vault のこれらの詳細はシークレットとは見なされず、Azure portal 内の関連する Azure Key Vault のページを参照して簡単に取得できます。

6 - ポリシーを設定する

Azure のポリシーは、組織の標準を適用し、コンプライアンスを大規模に評価するのに役立ちます。 Azure AI Search には、オプションのサービス全体の CMK 強制用の組み込みポリシーがあります。

このセクションでは、検索サービスの CMK 標準を定義するポリシーを設定します。 その後、このポリシーを適用するように検索サービスを設定します。

  1. Web ブラウザーで組み込みポリシーに移動します。 [割り当て] を選びます

    組み込み CMK ポリシーの割り当てのスクリーンショット。

  2. ポリシーのスコープを設定します。 [パラメーター] セクションで、[入力またはレビューが必要なパラメーターのみを表示する] をオフにし、[効果][拒否] に設定します。

    要求の評価中、拒否ポリシー定義に一致する要求に非準拠のマークが付けられます。 お使いのサービスの標準が CMK 暗号化であると仮定すると、"拒否" は、CMK 暗号化を指定 しない 要求が非準拠であることを意味します。

    組み込みの CMK ポリシーの効果を拒否に変更するスクリーンショット。

  3. ポリシーの作成を完了します。

  4. Services - Update API を呼び出して、サービス レベルで CMK ポリシーの強制を有効にします。

PATCH https://management.azure.com/subscriptions/[subscriptionId]/resourceGroups/[resourceGroupName]/providers/Microsoft.Search/searchServices/[serviceName]?api-version=2022-11-01

{
    "properties": {
        "encryptionWithCmk": {
            "enforcement": "Enabled",
            "encryptionComplianceStatus": "Compliant"
        }
    }
}

REST の例

このセクションでは、オブジェクト定義内の "encryptionKey" の場所を確認できるよう、複数のオブジェクトの JSON を示します。

インデックスの暗号化

REST API を使用した新しいインデックスの作成の詳細については、インデックスの作成 (REST API) に関するページを参照してください。ここでの唯一の違いは、インデックス定義の一部として暗号化キーの詳細が指定されている点です。

{
 "name": "hotels",
 "fields": [
  {"name": "HotelId", "type": "Edm.String", "key": true, "filterable": true},
  {"name": "HotelName", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": true, "facetable": false},
  {"name": "Description", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": false, "facetable": false, "analyzer": "en.lucene"},
  {"name": "Description_fr", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": false, "facetable": false, "analyzer": "fr.lucene"},
  {"name": "Category", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": true},
  {"name": "Tags", "type": "Collection(Edm.String)", "searchable": true, "filterable": true, "sortable": false, "facetable": true},
  {"name": "ParkingIncluded", "type": "Edm.Boolean", "filterable": true, "sortable": true, "facetable": true},
  {"name": "LastRenovationDate", "type": "Edm.DateTimeOffset", "filterable": true, "sortable": true, "facetable": true},
  {"name": "Rating", "type": "Edm.Double", "filterable": true, "sortable": true, "facetable": true},
  {"name": "Location", "type": "Edm.GeographyPoint", "filterable": true, "sortable": true}
 ],
  "encryptionKey": {
    "keyVaultUri": "https://demokeyvault.vault.azure.net",
    "keyVaultKeyName": "myEncryptionKey",
    "keyVaultKeyVersion": "eaab6a663d59439ebb95ce2fe7d5f660",
    "accessCredentials": {
      "applicationId": "00000000-0000-0000-0000-000000000000",
      "applicationSecret": "myApplicationSecret"
    }
  }
}

これで、インデックス作成要求を送信し、インデックスの使用を正常に開始できます。

シノニム マップの暗号化

Create Synonym Map Azure AI Search REST APIを使用して、暗号化された同意語マップを作成します。 使用する暗号化キーを指定するには、"encryptionKey" プロパティを使用します。

{
  "name" : "synonymmap1",
  "format" : "solr",
  "synonyms" : "United States, United States of America, USA\n
  Washington, Wash. => WA",
  "encryptionKey": {
    "keyVaultUri": "https://demokeyvault.vault.azure.net",
    "keyVaultKeyName": "myEncryptionKey",
    "keyVaultKeyVersion": "eaab6a663d59439ebb95ce2fe7d5f660",
    "accessCredentials": {
      "applicationId": "00000000-0000-0000-0000-000000000000",
      "applicationSecret": "myApplicationSecret"
    }
  }
}

これで、シノニム マップ作成要求を送信し、シノニム マップの使用を正常に開始できます。

データ ソースの暗号化

データ ソースの作成 (REST API) に関する記事を使用して、暗号化されたデータ ソースを作成します。 使用する暗号化キーを指定するには、"encryptionKey" プロパティを使用します。

{
  "name" : "datasource1",
  "type" : "azureblob",
  "credentials" :
  { "connectionString" : "DefaultEndpointsProtocol=https;AccountName=datasource;AccountKey=accountkey;EndpointSuffix=core.windows.net"
  },
  "container" : { "name" : "containername" },
  "encryptionKey": {
    "keyVaultUri": "https://demokeyvault.vault.azure.net",
    "keyVaultKeyName": "myEncryptionKey",
    "keyVaultKeyVersion": "eaab6a663d59439ebb95ce2fe7d5f660",
    "accessCredentials": {
      "applicationId": "00000000-0000-0000-0000-000000000000",
      "applicationSecret": "myApplicationSecret"
    }
  }
}

これで、データ ソース作成要求を送信すると、データ ソースの正常な使用を開始できます。

スキルセットの暗号化

スキルセットの作成 REST API に関する記事を使用して、暗号化されたスキルセットを作成します。 使用する暗号化キーを指定するには、"encryptionKey" プロパティを使用します。

{
    "name": "skillset1",
    "skills":  [ omitted for brevity ],
    "cognitiveServices": { omitted for brevity },
      "knowledgeStore":  { omitted for brevity  },
    "encryptionKey": (optional) { 
        "keyVaultKeyName": "myEncryptionKey",
        "keyVaultKeyVersion": "eaab6a663d59439ebb95ce2fe7d5f660",
        "keyVaultUri": "https://demokeyvault.vault.azure.net",
        "accessCredentials": {
            "applicationId": "00000000-0000-0000-0000-000000000000",
            "applicationSecret": "myApplicationSecret"}
    }
}

これで、スキルセット作成要求を送信すると、データ ソースの正常な使用を開始できます。

インデクサーの暗号化

インデクサーの作成 REST API に関する記事を使用して、暗号化されたインデクサーを作成します。 使用する暗号化キーを指定するには、"encryptionKey" プロパティを使用します。

{
  "name": "indexer1",
  "dataSourceName": "datasource1",
  "skillsetName": "skillset1",
  "parameters": {
      "configuration": {
          "imageAction": "generateNormalizedImages"
      }
  },
  "encryptionKey": {
    "keyVaultUri": "https://demokeyvault.vault.azure.net",
    "keyVaultKeyName": "myEncryptionKey",
    "keyVaultKeyVersion": "eaab6a663d59439ebb95ce2fe7d5f660",
    "accessCredentials": {
      "applicationId": "00000000-0000-0000-0000-000000000000",
      "applicationSecret": "myApplicationSecret"
    }
  }
}

これで、インデクサー作成要求を送信すると、データ ソースの正常な使用を開始できます。

重要

"encryptionKey" を既存の検索インデックスまたはシノニム マップに追加することはできませんが、Key Vault の 3 つの詳細のいずれかに別の値を指定して更新することはできます (たとえば、キー バージョンを更新します)。 新しいキー コンテナー キーまたは新しいキー バージョンに変更する場合は、以前のキー/バージョンを削除するに、まずキーを使用するすべての Search キー インデックスまたはシノニム マップを、新しいキー/バージョンを使用するように更新する必要があります。 そうしないと、インデックスまたはシノニム マップが使用できない状態になり、キー アクセスが失われた場合にコンテンツを暗号化解除できません。 キー コンテナーのアクセス許可を後から復元すると、コンテンツへのアクセスが復元されます。

暗号化されたコンテンツを使用する

カスタマー マネージド キーの暗号化を使用すると、暗号化/暗号化解除の処理が増えるため、インデックス作成とクエリの両方で待ち時間があることに気付く場合があります。 Azure AI Search は暗号化アクティビティをログに記録しませんが、キー コンテナーのログ記録を使用してキー アクセスを監視できます。 キー コンテナー構成の一環としてログを有効にすることが推奨されます。

時間の経過と共に、キーのローテーションが発生すると予想されます。 キーのローテーションのたびに、次の手順に従うことが重要です。

  1. インデックスやシノニム マップによって使用されるキーを確認します。
  2. キー コンテナー内に新しいキーを作成しますが、元のキーは使用可能なままにしておきます。
  3. インデックスまたはシノニム マップの encryptionKey プロパティを更新して新しい値を使用します。 別の値を使用するように更新できるのは、当初このプロパティを使用して作成されたオブジェクトだけです。
  4. キー コンテナーで以前のキーを無効にするか削除します。 キー アクセスを監視して、新しいキーが使用されていることを確認します。

パフォーマンス上の理由で、検索サービスでは、キーが最大で数時間キャッシュされます。 新しいキーを指定せずにキーを無効にした、または削除した場合、キャッシュの有効期限が切れるまで、クエリは一時的に機能し続けます。 ただし、検索サービスでコンテンツの暗号化を解除できなくなると、次のメッセージが表示されます: "アクセスが禁止されています。 使用されたクエリ キーが失効している可能性があります - もう一度お試しください。"

次のステップ

Azure セキュリティ アーキテクチャを使い慣れていない場合は、Azure のセキュリティのドキュメントを確認してください。具体的には次の記事です。