【実務・中級編】 HTTPヘッダー書き換え仕様:Office 365テナント制限(Restrict-Access-To-Tenants-List)の実装 – ゼロトラスト&エンタープライズセキュリティ実践ガイド

境界線の向こう側を制御せよ:SASE/CASBで実現する「テナント制限」の深淵

ネットワークエンジニアとして現場に立っていると、「社用PCから個人のOffice 365にファイルをアップロードされたらどうする?」という問いは、避けて通れない悪夢のような命題だ。オンプレミス時代ならプロキシでURLをブラックリスト化すれば済んだかもしれない。だが、クラウドネイティブな現代において、そんな泥縄式のアプローチは通用しない。

そこで登場するのが、SASE(Secure Access Service Edge)やCASB(Cloud Access Security Broker)による「テナント制限(Tenant Restrictions)」だ。今回は、ただの機能説明ではない。パケットがどう書き換えられ、Microsoftの認証サーバーとどう対話するのか、その「現場のリアル」を掘り下げていこう。

—

1. なぜ「ヘッダー」を書き換えるのか?その背後にあるロジック

通常、ブラウザやOfficeクライアントが login.microsoftonline.com へアクセスすると、認証フローが始まる。このとき、SASEプロキシは透過的(あるいはPACファイル経由)に通信を横取りし、HTTPリクエストヘッダーに特定のフラグを埋め込む。

Microsoftの認証基盤は、この特定のヘッダーを検知すると、「お、このリクエストには制限がかかっているな」と判断し、許可されたテナント(許可リスト)に含まれないIDでのログインを自動的に拒絶する仕組みだ。これが「テナント制限」の正体である。

重要なHTTPヘッダーの構造

CASBが挿入するヘッダーは、大きく分けて以下の2つだ。

  • Restrict-Access-To-Tenants-List: 許可するテナントID(ディレクトリID)のリスト。セミコロンで区切る。
  • Restrict-Access-Context: 誰がこの制限をかけたのかを示す識別子。基本的には tenant-id-guid を入れるのが作法だ。

—

2. 認証シーケンスの現場的視点

通信フローは非常にシンプルだが、ここを理解していないと「なぜかログインできる」というトラブルシュートで迷子になる。

1. クライアント:login.microsoftonline.com へリクエストを送出。
2. CASB/SASEプロキシ:リクエストをキャッチ。ここでパケットを分解し、ヘッダーを挿入。
3. Microsoft認証サーバー:受け取ったリクエストに上記のヘッダーが含まれているか確認。
4. 認証処理:ヘッダー内のリストに含まれないテナントへのログイン試行なら、サーバー側が403エラーを返すか、ID/PW入力後に「この組織はアクセスを制限されています」と弾き出す。

注意点: この仕組みはあくまでHTTPS通信の「ヘッダー」を利用する。つまり、プロキシがTLSインスペクション(復号)を行えて初めて機能する点に注意してほしい。SSLオフロードをサボっている環境では、このヘッダー挿入は物理的に不可能だ。

—

3. 実装の現場:コードと設定のサンプル

理屈は分かった。では、どう設定し、どう検証するか。現場で使える実践的なコードを提示する。

Pythonによるリクエストヘッダーのシミュレーション

トラブルシューティング時、特定のヘッダーを付与して疎通確認を行うためのPythonコードだ。

import requests

# 制限をかけるテナントID(例)
allowed_tenants = "12345678-abcd-efgh-ijkl-9876543210ab"
context_id = "your-company-tenant-id"

headers = {
    # 許可するテナントのリスト
    "Restrict-Access-To-Tenants-List": allowed_tenants,
    # 制限を適用している組織のID
    "Restrict-Access-Context": context_id,
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
}

url = "https://login.microsoftonline.com/common/oauth2/authorize"

# 検証用リクエスト
response = requests.get(url, headers=headers)
print(f"Status Code: {response.status_code}")

curlによるデバッグコマンド

プロキシを経由した際、実際にヘッダーが挿入されているかを curl で叩いて確認する。

# プロキシサーバー経由でヘッダーを確認
curl -v -x http://proxy.example.com:8080 \
  -H "Restrict-Access-To-Tenants-List: 12345678-abcd-efgh-ijkl-9876543210ab" \
  -H "Restrict-Access-Context: your-company-tenant-id" \
  https://login.microsoftonline.com/

—

4. 現場のシニアからのアドバイス:ハマりポイント

この技術を導入する際、必ず遭遇する「壁」がある。

  • HTTPS復号の除外設定:全ての通信を復号すると、銀行系サイトやプライバシーに関わるサイトで問題が起きる。login.microsoftonline.com や aadcdn.msauth.net といったMicrosoft関連のFQDNだけを確実に復号し、かつヘッダーを注入する設定が必要だ。
  • テナントIDの取り違え:Restrict-Access-To-Tenants-List に入れるのは「ドメイン名」ではなく「GUID形式のディレクトリID」だ。これを間違えると、全ユーザーがログイン不可になるという「自爆テロ」が起きる。必ず検証環境で一度テストしてから本番に投入すること。
  • ブラウザキャッシュの罠:一度認証が成功すると、ブラウザはセッションを維持する。ポリシーを変更した直後に「反映されない!」と慌てないこと。ブラウザをシークレットモードにするか、キャッシュをクリアして再試行するのが鉄則だ。

終わりに

ゼロトラストの時代においても、こうしたHTTPヘッダーレベルの制御は、防御の最前線となる。泥臭いパケットの書き換え作業だが、これ一つで「野良テナントへのデータ漏洩」という大きなリスクを封じ込めることができる。

技術は常に進化するが、結局のところ、制御の肝は「誰が、どのデータに、どんな条件下でアクセスするのか」をどれだけ正確に可視化し、制御できるかという一点に尽きる。現場のネットワークを守る同志諸君、ぜひこの「ヘッダー制御」の力を使いこなしてほしい。

コメント

タイトルとURLをコピーしました