Azure App ServiceのMCPサーバー安全対策|OAuth対応と管理者向け確認事項

Azure App ServiceでMCPサーバーを公開している管理者が最初に確認すべきことは、認証なしのMCPエンドポイントがインターネットに出ていないか、Microsoft Entra IDによるOAuth認証、App Service認証、API Management、マネージドID、Key Vault、Application Insightsの監査がそろっているかです。

2026年6月24日の「Only 8.5% of MCP Servers Use OAuth — Here’s How to Host One Securely on App Service」は、新機能の強制適用や廃止告知というより、Azure上でMCPサーバーを安全に本番運用するためのNoticeです。Astrix Researchの調査では、MCPサーバーのうちOAuthを使っているものは8.5%にとどまり、静的APIキーやPAT、環境変数経由の資格情報に依存する実装が多いとされています。(TECHCOMMUNITY.MICROSOFT.COM)

この記事では、Azure管理者が確認すべき影響範囲、権限、監査、移行、社内周知ポイントを実務目線で整理します。結論から言えば、MCPサーバーは「動くこと」よりも「誰が、どのツールを、どの権限で、どこから実行したかを追えること」を本番化の条件にするべきです。

目次

Only 8.5% of MCP Servers Use OAuthの要点

今回のApps on Azure Blogが伝えている主なメッセージは、MCPサーバーを便利なデモ構成のまま公開しないことです。MCPはAIエージェントにファイル、API、データベース、業務システムなどへの操作口を与える仕組みです。認証や権限設計が弱いまま公開すると、単なるWeb APIの公開よりも被害が広がりやすくなります。

Microsoftの投稿では、Azure App Service上のMCPサーバーを、App Service認証、Microsoft Entra ID、マネージドID、Key Vault、パブリックネットワーク制限、API Management、Application Insightsアラートと組み合わせて堅牢化する方向性が示されています。(TECHCOMMUNITY.MICROSOFT.COM)

管理者が押さえるべきポイントは次の通りです。

確認テーマ管理者が見るべきこと優先度
認証App Service認証またはAPI Managementで匿名アクセスを遮断しているか高
認可ユーザー、アプリ、ツール単位でスコープやロールを分けているか高
資格情報APIキーやPATをアプリ設定や環境変数に平文で置いていないか高
ネットワークApp Serviceを直接公開せず、APIMやPrivate Endpointで制御しているか高
監査誰がどのMCPツールを呼んだか、失敗・拒否を追跡できるか高
移行既存MCPクライアントへのURL変更、再同意、権限変更を周知しているか中

今回のNoticeは「今すぐAzureサービスの仕様が変わる」という話ではありません。むしろ、MCPサーバーをApp Serviceで公開している組織に対して、本番運用の最低ラインを見直すきっかけと考えるべきです。

影響を受けるAzure環境

影響を受けやすいのは、Azure App ServiceまたはAzure FunctionsでHTTPベースのMCPサーバーを動かしている環境です。特に、社内ツールやAIエージェントから使うために一時的に作ったMCPサーバーを、そのまま公開している場合は確認が必要です。

MCPの認可ガイドでは、ユーザー固有データ、管理操作、監査、企業向けアクセス制御、レート制限が必要な場合に認可を強く推奨しています。HTTPベースでリモートホストされるMCPサーバーでは、OAuthを使ってユーザーがサーバーへアクセスできることを確立する設計が前提になります。(Model Context Protocol)

対象具体例確認ポイント
App Service上のMCPサーバー/mcp、/sse、/messagesなどのエンドポイントを持つWebアプリ匿名アクセス不可、HTTPS強制、認証失敗時はAPI向けに401
Azure Functions上のMCP機能HTTPトリガーでツール呼び出しを受ける関数Function keyだけに依存していないか
AIエージェント連携VS Code、社内エージェント、チャットUI、Copilot連携接続先URLと認可フローを管理対象にしているか
下流AzureリソースKey Vault、Storage、Azure SQL、Azure OpenAI、Microsoft Graphクライアントの長期キーではなくマネージドIDを使っているか
APIゲートウェイAzure API Management、Front Door、Application Gatewayバイパス経路が残っていないか

