APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

API Management × MCP × Entra ID(OAuth2) で実現するMCP のセキュアな統合

目次

はじめに

こんにちは。ACS事業部の折田です。
AI エージェントや開発環境から MCP(Model Context Protocol)サーバーを呼び出す際、どのようにセキュリティを担保すべきでしょうか。

本記事では、Azure API Management (APIM) をゲートウェイとして活用し、OAuth2 認可(Entra ID)と App Role による細やかな制御を組み合わせた、堅牢なエンドツーエンド保護の構成とハンズオンの内容をご紹介します。

1. アーキテクチャの概要

このハンズオンでは、以下の 2 つの主要なユースケースを想定したセキュアな実行フローを構築します。

  • AI エージェント(MS Foundry 等)→ Entra ID(OAuth) → APIM → MCP

  • VS Code (GitHub Copilot) → Entra ID(OAuth) → APIM → MCP

セキュリティを支える 5 つの柱

  1. OAuth2 認可: Entra ID によるユーザー認証とアクセストークンの発行。
  2. トークン検証: APIM でアクセストークンの署名、有効期限、オーディエンスを検証し、不正なリクエストを遮断。
  3. ロールベースの認可: トークン内の roles クレームを評価し、特定の MCP ツール実行権限があるかを確認。
  4. シークレットレス接続: APIM のマネージド ID (MSI) を使用してバックエンドへ接続し、資格情報の漏洩リスクを排除。
  5. バックエンド保護: Easy Auth により、APIM からの通信のみを許可するよう MCP バックエンドを保護。

2. 技術的な注目ポイント:APIM ポリシーによる制御

本構成の肝となるのは、APIM に設定されたポリシーによる柔軟な制御です。

OAuth メタデータの提供

VS Code などのクライアントが認証を必要とする場合、OAuth 2.0 の標準規格である /.well-known/oauth-protected-resource エンドポイントから OAuth メタデータを返すことで、クライアントは適切な認可サーバー(Entra ID)を自動的に判断し、必要なトークンを自動取得できるようになります。

メリット

従来、API Management 自体を認可サーバーとして扱う構成では、同意画面の遷移や再認証時のトークン破棄(クライアント ID の手動削除)に手間がかかるケースがありました。

認可サーバーを Entra ID に委譲することで、以下のメリットが得られます。

  • シームレスな UX: VS Code 上で Azure ログイン時と同様のポップアップが開くため、開発者は迷わず認証を完了できます。
  • トークン管理の自動化: VS Code が保持する Microsoft アカウントのトークンをそのまま MCP 認証に利用するため、有効期限切れに伴う手動削除の必要がなく、管理が極めてスムーズになります。

標準プロトコルに基づき認可フローを Entra ID へ集約することで、開発者エクスペリエンスを最大化しつつ、セキュアな MCP 認証を実現できます。

アクセストークン検証

APIM の validate-azure-ad-token ポリシーにより、アクセストークンの署名、有効期限、発行者(Issuer)、およびオーディエンス(Audience)を厳格に検証します。これにより、信頼された Entra ID テナントから発行された正当なトークンを持つリクエストのみを通過させます。

ツール実行の細かな権限判定

APIM ポリシー内で、リクエストされた MCP ツールの名前と、トークンに含まれる roles を動的に比較します。

  • 厳密な一致: ツール名とロール名が一致する場合のみ実行を許可。
  • ワイルドカード対応(応用): Mcp_Arithmetic_* のようなロールを設定することで、前方一致による柔軟な一括権限管理も可能です。
<set-variable name="isAuthorized" value="@{
    var jwt = (Jwt)context.Variables["jwt"];
    var userRoles = jwt.Claims["roles"]; 
    var toolName = (string)context.Variables["mcpToolName"];
    // ロールにツール名が含まれているかチェック
    return userRoles.Any(r => r.Equals(toolName, StringComparison.OrdinalIgnoreCase));
}" />

3. ハンズオンで体験できること

本リポジトリでは、Azure Developer CLI (azd) を使用して、数コマンドでセキュアな検証環境を構築できます。

ステップ

1. 環境デプロイ

azd up を実行するだけで、API Management、MCP Backend(Functions, Logic App)、Entra ID 設定を含むインフラ一式が自動でデプロイされます。

2. Python による AI エージェントの MCP 呼び出し再現

MS Foundry エージェントなどが MCP を呼び出す一連の処理を、Python スクリプトで再現します。 この検証では、単にツールを動かすだけでなく、以下のプロセスを順に追うことで、トークン取得から MCP 実行に至るまでの内部フローを横断的に理解できる構成になっています。

  • トークンの Claim 確認: 発行されたトークンに適切な roles が含まれているかを確認します。
  • MCP ツール一覧の取得: 認可された状態でバックエンドからツールリストを正しく取得できるか検証します。
  • MCP ツール実行 (tool/call):
    • 認可されたロールを持つツールは正常に実行されることを確認。
    • 権限のないツールは APIM ポリシーにより 403 Forbidden で拒否される挙動を確認。

3. VS Code (GitHub Copilot) 連携

実務での利用を想定し、VS Code の GitHub Copilot Chat から MCP ツールを呼び出す構成も体験できます。 ここでは、認可サーバーを Entra ID へ委譲するメリットを実感いただけます。

  • スムーズな認証: APIM が返すメタデータにより、VS Code から Entra ID への認証がシームレスに行われます。
  • 高い開発体験 (DX): 開発者はブラウザでの同意フローを一度行うだけで、再認証の手間に煩わされることなく、セキュアに MCP ツールを活用できます。

4. 主なユースケース

  • カスタム MCP の統合: 自社専用に開発した MCP サーバーの認証・認可を中央集約的に管理。
  • プロジェクト間の権限分離: MS Foundry のプロジェクトごとに必要なロールのみをマネージド ID に割り当て、最小権限の原則を適用。
  • エージェントごとの個別設定: エージェントのインスタンス(Agent Identity)単位で、利用可能なツールを厳密に制限。

結びに

セキュリティは「ユーザーを制限するもの」ではなく、「誤用を防ぐためのポジティブな安全装置」であるべきです。

本ハンズオンを通じて、ゼロトラストの原則に基づいた「入り口での厳格な認証・認可」と、開発者の利便性を両立させる設計手法をぜひ体感してください。

ハンズオンページ(ここから始められます)

github.com

ACS 事業部のご紹介

私達 ACS 事業部はクラウドネイティブ技術、Azure AI サービス、Platform Engineering などを活用し、攻めの DX 成功に向けた開発者体験の向上・内製化のご支援をしております。
www.ap-com.co.jp www.ap-com.co.jp

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。 www.ap-com.co.jp