{
  "format": "agent-article-v0",
  "article_id": "EA-281",
  "canonical_url": "/tools/ea-281-tenant-isolation-for-multi-tenant-ai",
  "page_type": "reference",
  "claim_ids": [],
  "evidence_ids": [
    "EVD-EA-281-URL-0CAEC10F210C",
    "EVD-EA-281-URL-B9AF59A51651",
    "EVD-EA-281-URL-AC2AEFB331C7",
    "EVD-EA-281-URL-FB87768384BB",
    "EA-281-CURRENT-APPROVAL",
    "EA-281-CURRENT-BODY-READBACK"
  ],
  "unknown_ids": [
    "EA-281-UNKNOWN-01"
  ],
  "operational_object_ids": [],
  "provider": [],
  "models": [],
  "plans": [],
  "surfaces": [],
  "regions": [],
  "current_status": "CURRENT",
  "observation_status": "SPEC_ONLY",
  "freshness": "CURRENT",
  "last_verified": "2026-10-20",
  "supersedes": [],
  "superseded_by": [],
  "provenance": [
    "MANUAL-EA281-DRAIN-20261020-C1",
    "SRC-EA-281-URL-0CAEC10F210C",
    "SRC-EA-281-URL-B9AF59A51651",
    "SRC-EA-281-URL-AC2AEFB331C7",
    "SRC-EA-281-URL-FB87768384BB",
    "BODY-SHA256:8e7e7349223f3d05cec92215b75abf26836ca69de889ce9792a235fad9b69bc0"
  ],
  "article_sources": [
    {
      "id": "EVD-EA-281-URL-0CAEC10F210C",
      "evidence_class": "RESEARCH",
      "title": "[S1] Microsoft, Multitenancy and Content Isolation:",
      "href": "https://learn.microsoft.com/en-us/azure/search/search-modeling-multitenant-saas-applications",
      "supports": [],
      "limit": "元の監査済み資料に記載された参照先です。URLの復元は、資料の最新性や全主張の支持を新たに検証したことを意味しません。",
      "origin_class": "SOURCE_PACKET_REFERENCE",
      "source_or_experiment_ids": [
        "SRC-EA-281-URL-0CAEC10F210C"
      ],
      "supporting_locators": [
        "出典・provenance",
        "S1",
        "- [S1] Microsoft, Multitenancy and Content Isolation: https://learn.microsoft.com/en-us/azure/search/search-modeling-multitenant-saas-applications"
      ],
      "scope": "出典・provenance",
      "provenance_status": "SOURCE_PACKET_REFERENCE_PROJECTED"
    },
    {
      "id": "EVD-EA-281-URL-B9AF59A51651",
      "evidence_class": "RESEARCH",
      "title": "[S2] Microsoft, Considerations for Multitenant Agentic Systems:",
      "href": "https://learn.microsoft.com/en-us/azure/architecture/guide/multitenant/considerations/agentic-systems",
      "supports": [],
      "limit": "元の監査済み資料に記載された参照先です。URLの復元は、資料の最新性や全主張の支持を新たに検証したことを意味しません。",
      "origin_class": "SOURCE_PACKET_REFERENCE",
      "source_or_experiment_ids": [
        "SRC-EA-281-URL-B9AF59A51651"
      ],
      "supporting_locators": [
        "出典・provenance",
        "S2",
        "- [S2] Microsoft, Considerations for Multitenant Agentic Systems: https://learn.microsoft.com/en-us/azure/architecture/guide/multitenant/considerations/agentic-systems"
      ],
      "scope": "出典・provenance",
      "provenance_status": "SOURCE_PACKET_REFERENCE_PROJECTED"
    },
    {
      "id": "EVD-EA-281-URL-AC2AEFB331C7",
      "evidence_class": "RESEARCH",
      "title": "[S3] vLLM Semantic Router, Issue #2134:",
      "href": "https://github.com/vllm-project/semantic-router/issues/2134",
      "supports": [],
      "limit": "元の監査済み資料に記載された参照先です。URLの復元は、資料の最新性や全主張の支持を新たに検証したことを意味しません。",
      "origin_class": "SOURCE_PACKET_REFERENCE",
      "source_or_experiment_ids": [
        "SRC-EA-281-URL-AC2AEFB331C7"
      ],
      "supporting_locators": [
        "出典・provenance",
        "S3",
        "- [S3] vLLM Semantic Router, Issue #2134: https://github.com/vllm-project/semantic-router/issues/2134"
      ],
      "scope": "出典・provenance",
      "provenance_status": "SOURCE_PACKET_REFERENCE_PROJECTED"
    },
    {
      "id": "EVD-EA-281-URL-FB87768384BB",
      "evidence_class": "RESEARCH",
      "title": "歴史的所在記録:",
      "href": "https://docs.google.com/document/d/1Vd0BP7G2UyPDRQs_-8dPvTgQ78Tk6kcVGuMJjqNdr84/edit",
      "supports": [],
      "limit": "元の監査済み資料に記載された参照先です。URLの復元は、資料の最新性や全主張の支持を新たに検証したことを意味しません。",
      "origin_class": "SOURCE_PACKET_REFERENCE",
      "source_or_experiment_ids": [
        "SRC-EA-281-URL-FB87768384BB"
      ],
      "supporting_locators": [
        "出典・provenance",
        "- 歴史的所在記録: https://docs.google.com/document/d/1Vd0BP7G2UyPDRQs_-8dPvTgQ78Tk6kcVGuMJjqNdr84/edit"
      ],
      "scope": "出典・provenance",
      "provenance_status": "SOURCE_PACKET_REFERENCE_PROJECTED"
    },
    {
      "id": "EA-281-CURRENT-APPROVAL",
      "evidence_class": "RESEARCH",
      "title": "現行本文の監査・revision対応",
      "supports": [
        "現行台帳のAUDIT_PASSと候補・revision・本文ハッシュの対応を確認しています。"
      ],
      "limit": "監査状態と来歴の記録です。外部根拠の最新性や本文の全主張を追加保証しません。",
      "origin_class": "AUDITED_CANONICAL_RESEARCH_PACKET",
      "source_or_experiment_ids": [
        "MANUAL-EA281-DRAIN-20261020-C1"
      ],
      "supporting_locators": [
        "1KqhJtiSb2S84rWmeYVwKcT_76dBwZ_B0ZZuAWQqH0rQ/EA_REVISION_LEDGER#ea_id=EA-281&revision_id=EA-281-RESEARCH-20261020-R1&candidate_id=MANUAL-EA281-DRAIN-20261020-C1",
        "EA-281-RESEARCH-20261020-R1"
      ],
      "provenance_status": "CURRENT_CANONICAL_APPROVAL_READBACK"
    },
    {
      "id": "EA-281-CURRENT-BODY-READBACK",
      "evidence_class": "IMPL",
      "title": "現行本文の収録照合",
      "supports": [
        "公開生成入力の本文SHA-256が、監査済み候補に結び付いたハッシュと一致しています。"
      ],
      "limit": "本文の同一性の検査です。外部システムの挙動や全主張の真偽を実証したものではありません。",
      "checked_at": "2026-10-21",
      "origin_class": "IMPLEMENTATION_READBACK",
      "source_or_experiment_ids": [
        "BODY-SHA256:8e7e7349223f3d05cec92215b75abf26836ca69de889ce9792a235fad9b69bc0"
      ],
      "supporting_locators": [
        "content/staging/EA-281.md",
        "8e7e7349223f3d05cec92215b75abf26836ca69de889ce9792a235fad9b69bc0",
        "EA-281-RESEARCH-20261020-R1"
      ],
      "provenance_status": "CURRENT_APPROVED_BODY_HASH_MATCH"
    }
  ],
  "research_sections": [
    {
      "heading": "要点と前提",
      "text": "マルチテナントAIのテナント分離は、同じサービスを使う組織どうしが、互いの文書、会話、メモリ、秘密情報、ツール操作へ許可なく到達しないようにする設計である。同時に、一方の大量利用で他方の応答や費用管理が破綻しないようにする資源分離も含む。モデルへ「他社の情報を出さない」と指示するだけでは、データ取得や操作権限の境界にならない。\n\nテナントIDは検索タグにすぎない場合と、認証・認可と結び付いた境界である場合がある。入力文やクライアントの任意パラメータから得たIDをそのまま信用すると、別テナントのIDへ差し替えて検索できる。信頼できる認証情報と所属関係からサーバー側で対象テナントを確定し、検索、保存、非同期処理、ツール実行へ一貫して渡す必要がある。"
    },
    {
      "heading": "分離方式は一段階ではない",
      "text": "| 方式 | 利点 | 残る管理責任 |\n|---|---|---|\n| 共有基盤・行や文書で区分 | 小規模利用者を集約しやすい | すべての読書き経路に強制的な認可、誤った共有キャッシュの防止 |\n| テナント別の索引・DB領域 | 対象を選びやすく、誤操作の範囲を狭められる | 接続先の選択、管理者権限、同居基盤の負荷・障害 |\n| テナント別のサービス・実行基盤 | データと資源の境界を強めやすい | 配備・鍵・監視の数、設定drift、共通制御面の権限 |\n| 混在方式 | 大口・機密利用と小口利用を分けられる | 移行中の二重参照、方式をまたぐ一貫した認可 |\n\nAzure AI Searchの一次資料も、テナント別のインデックス、テナント別サービス、および混在方式を示している。[S1] ただし索引名を分けるだけでは、全索引を読める資格情報を持つアプリの誤配線を防げない。基盤上の分割と、実行主体に許す操作を合わせて設計する。"
    },
    {
      "heading": "テナントの文脈が途切れる場所",
      "text": "入口で認証しても、バックグラウンドジョブへテナントIDを渡さず、ワーカーの既定値で保存すれば、情報は混ざる。ジョブ、再試行、チェックポイント、オブジェクトキー、検索条件、ログへ、認証由来のテナントと処理IDを関連付ける。テナント情報が欠けたときに全体検索へ退避する設計は避け、処理を拒否する。\n\n会話ID、ファイルID、メモリIDは、推測しにくいだけでは認可にならない。取得や更新のたびに、対象の所属と要求者の権限を照合する。利用者が複数テナントに所属する場合、ログイン主体と今回選択した組織を分けて扱い、切替時に会話・検索・キャッシュの文脈を持ち越さない。\n\n共有エージェントIDが全社のツールへアクセスできる構成では、エージェント内部で選択ミスが起きると影響が広がる。MicrosoftのマルチテナントAgentic Systems資料は、共有ID、テナント単位ID、専用配備、委任認可などの選択肢と運用上の差を示す。[S2] 本稿では、その境界に沿ってツールゲートウェイがテナント・対象資源・操作・実行主体を検証することを提案する。LLMが生成したテナント名や操作引数は認可根拠にしない。"
    },
    {
      "heading": "検索だけを分離しても足りない",
      "text": "RAGでは、原文をテナント別に保存しても、チャンク、埋め込み、要約、再ランキング入力、評価集合が共有されることがある。検索結果だけでなく、モデルへ送る全コンテキストと、その前段のデバッグ出力も対象になる。キャッシュには、テナント、権限範囲、参照データの版を含む明確な区画を持たせる。類似文だからという理由で別区画の回答を返さない。\n\nこの点は抽象的な懸念だけではない。vLLM Semantic RouterのIssue #2134では、ユーザーごとの文字列を埋め込み入力へ追加しても、類似度による検索が別利用者の回答へ当たるという再現報告がある。[S3] これは報告された当時の構成の証拠であり、全版・全バックエンドが現在も同じ欠陥を持つという意味ではない。得るべき教訓は、識別子を文章に混ぜることと、候補を厳密に区分することが異なる点である。"
    },
    {
      "heading": "資源と運用の分離",
      "text": "共有モデルや検索サービスでは、利用者Aの長い入力や大量再試行で、Bの待ち時間が増えることがある。テナント別に同時実行、待ち行列、トークン・ツール回数、時間、費用の予算を設ける。上限到達時に無限再試行せず、拒否、保留、機能縮退を業務要件に応じて選ぶ。サービス全体の上限だけでは、誰が容量を消費したかを制御できない。\n\n運用者の管理画面、ログ検索、サポート用の代理アクセスも分離境界である。通常利用者のAPIを分離していても、共有トレースへ全文を出力し、全担当者が読めるなら情報管理は成立しない。管理アクセスの目的、承認、期限、対象テナント、操作記録を定める。テナント削除時には文書以外のメモリやキャッシュ、非同期ジョブにも処理を伝播する。"
    },
    {
      "heading": "検証は「Aが使えた」で終わらせない",
      "text": "同じ文面と同じローカルIDを持つ模擬データをA・Bに作り、両方向に検索、直接ID取得、添付参照、履歴再開、ツール実行、キャッシュヒット、ログ閲覧を試す。Aのアクセスが成功することに加えて、BからAが拒否されること、テナント情報欠落が拒否されることを確認する。管理者やバックグラウンド主体でも別に試験する。\n\n権限を途中で失効させ、進行中のジョブとキャッシュ応答がどうなるかを確認する。ジョブ開始時の認可だけで長時間の全操作を許すか、操作直前にも再認可するかは、失効を反映すべき期限と副作用に応じて決める。テナント移行時は、新旧保存先の参照とコピー完了を検証し、接続先を切り替えたことだけで完了扱いにしない。"
    },
    {
      "heading": "反証・適用境界",
      "text": "専用配備は誤った共有アプリ、運用者権限、外部サービスの設定まで自動で解決しない。一方、すべてを物理的に専用化すると費用や変更管理が過大になり、未修正の配備が増える場合もある。分離強度は契約、データ区分、障害影響、運用能力から選び、選択した境界を実際に検証する。\n\nまたテナント分離と、同じ組織内の利用者ごとの文書権限は別である。テナントAに属することだけで、Aの人事情報や経営資料を全員へ見せてよいわけではない。組織内の行・列・文書認可を追加し、回答、要約、ダウンロードにも引き継ぐ必要がある。"
    },
    {
      "heading": "OPEN_UNKNOWN",
      "text": "- 対象環境の認証、検索サービス、モデル契約、ツールID、資源予算、管理者運用は未取得。\n- A/B相互拒否、ジョブ再開、失効、キャッシュ、削除、移行、負荷分離の実試験はNOT_RUN。\n- 先行Luna完成本文は確認できず、旧記録は所在調査として保持する。既存製品が導入済みとは主張しない。"
    },
    {
      "heading": "SAFE_WORDING",
      "text": "「認証由来のテナント文脈を全データ・操作経路へ渡し、保存先と実行主体の認可を強制して分離する」。一方、「テナントIDをプロンプトに書けば分離済み」「索引を分ければ全経路が安全」「専用GPUなら会話やログも分離済み」とはしない。"
    },
    {
      "heading": "出典・provenance",
      "text": "2026-10-20に確認。工程表・試験例・制御の組合せは本稿の設計提案。\n\n- [S1] Microsoft, Multitenancy and Content Isolation: https://learn.microsoft.com/en-us/azure/search/search-modeling-multitenant-saas-applications （索引・サービス単位の分離と運用上の差）\n- [S2] Microsoft, Considerations for Multitenant Agentic Systems: https://learn.microsoft.com/en-us/azure/architecture/guide/multitenant/considerations/agentic-systems （ID・認可・テナント文脈）\n- [S3] vLLM Semantic Router, Issue #2134: https://github.com/vllm-project/semantic-router/issues/2134 （2026-06の再現報告。現行全版への一般化はしない。キャッシュ固有の対策はEA-283も参照）\n- 歴史的所在記録: https://docs.google.com/document/d/1Vd0BP7G2UyPDRQs_-8dPvTgQ78Tk6kcVGuMJjqNdr84/edit 、tab=t.0:21984–23383、特に22423–22490。完成本文を確認できなかったという記録であり、不存在の証明ではない。"
    }
  ],
  "human_url": "/tools/ea-281-tenant-isolation-for-multi-tenant-ai",
  "markdown_url": "/agent/article.md?path=%2Ftools%2Fea-281-tenant-isolation-for-multi-tenant-ai",
  "json_url": "/agent/article.json?path=%2Ftools%2Fea-281-tenant-isolation-for-multi-tenant-ai"
}