注意したいのは、MCPサーバーが「社内向け」と言われていても、App Serviceの既定ホスト名が外部から到達可能なままになっているケースです。社内利用のつもりでも、アクセス制限がなければ実質的には公開APIです。

管理者向けチェックリスト

まずは次の表で現状を棚卸ししてください。すべてを一度に直す必要はありませんが、「匿名公開」「長期キー」「監査なし」の3つが重なっている場合は、優先的に停止または制限する判断が必要です。

確認項目合格基準Azureで見る場所NGの場合の対応
MCPエンドポイントの棚卸しApp Service、Functions、APIM上のMCP URLを一覧化しているResource Graph、App Service一覧、APIM API一覧所有者、用途、公開範囲、データ分類を記録
匿名アクセス本番MCP APIは匿名で呼べないApp Service > AuthenticationRequire authenticationを設定
認証プロバイダーMicrosoft Entra IDまたは許可済みIdPを使用App Service > AuthenticationApp registrationを作成し、IdPを追加
トークンの宛先audが対象APIに限定されているApp Service Authentication、Entra app registrationAllowed token audiencesを設定
認可ロール、スコープ、ツール単位の制御があるアプリコード、APIMポリシー、Entraアプリroles、scp、グループなどを検証
PRM対応MCPクライアントが認可サーバーを発見できるApp Service設定、MCPサーバー実装Protected Resource Metadataを検証
シークレットAPIキーやPATを平文設定に置いていないApp Service > Configuration、Key VaultKey Vault参照またはマネージドIDへ移行
ネットワークApp Service直アクセスを制限しているNetworking、Access restrictions、Private EndpointAPIM経由、Private Endpoint、アクセス制限を適用
監査401、403、429、5xx、ツール実行履歴を追えるApplication Insights、Log Analytics、APIMログ診断設定とアラートを追加
スロット分離dev、staging、prodで認証情報を共有していないDeployment slots、App registration環境ごとにアプリ登録と権限を分離

認証はApp Service認証とMicrosoft Entra IDを基本にする

Azure App Serviceには、組み込みの認証と承認機能があります。一般にEasy Authとも呼ばれ、Webアプリ、REST API、Functionsに対して、アプリコードを大きく変更せずに認証を追加できます。Microsoft Learnでは、Microsoft Entra IDなど複数のIDプロバイダーと統合できること、未認証リクエストをサインインへ誘導または拒否できることが説明されています。(Microsoft Learn)

MCPサーバーをAPIとして使う場合は、未認証リクエストに対してリダイレクトではなく401を返す設計が扱いやすくなります。ブラウザー向けWebサイトなら302リダイレクトが自然ですが、MCPクライアントやエージェントが相手の場合、401で認可チャレンジを返した方が原因を切り分けやすいためです。App Service認証のドキュメントでも、APIではHTTP 401 Unauthorizedが推奨される選択肢として示されています。(Microsoft Learn)

Allowed token audiencesを必ず確認する

MCPサーバーを守るうえで見落としやすいのが、トークンの宛先です。Microsoft Entra IDのトークンを受け付けていても、対象API向けではないトークンを受け入れてしまう設計は危険です。

App ServiceのMicrosoft Entra認証では、Allowed token audiencesを使って、受け入れるアクセストークンをaudクレームで制限できます。Application ID URIやアプリ登録のクライアントIDを明示し、MCPサーバー向けに発行されたトークンだけを受け付けるようにしてください。(Microsoft Learn)

確認時の判断基準は次の通りです。

状態判断
Allowed token audiencesが空または意図不明要確認。どのAPI向けトークンを受け入れるのか明文化する
開発、検証、本番で同じaudを使っている原則見直し。環境分離が難しくなる
複数クライアントを許可しているクライアントごとにスコープ、ロール、監査を分ける
APIMとApp Serviceの両方で検証している望ましい。ただし設定不一致による拒否に注意

MCP向けにはProtected Resource Metadataも確認する

MCPの認可仕様では、保護されたMCPサーバーはOAuth 2.0 Protected Resource Metadata、つまりRFC 9728に基づくメタデータを実装し、MCPクライアントが認可サーバーを発見できるようにする必要があります。仕様では、MCPサーバーがOAuth 2.1のリソースサーバーとして動作し、MCPクライアントがアクセストークンを使って保護リソースへアクセスする流れが説明されています。(Model Context Protocol)

