App Service と Azure Functions でマネージド ID を使用する方法

このトピックでは、App Service と Azure Functions アプリケーションでマネージド ID を作成し、それを使用して他のリソースにアクセスする方法を説明します。

重要

マネージド ID はディレクトリ間のシナリオをサポートしていないため、アプリがサブスクリプション間またはテナント間で移行された場合、想定どおりには動作しません。 そのような移行後にマネージド ID をもう一度作成するには、「サブスクリプションを別のディレクトリに移動する場合、マネージド ID は自動的に再作成されますか?」をご覧ください。 また、ダウンストリーム リソースでも新しい ID が使用されるように、アクセス ポリシーを更新する必要があります。

Note

マネージド ID は、Azure Arc にデプロイされているアプリでは使用できません。

アプリで Microsoft Entra ID のマネージド ID を使用すると、他の Microsoft Entra で保護されたリソース (Azure Key Vault など) に簡単にアクセスできます。 ID は Azure プラットフォームによって管理され、ユーザーがシークレットをプロビジョニングまたはローテーションする必要はありません。 Microsoft Entra ID のマネージド ID の詳細については、「Azure リソースのマネージド ID」を参照してください。

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

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

マネージド ID の構成はスロットに固有です。 ポータルでデプロイ スロットのマネージド ID を構成するには、まずスロットに移動します。 Azure portal で Microsoft Entra テナント内の Web アプリまたはデプロイ スロットのマネージド ID を検索するには、テナントの [概要] ページで直接検索します。 通常、スロット名は <app-name>/slots/<slot-name> に似ています。

このビデオでは、App Service のマネージド ID を使用する方法について説明します。

ビデオの手順については、次のセクションでも説明します。

システム割り当て ID を追加する

  1. アプリのページの左側のナビゲーションで、[設定] グループまで下にスクロールします。

  2. [ID] を選択します。

  3. [システム割り当て済み] タブで、 [状態][オン] に切り替えます。 [保存] をクリックします。

    Screenshot that shows where to switch Status to On and then select Save.

ユーザー割り当て ID を追加する

ユーザー割り当て ID を持つアプリを作成するには、ID を作成してから、そのリソース ID をアプリ構成に追加する必要があります。

最初に、ユーザー割り当て ID リソースを作成する必要があります。

  1. 以下の手順に従って、ユーザー割り当てマネージド ID リソースを作成します。

  2. アプリのページの左側のナビゲーションで、[設定] グループまで下にスクロールします。

  3. [ID] を選択します。

  4. [ユーザー割り当て済み]>[追加] を選びます。

  5. 先ほど作成した ID を検索して選び、[追加] を選びます。

    Managed identity in App Service

    [追加] を選ぶと、アプリが再起動します。

ターゲット リソースを構成する

アプリまたは関数からのアクセスを許可するようにターゲット リソースを構成する必要がある場合があります。 例えば、Key Vault にアクセスするためにトークンを要求する場合、アプリや関数のマネージド ID を含むアクセス ポリシーも追加する必要があります。 それ以外の場合は、有効なトークンを使用する場合でも、Key Vault への呼び出しは拒否されます。 同じことが Azure SQL Database にも当てはまります。 Microsoft Entra トークンをサポートしているリソースの詳細については、「Microsoft Entra 認証をサポートしている Azure サービス」をご覧ください。

重要

マネージド ID のバックエンド サービスは、リソース URI ごとのキャッシュを約 24 時間保持します。 特定のターゲット リソースのアクセス ポリシーを更新し、そのリソースのトークンをすぐに取得した場合、そのトークンの有効期限が切れるまで、期限切れのアクセス許可を持つキャッシュされたトークンを取得し続ける可能性があります。 現在、トークンの更新を強制する方法はありません。

アプリ コードでの Azure サービスへの接続

アプリはマネージド ID を使用して、Azure SQL Database、Azure キー コンテナー、Azure ストレージなど、Microsoft Entra ID によって保護されている Azure リソースのトークンを取得できます。 これらのトークンは、アプリケーションの特定のユーザーではなく、リソースにアクセスしているアプリケーションを表します。

App Service と Azure Functions は、トークン取得のために、内部でアクセス可能なRES Tエンドポイントを提供します。 REST エンドポイントは、標準の HTTP GET を使用してアプリ内からアクセスでき、すべての言語で汎用 HTTP クライアントを実装できます。 NET、JavaScript、Java、Python の場合、Azure ID クライアント ライブラリは、この REST エンドポイントを抽象化し、開発環境を簡素化します。 他の Azure サービスへの接続は、サービス固有のクライアントに資格情報オブジェクトを追加するのと同じくらい簡単です。

