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

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

重要

ご自分のアプリがサブスクリプションやテナント間で移行されている場合、App Service と Azure Functions のマネージド ID は、予期どおりには動作しません。 アプリ用には、新規で ID を取得する必要があります。これには、この機能を無効にしてから再度有効にする必要があります。 また、ダウンストリーム リソースでも新しい ID が使用されるように、アクセス ポリシーを更新する必要があります。

Note

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

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

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

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

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

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

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

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

    [状態] を [オン] に切り替えて [保存] を選択する場所を示すスクリーンショット。

Note

Azure portal で Web アプリまたはスロット アプリのマネージド ID を検索するには、 [エンタープライズアプリケーション] の下にある [ユーザー設定] セクションを確認します。 通常、スロット名は <app name>/slots/<slot name> に似ています。

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

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

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

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

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

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

  4. [ユーザー割り当て済み] タブで [追加] をクリックします。

  5. 先ほど作成した ID を検索して選択します。 [追加] をクリックします。

    App Service のマネージド ID

重要

追加するユーザー割り当て ID を選択した後に [追加] を選択すると、アプリケーションが再起動します。

ターゲット リソースの構成

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

重要

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

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

アプリはマネージド ID を使用して、Azure SQL Database、Azure キー コンテナー、Azure ストレージなど、Azure Azure Active Directory によって保護されている 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"
}

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

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

ID を削除する

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

  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 クエリ トークンを取得する必要のあるリソースの Azure AD リソース URI。 これは Azure AD 認証をサポートしている Azure サービスの 1 つか、その他のリソース URI になります。
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_id、mi_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 のトークンを取得する場合は、省略可能なプロパティの 1 つを含める必要があります。 このようにしないと、トークン サービスは存在する場合と存在しない場合があるシステムが割り当てた ID のトークンを取得しようとします。

次の手順