App Service認証には、OAuth 2.0 Protected Resource Metadataを提供するプレビュー機能があり、MCPサーバー認可に必要とされています。プレビュー期間中は、WEBSITE_AUTH_PRM_DEFAULT_WITH_SCOPESアプリ設定でスコープ一覧を指定する構成が案内されていますが、プレビュー機能のため設定方法が変わる可能性があります。(Microsoft Learn)

管理者は、次の観点で確認してください。

確認項目具体的な見方
401応答WWW-Authenticateに認可情報が含まれるか
well-known URL/.well-known/oauth-protected-resource相当のメタデータが取得できるか
scopesMCPツールに必要なスコープが過剰でないか
authorization_servers想定したEntraテナントまたは認可サーバーだけが示されているか
クライアント互換性利用するMCPクライアントがPRM検出に対応しているか

ここでのポイントは、OAuth対応を「ログインできる」だけで終わらせないことです。MCPクライアントがどの認可サーバーへ行き、どのスコープを要求し、どのリソース向けトークンを取得するのかを確認してください。

認可はアプリ側でも判断する

App Service認証を有効にすると、認証済みユーザーやクライアントの情報がアプリへ渡されます。Microsoft Learnでは、App Serviceがクレームを要求ヘッダーに注入し、X-MS-CLIENT-PRINCIPAL、X-MS-CLIENT-PRINCIPAL-ID、X-MS-CLIENT-PRINCIPAL-NAMEなどをアプリコードで利用できることが説明されています。(Microsoft Learn)

ただし、ここで重要なのは、App Service認証だけで業務上の認可がすべて完了するわけではない点です。App Service認証は認証済みかどうかを判断できますが、「このユーザーがこのMCPツールを実行してよいか」「このクライアントアプリが管理系ツールを呼べるか」は、アプリコードやAPIMポリシーで明示的に制御する必要があります。Microsoft Learnでも、App Service認証は既定では認証を提供するものであり、追加の認可判断が必要になる場合があると説明されています。(Microsoft Learn)

特にサービス間通信では注意が必要です。App Serviceへデーモンアプリがクライアント資格情報フローでアクセスする場合、アプリロールを定義してアクセストークンにrolesクレームを含められますが、そのロールを検証するのはApp Service認証ではなく、対象アプリのコード側です。(Microsoft Learn)

実務では、次のように分けると管理しやすくなります。

MCPツールの種類認可の考え方
読み取り専用ツールmcp.readなどの低権限スコープで許可
更新系ツールmcp.writeや業務ロールを要求
管理系ツール管理者グループまたはアプリロールを必須にする
外部API呼び出しユーザー委任が必要か、サーバー側マネージドIDでよいかを分ける
危険操作追加確認、承認フロー、レート制限、監査を必須にする

「認証済みユーザーなら全ツール実行可」は避けるべきです。MCPではツール単位で実行できる操作が大きく変わるため、API単位ではなくツール単位の認可設計が必要になります。

API Managementで入口を統制する

Azure API Managementを前段に置くと、MCPサーバーの入口を統制しやすくなります。APIMでは、validate-jwtポリシーによりJWTの存在と有効性を検証できます。また、Microsoft Entra IDが発行したJWTを検証する場合は、validate-azure-ad-tokenポリシーも利用できます。(Microsoft Learn)

APIMを使う場合の基本方針は、次の通りです。

APIMで行うこと目的
JWTまたはEntraトークン検証無効なトークンをApp Serviceへ到達させない
audience、issuer、scopeの検証別API向けトークンの流用を防ぐ
レート制限エージェント暴走やプロンプト経由の大量呼び出しを抑える
メソッド制限想定外のHTTPメソッドを拒否する
リクエストサイズ制限大量ペイロードやログ汚染を抑える
ログ付与correlation ID、クライアントID、ユーザーIDを追跡する

APIMのサブスクリプションキーだけをMCPサーバーの認証として扱うのは不十分です。サブスクリプションキーは呼び出し元アプリや契約単位の制御には使えますが、ユーザー本人の委任、スコープ、ロール、トークン期限、同意履歴の代わりにはなりません。