生の HTTP GET 要求は、次の例のようになります。

GET /MSI/token?resource=https://vault.azure.net&api-version=2019-08-01 HTTP/1.1
Host: localhost:4141
X-IDENTITY-HEADER: 853b9a84-5bfa-4b22-a3f3-0b9a43d9ad8a

応答の例は次のようになります。

HTTP/1.1 200 OK
Content-Type: application/json

{
    "access_token": "eyJ0eXAi…",
    "expires_on": "1586984735",
    "resource": "https://vault.azure.net",
    "token_type": "Bearer",
    "client_id": "5E29463D-71DA-4FE0-8E69-999B57DB23B0"
}

この応答は、Microsoft Entra のサービス間アクセス トークン要求に対する応答と同じです。 Key Vault にアクセスするには、access_tokenの値をコンテナーとのクライアント接続に追加します。

REST エンドポイントの詳細については、「REST エンドポイント リファレンス」を参照してください。

ID を削除する

システム割り当て ID を削除すると、Microsoft Entra ID から削除されます。 また、アプリ リソース自体を削除すると、システム割り当て ID も Microsoft Entra ID から自動的に削除されます。

  1. アプリのページの左側のナビゲーションで、[設定] グループまで下にスクロールします。

  2. [ID] を選択します。 次に、ID の種類に基づいて、次の手順に従います。

    • システムに割り当てられた ID: [システム割り当て済み] タブで [状態][オフ] に切り替えます。 [保存] をクリックします。
    • ユーザーに割り当てられたID: [ユーザ割り当て済み] タブを選択し、ID のチェックボックスを選択し、[削除] を選択します。 [はい] を選択して確定します。

Note

また、単純にローカル トークン サービスを無効にする、設定可能なアプリケーション設定 WEBSITE_DISABLE_MSI もあります。 ただし、ID はその場所に残り、ツールには引き続きマネージド ID が "オン" または "有効" と表示されます。そのため、この設定の使用はお勧めしません。

REST エンドポイントの参照

マネージド ID を持つアプリは、次の 2 つの環境変数を定義することによってこのエンドポイントを使用できます。

  • IDENTITY_ENDPOINT - ローカル トークン サービスに対する URL。
  • IDENTITY_HEADER - サーバー側のリクエスト フォージェリ (SSRF) 攻撃を回避するために使用するヘッダー。 値は、プラットフォームによってローテーションされます。

IDENTITY_ENDPOINT は、お使いのアプリがトークンを要求するローカル URL です。 リソースのトークンを取得するには、次のパラメーターを指定して、このエンドポイントに HTTP GET 要求を行います。

パラメーター名 場所 説明
resource クエリ トークンを取得する必要のあるリソースの Microsoft Entra リソース URI。 これは Microsoft Entra 認証をサポートしている Azure サービスの 1 つか、その他のリソース URI になります。
api-version クエリ 使うトークン API のバージョン。 2019-08-01 を使用してください。
X-IDENTITY-HEADER ヘッダー IDENTITY_HEADER 環境変数の値。 このヘッダーは、サーバー側のリクエスト フォージェリ (SSRF) 攻撃を回避するために使用されます。
client_id クエリ (省略可能) 使用するユーザー割り当て ID のクライアント ID。 principal_idmsi_res_id、または object_id を含む要求では使用できません。 すべての ID パラメーター (client_idprincipal_idobject_id、および msi_res_id) を省略した場合、システム割り当て ID が使用されます。
principal_id クエリ (省略可能) 使用するユーザー割り当て ID のプリンシパル ID。 object_id は代わりに使用する別名です。 client_id、msi_res_id、またはobject_idを含む要求では使用できません。 すべての ID パラメーター (client_idprincipal_idobject_id、および msi_res_id) を省略した場合、システム割り当て ID が使用されます。
msi_res_id クエリ (省略可能) 使用するユーザー割り当て ID の Azure リソース ID。 principal_idclient_id、または object_id を含む要求では使用できません。 すべての ID パラメーター (client_idprincipal_idobject_id、および msi_res_id) を省略した場合、システム割り当て ID が使用されます。

重要

ユーザー割り当て ID のトークンを取得する場合は、省略可能なプロパティの 1 つを含める必要があります。 このようにしないと、トークン サービスは存在する場合と存在しない場合があるシステムが割り当てた ID のトークンを取得しようとします。

次のステップ