次の方法で共有


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

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

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

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

  • システム割り当て ID はアプリに関連付けられ、そのアプリが削除されると削除されます。 1 つのアプリに割り当てることができるシステム割り当て ID は 1 つだけです。
  • ユーザー割り当て ID は、アプリに割り当てることができるスタンドアロン Azure リソースです。 アプリは、複数のユーザー割り当て ID を持つことができます。 1 つのユーザー割り当て ID を複数の Azure リソース (2 つの App Service アプリなど) に割り当てることができます。

マネージド ID の構成はスロットに固有です。 ポータルでデプロイ スロットのマネージド ID を構成するには、まずスロットに移動します。 Azure portal で Microsoft Entra テナント内の Web アプリまたはデプロイ スロットのマネージド ID を検索するには、テナントの [概要] ページで直接検索します。

注記

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

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

前提条件

この記事の手順を実行するには、Azure リソースに対する最小限のアクセス許可セットが必要です。 必要な特定のアクセス許可は、シナリオによって異なります。 次の表は、最も一般的なシナリオをまとめたものです。

シナリオ 必要な権限 組み込みロールの例
システム割り当て ID を作成する アプリに対する Microsoft.Web/sites/write、またはスロットに対する Microsoft.Web/sites/slots/write Web サイトの共同作成者
ユーザー割り当て ID を作成する ID を作成するリソース グループに対する Microsoft.ManagedIdentity/userAssignedIdentities/write マネージドIDの寄稿者
アプリにユーザー割り当て ID を割り当てる アプリに対する Microsoft.Web/sites/write、スロットに対する Microsoft.Web/sites/slots/write、または
ID に対する Microsoft.ManagedIdentity/userAssignedIdentities/*/assign/action
Web サイトの共同作成者およびマネージド ID オペレーター
Azure ロールの割り当てを作成する Microsoft.Authorization/roleAssignments/write ターゲット リソース スコープを超える ロールベースのアクセス制御管理者 または ユーザー アクセス管理者

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

システム割り当てマネージド ID を有効にするには、次の手順に従います。

  1. Azure portal で、アプリのページに移動します。

  2. 左側のメニューで、[設定]>[ID] を選択します。

  3. システム割り当て タブで、ステータスオンに切り替えます。 次に、 [保存] を選択します。

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

ユーザー割り当て ID を持つアプリを作成するには、ID を作成し、そのリソース識別子をアプリ構成に追加します。

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

  2. アプリのページの左側のメニューで、[>] を選択します。

  3. [ユーザー割り当て]を選択し、[追加]を選択します。

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

これらの手順を完了すると、アプリが再起動します。

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

自分のアプリからのアクセスを許可するようにターゲット リソースを構成することが必要です。 ほとんどの Azure サービスでは、 ロールの割り当てを作成してターゲット リソースを構成します。

一部のサービスでは、Azure ロールベースのアクセス制御以外のメカニズムが使用されます。 ID を使用してアクセスを構成する方法については、各ターゲット リソースのドキュメントを参照してください。 どのリソースで Microsoft Entra トークンがサポートされるかについて詳しくは、「Microsoft Entra 認証をサポートする Azure サービス」をご参照ください。

たとえば、Azure Key Vault 内のシークレットにアクセスするための トークンを要求 する場合は、マネージド ID がターゲット コンテナー内のシークレットを操作できるようにするロールの割り当てを作成する必要もあります。 それ以外の場合、有効なトークンを使用した場合でも、Key Vault は呼び出しを拒否します。 Azure SQL Database やその他のサービスについても同様です。

重要

マネージド ID のバックエンド サービスは、リソース URI ごとのキャッシュを約 24 時間保持します。 マネージド ID のグループまたはロール メンバーシップの変更が有効になるまでには数時間かかる場合があります。 現在、マネージド ID のトークンを有効期限前に強制的に更新することはできません。 アクセス許可を追加または削除するためにマネージド ID のグループまたはロール メンバーシップを変更する場合は、ID を使用している Azure リソースが正しいアクセス権を持つまで数時間待つ必要がある場合があります。

グループまたはロール メンバーシップの代替については、「認可にマネージド ID を使用する場合の制限」を参照してください。

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

アプリは、マネージド ID を使用して、Microsoft Entra ID が保護に役立つ Azure リソース (Azure SQL Database、Azure Key Vault、Azure Storage など) のトークンを取得できます。 これらのトークンは、アプリケーションの特定のユーザーではなく、リソースにアクセスするアプリケーションを表します。

App Service と Azure Functions は、トークン取得のために、内部でアクセス可能なRES Tエンドポイントを提供します。 標準の HTTP GET 要求を使用して、アプリ内から REST エンドポイントにアクセスできます。 すべての言語で汎用 HTTP クライアントを使用して要求を実装できます。

NET、JavaScript、Java、Python の場合、Azure ID クライアント ライブラリは、この REST エンドポイントを抽象化し、開発環境を簡素化します。 他の Azure サービスへの接続は、サービス固有のクライアントに資格情報オブジェクトを追加するのと同じくらい簡単です。

生の HTTP GET 要求では、 指定された 2 つの環境変数が 使用され、次の例のようになります。

GET /MSI/token?resource=https://vault.azure.net&api-version=2019-08-01 HTTP/1.1
Host: <ip-address-:-port-in-IDENTITY_ENDPOINT>
X-IDENTITY-HEADER: <value-of-IDENTITY_HEADER>

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

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": "00001111-aaaa-2222-bbbb-3333cccc4444"
}

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

REST エンドポイントの詳細については、この記事で後述する REST エンドポイント リファレンスを参照 してください。

ID を削除する

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

  1. アプリのページの左側のメニューで、[>] を選択します。

  2. ID の種類に基づいて、次の手順に従います。

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

注記

ローカル トークン サービス ( 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 認証またはその他のリソース URI をサポートする Azure サービス の 1 つです。
api-version クエリ 使うトークン API のバージョン。 2019-08-01 を使用してください。
X-IDENTITY-HEADER ヘッダー IDENTITY_HEADER 環境変数の値。 このヘッダーは、SSRF 攻撃の軽減に役立ちます。
client_id クエリ (省略可能) 使用するユーザー割り当て ID のクライアント ID。 principal_idmi_res_id、またはobject_idを含む要求では使用できません。 すべての ID パラメーター (client_idprincipal_idobject_id、および mi_res_id) を省略した場合、システム割り当て ID が使用されます。
principal_id クエリ (省略可能) 使用するユーザー割り当て ID のプリンシパル ID。 object_id パラメーターは、代わりに使用できるエイリアスです。 client_idmi_res_id、またはobject_idを含む要求では使用できません。 すべての ID パラメーター (client_idprincipal_idobject_id、および mi_res_id) を省略した場合、システム割り当て ID が使用されます。
mi_res_id クエリ (省略可能) 使用するユーザー割り当て ID の Azure リソース ID。 principal_idclient_id、またはobject_idを含む要求では使用できません。 すべての ID パラメーター (client_idprincipal_idobject_id、および mi_res_id) を省略した場合、システム割り当て ID が使用されます。

重要

ユーザー割り当て ID のトークンを取得しようとしている場合は、省略可能なプロパティのいずれかを含めます。 それ以外の場合、トークン サービスはシステム割り当て ID のトークンの取得を試みます。この ID は存在する場合と存在しない可能性があります。

次のチュートリアルを検討してください。