App Serviceを直接公開しない

MCPサーバーをApp Serviceでホストする場合、認証だけでなくネットワーク経路も確認してください。App Serviceのアクセス制限は、受信アクセスをブロックまたはフィルターするファイアウォールに相当します。既定のエントリポイントは公開されるため、制限がない場合はインターネットから到達できる可能性があります。(Microsoft Learn)

Private Endpointを使うと、クライアントはAzure Private Link経由でApp Serviceへ接続でき、パブリックインターネットへの露出をなくす構成を取れます。Microsoft Learnでは、Private Endpointとパブリックネットワークアクセス無効化により公開露出を排除できると説明されています。(Microsoft Learn)

ただし、Private Endpointを作っただけで完了ではありません。DNS、SCM/Kuduエンドポイント、デプロイ経路、APIMやFront Doorからのバックエンド到達性を合わせて確認してください。

よくある抜け漏れ影響対応
App Serviceの既定ホスト名が直接到達可能APIMを迂回されるPublic network access無効化またはアクセス制限
Kudu/SCMが公開されたままデプロイ面やファイル操作面が狙われるSCM側にもアクセス制限を適用
Private DNS未設定内部から名前解決できず403や接続失敗Private DNS Zoneを構成
APIMだけで認証しApp Service側は匿名バイパス時に無防備App Service側にも認証またはネットワーク制限
検証スロットだけ公開本番同等データにアクセスされるスロットごとに認証とアクセス制限を確認

シークレットはKey VaultとマネージドIDへ寄せる

Astrix Researchの調査では、静的APIキーやPATへの依存、環境変数経由の資格情報利用が多いことが指摘されています。APIキーやPATは長期化しやすく、漏えい時に権限範囲が大きくなりがちです。(Astrix Security)

Azure App Serviceでは、マネージドIDを使うことで、Microsoft Entra IDで保護されたリソースへシークレットを自前管理せずにアクセスできます。Microsoft Learnでは、マネージドIDによりAzureプラットフォームがIDを管理し、シークレットのプロビジョニングやローテーションが不要になると説明されています。(Microsoft Learn)

また、App ServiceのKey Vault参照を使うと、Key Vault内のシークレットをアプリ設定や接続文字列として参照できます。Key Vault参照では、既定でシステム割り当てマネージドIDを使用し、Key Vault Secrets UserロールまたはGet権限を付与する構成が案内されています。(Microsoft Learn)

管理者は、次の順番で見直すと安全です。

手順作業注意点
棚卸しApp ServiceのConfigurationからAPIキー、PAT、接続文字列を確認名前だけでなく値の参照先も確認
分類すぐ廃止できるキー、移行が必要なキー、外部SaaS連携キーに分ける影響先を記録
移行Azureリソース向けはマネージドIDへ移行RBACは最小権限
格納外部サービスのシークレットはKey Vaultへ移すアプリ設定にはKey Vault参照を置く
ローテーション既存キーを更新し、古いキーを無効化ログやCI/CD変数も確認
監査Key Vaultの取得失敗、異常なSecretGetを監視正常時の頻度を把握

「環境変数に入れているから安全」とは考えないでください。環境変数はコード直書きよりは扱いやすいものの、長期キーを複数環境に配布している時点で漏えい時の影響は残ります。

必要な権限を事前に整理する

MCPサーバーの堅牢化では、App Service、Microsoft Entra ID、Key Vault、API Management、Azure Monitorにまたがる変更が発生します。作業者に広すぎる権限を一時付与すると、作業後に戻し忘れるリスクが出ます。

マネージドID関連のMicrosoft Learnでは、システム割り当てIDの作成にはApp Serviceへの書き込み権限、ユーザー割り当てIDの作成にはManaged Identity Contributor、IDの割り当てにはManaged Identity Operator、RBACロール割り当てにはRole Based Access Control AdministratorまたはUser Access Administratorなどが例示されています。(Microsoft Learn)

