Azure Cognitive Search のデータ暗号化のためにカスタマー マネージド キーを構成する

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

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

  • CMK 暗号化は、個々のオブジェクトに対して適用されます。 検索サービス全体で一方的に CMK が必要な場合は、サービスがコンプライアンスに準拠していない場合に通知を受け取ることができるよう、サービス レベルで適用ポリシーを設定します。

  • CMK 暗号化は Azure Key Vault に依存します。 独自の暗号化キーを作成してキー コンテナーに格納したり、Azure Key Vault の API を使用して暗号化キーを生成したりできます。

  • CMK 暗号化は、オブジェクトが作成されるときに行われます。 既に存在するオブジェクトを暗号化することはできません。

CMK 暗号化のサポート

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

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

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

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

二重暗号化

二重暗号化は、カスタマー マネージド キー (CMK) 暗号化の拡張機能です。 CMK 暗号化は、データ ディスクに書き込まれる長期ストレージに適用されます。 "二重暗号化" という用語は、(一時ディスクに書き込まれたコンテンツの) 短期ストレージに対する追加の暗号化を指します。 構成は必要ありません。 CMK をオブジェクトに適用すると、二重暗号化が自動的に呼び出されます。

二重暗号化は、すべてのリージョンで使用できます。ただし、サポートは 2 つのフェーズでロール アウトされました。 最初のロールアウトは 2020 年 8 月に行われ、以下に示す 5 つのリージョンが含まれていました。 2021 年 5 月の 2 回目のロールアウトでは、残りのすべてのリージョンに二重暗号化が拡張されました。 古いサービスで CMK を使用し、二重暗号化が必要な場合は、選択したリージョンに新しい検索サービスを作成する必要があります。

リージョン サービスの作成日
米国西部 2 2020 年 8 月 1 日以降
米国東部 2020 年 8 月 1 日以降
米国中南部 2020 年 8 月 1 日以降
US Gov バージニア州 2020 年 8 月 1 日以降
US Gov アリゾナ 2020 年 8 月 1 日以降
サポートされているその他のすべてのリージョン 2021 年 5 月 13 日以降

前提条件

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

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

ヒント

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

Key Vault に関するヒント

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

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

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

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

1 - 消去保護の有効化

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

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

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

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

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

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

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

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

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

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

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

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

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

    Create a new key vault key

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

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

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

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

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

    Turn on system assigned managed identity

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

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

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

4 - アクセス許可の付与

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

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

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

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

    Create an access policy.

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

    Select permissions in the Permissions page.

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

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

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

重要

Azure Cognitive 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 番目の例には、Azure AD にアプリケーションを登録した場合に必要な "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 のページを参照して簡単に取得できます。

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"
    }
  }
}

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

シノニム マップの暗号化

シノニム マップの作成 (Azure Cognitive 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 Cognitive Search では、暗号化アクティビティはログに記録されませんが、キー コンテナーのログを通してキーへのアクセスを監視できます。 キー コンテナー構成の一環としてログを有効にすることが推奨されます。

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

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

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

次のステップ

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