この記事では、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 を有効にするには、次の手順に従います。
Azure portal で、アプリのページに移動します。
左側のメニューで、[設定]>[ID] を選択します。
システム割り当て タブで、ステータスをオンに切り替えます。 次に、 [保存] を選択します。
ユーザー割り当て ID を追加する
ユーザー割り当て ID を持つアプリを作成するには、ID を作成し、そのリソース識別子をアプリ構成に追加します。
以下の手順に従って、ユーザー割り当てマネージド ID リソースを作成します。
アプリのページの左側のメニューで、[>] を選択します。
[ユーザー割り当て]を選択し、[追加]を選択します。
先ほど作成した 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 から自動的に削除されます。
アプリのページの左側のメニューで、[>] を選択します。
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_id
、mi_res_id
、またはobject_id
を含む要求では使用できません。 すべての ID パラメーター (client_id
、principal_id
、object_id
、およびmi_res_id
) を省略した場合、システム割り当て ID が使用されます。principal_id
クエリ (省略可能) 使用するユーザー割り当て ID のプリンシパル ID。 object_id
パラメーターは、代わりに使用できるエイリアスです。client_id
、mi_res_id
、またはobject_id
を含む要求では使用できません。 すべての ID パラメーター (client_id
、principal_id
、object_id
、およびmi_res_id
) を省略した場合、システム割り当て ID が使用されます。mi_res_id
クエリ (省略可能) 使用するユーザー割り当て ID の Azure リソース ID。 principal_id
、client_id
、またはobject_id
を含む要求では使用できません。 すべての ID パラメーター (client_id
、principal_id
、object_id
、およびmi_res_id
) を省略した場合、システム割り当て ID が使用されます。
重要
ユーザー割り当て ID のトークンを取得しようとしている場合は、省略可能なプロパティのいずれかを含めます。 それ以外の場合、トークン サービスはシステム割り当て ID のトークンの取得を試みます。この ID は存在する場合と存在しない可能性があります。
関連コンテンツ
次のチュートリアルを検討してください。