作業必要になりやすい権限運用上の注意
App Service認証設定Webアプリの構成変更権限本番反映前にスロットで検証
Entraアプリ登録アプリ登録を作成・更新できる権限所有者を個人だけにしない
APIアクセス許可・同意管理者同意が必要な場合あり影響するスコープを事前レビュー
マネージドID作成Managed Identity Contributorなど作業後の不要IDを削除
RBAC割り当てRBAC管理権限リソースグループ全体ではなく対象スコープへ
Key Vault権限Key Vault管理またはRBAC管理権限読み取り対象シークレットを限定
APIMポリシー変更API Managementの編集権限変更前後のポリシーを保存
監視設定Azure Monitor、Log Analyticsの設定権限アクショングループの通知先も確認

本番環境では、作業担当者、承認者、レビュー担当者を分けるのが理想です。特にEntraアプリ登録とKey Vault権限は、MCPサーバーの実効権限に直結します。

監査ログとアラートで見るべき項目

MCPサーバーは、通常のAPIよりも「どのツールを呼んだか」が重要です。HTTPリクエスト単位の成功・失敗だけでは、実際に何が実行されたのか判断できません。

Azure App Serviceは、Azure Monitor、Application Insights、ログストリーム、メトリック、アラート、アクティビティログなど複数の監視手段を提供します。Microsoft Learnでは、Azure Monitorがメトリックとログを収集し、可用性、パフォーマンス、回復性の把握と通知に使えると説明されています。(Microsoft Learn)

Application Insightsは、OpenTelemetryによるテレメトリ収集、可用性、失敗、パフォーマンス、アラート、ログ、Workbooksなどを利用できます。AIエージェント向けの監視ビューにも触れられており、MCPサーバーのようなエージェント連携の監視基盤としても候補になります。(Microsoft Learn)

最低限、次のログ項目を設計してください。

ログ項目理由
呼び出し元ユーザーIDまたはクライアントID誰が実行したかを追跡する
認証プロバイダーEntra、外部IdP、アプリ認証を区別する
MCPツール名実行された操作を把握する
スコープまたはロール認可判断の根拠を残す
対象リソースファイル、DB、API、Key Vaultなどの影響範囲を追う
成功・失敗・拒否理由調査時の切り分けに使う
correlation IDAPIM、App Service、下流APIのログをつなぐ
レイテンシとサイズ異常な大量呼び出しや過負荷を検知する

Log Analyticsでの初期確認には、次のようなKQLを用意しておくと便利です。実際のテーブル名やカスタムディメンション名は、導入しているApplication Insightsの設定に合わせて調整してください。

requests
| where timestamp > ago(24h)
| where url has "/mcp" or operation_Name has "mcp"
| summarize
    total=count(),
    failed=countif(success == false),
    p95_duration_ms=percentile(duration, 95)
  by bin(timestamp, 15m), resultCode
| order by timestamp desc

ツール名をカスタムイベントとして記録している場合は、次のように異常な呼び出し増加を見つけられます。

customEvents
| where timestamp > ago(24h)
| where name == "mcp.tool.invoke"
| summarize count() by tostring(customDimensions.toolName), tostring(customDimensions.principalId), bin(timestamp, 1h)
| order by count_ desc

アラートは、まず次の5種類から始めると実用的です。

アラート目安
401、403の急増認証設定ミス、攻撃、期限切れトークンを検知
429の急増エージェント暴走や自動リトライを検知
5xxの急増認証変更後のアプリ側エラーを検知
Key Vaultアクセス拒否マネージドIDやRBAC設定ミスを検知
管理系ツールの実行高権限操作の監査通知

移行は段階的に進める

既存のMCPサーバーをいきなり完全なOAuth構成へ変えると、クライアント側の接続が止まる可能性があります。移行は、公開制限、認証追加、シークレット移行、監査強化の順で段階的に進めるのが安全です。

フェーズ目的実施内容
現状把握影響範囲を明確にするMCPサーバー、クライアント、ツール、下流リソースを一覧化
緊急制限匿名公開を止めるIP制限、APIM経由化、一時的なアクセス制限
認証導入OAuth/Entra認証を追加App Service認証、Allowed token audiences、401応答を設定
認可整理誰が何をできるか決めるスコープ、アプリロール、グループ、ツール単位の制御を設計
シークレット移行長期キー依存を減らすマネージドID、Key Vault参照、キーのローテーション
ネットワーク分離バイパスをなくすPrivate Endpoint、Public network access無効化、APIMバックエンド化
監視強化異常を検知するApplication Insights、Log Analytics、アラート、ダッシュボード
本番切替利用者影響を抑える段階リリース、ロールバック手順、周知を実施

App Service認証では、環境ごとにアプリ登録や権限を分けることが推奨されています。ドキュメントでも、デプロイスロットごとに別のアプリ登録を使い、環境間で権限や同意を共有しないことが、テストの問題を本番へ波及させないために有効と説明されています。(Microsoft Learn)

社内周知で伝えるべきこと

MCPサーバーのセキュリティ見直しは、Azure管理者だけでは完結しません。開発者、AIエージェント利用者、セキュリティ担当、ヘルプデスクへ事前に伝える必要があります。

開発者向けには、次の内容を周知してください。

今後、本番または本番データへ接続するMCPサーバーは、匿名公開を禁止します。Azure App Serviceで公開する場合は、App Service認証またはAPI ManagementでMicrosoft Entra IDによる認証を必須とし、ツール単位のスコープまたはロールを設計してください。APIキーやPATをアプリ設定、環境変数、README、CI/CDログに残す構成は原則禁止します。

利用者向けには、接続URLや再サインイン、同意画面の変更を説明します。

MCPサーバーのセキュリティ強化に伴い、接続URLがAPI Management経由のURLへ変わる場合があります。初回接続時にMicrosoft Entra IDでのサインインや権限同意が求められることがあります。接続できない場合は、利用しているMCPクライアント名、表示されたエラー、時刻を添えて問い合わせてください。

セキュリティ・運用担当には、監査観点を共有します。

MCPサーバーでは、通常のAPIログに加えて、ツール名、呼び出し元、スコープ、下流リソース、拒否理由を監査対象にします。401、403、429、5xx、Key Vaultアクセス拒否、管理系ツール実行をアラート対象にしてください。

失敗しやすいポイント

MCPサーバーの安全対策では、設定したつもりでも抜け道が残ることがあります。特に次のミスは本番前に潰してください。

失敗例何が危険か対策
App Service認証を有効にしたが匿名許可のまま認証が必須になっていないRequire authenticationを確認
APIMで認証しているがApp Service直URLが生きているAPIMを迂回されるPublic network access無効化またはアクセス制限
audを検証していない別API向けトークンを受ける可能性Allowed token audiencesを設定
アプリロールを作ったがコードで見ていないロールが実効制御にならないrolesやscpをアプリで検証
Key Vaultへ移したが広すぎる権限を付けた漏えい時の影響が大きい対象シークレット単位、最小権限にする
環境変数のAPIキーを残した旧キーが使われ続けるローテーションと無効化を完了
ログにトークンやプロンプト全文を出している機密情報が監査ログに残るマスキングとログ設計を見直す
devとprodで同じEntraアプリ登録を使うテスト変更が本番に影響する環境ごとに分離
Kudu/SCMを制限していない管理面が攻撃対象になるSCM側のアクセス制限も設定
MCPクライアントのPRM対応を見ていない認可フローで接続失敗するクライアントごとに検証

特に「APIMを置いたから安全」という判断は危険です。App Serviceの直アクセス、Kudu/SCM、検証スロット、旧URL、古いAPIキーが残っていれば、そこが迂回経路になります。

管理者が次に取るべき行動

まず、Azure上のMCPサーバーを棚卸しし、匿名公開、長期キー、監査なしの有無を確認してください。該当するサーバーがある場合は、公開範囲を制限し、App Service認証またはAPI ManagementでMicrosoft Entra IDによる認証を入れることを優先します。

次に、マネージドIDとKey Vaultへ資格情報を移し、トークンのaud、スコープ、ロール、PRM対応を確認します。最後に、Application InsightsとLog Analyticsで、MCPツールの実行履歴、拒否ログ、異常な呼び出し増加を追える状態にしてください。

今回のNoticeは、MCPを使うなという話ではありません。MCPを本番で使うなら、AIエージェント用の特別なAPIとして扱い、認証、認可、ネットワーク、シークレット、監査を最初から設計に含めるべきだという警告です。Azure App ServiceでMCPサーバーを運用している管理者は、まず「誰でも呼べるMCPエンドポイントが残っていないか」から確認を始めましょう。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次