一對多信任邊界

概念

一對多信任邊界

定義

當一個服務方(中繼站、Gateway、清算中心)持有等級最高的憑證,並代理 N 個彼此不該互相看見的租戶對外通訊時,決定「哪一份秘密放在哪一層、誰拿得到、誰永遠拿不到」的切法。

與一對一的 [[請求簽章]] 或 [[三層 API 驗證]] 不同,一對多的核心問題不是「怎麼證明是你」,而是「怎麼讓 N 個租戶各自可驗證,卻無法互相冒充,也無法上溯到那把最高權限的鑰匙」。

三層憑證分配

層級例子(LINE 中繼站)存放位置誰能取得
平台主憑證Channel Secret、Channel access token只在環境變數,連加密存都不存只有中繼站本身
租戶衍生憑證每站專屬 relay_secretD1,AES-GCM 加密存該租戶,經 server-to-server 兌換一次
租戶識別憑證site_keyD1,AES-GCM 加密存該租戶,登記時只回傳一次

判準:租戶只該拿到「驗證自己這條線」所需的最小憑證,永遠不該持有能代表整個平台的那一份。

關鍵數據點(附來源)

  • Channel Secret 連加密存都不存,只放 Workers 環境變數,D1 整個被撈走也換不到任何 token。(line-login-relay-cloudflare-workers)
  • 金鑰儲存判準:只需要驗證就存 Hash,需要拿原文出來重簽就 AES-GCM 加密存。relay_secret 要對轉發出去的 Webhook 重新簽章,Hash 單向簽不回來。(line-login-relay-cloudflare-workers)
  • 解密鑰匙 RELAY_ENC_KEY 只在 Workers 環境變數,不進資料庫,與被加密的資料分離存放。(line-login-relay-cloudflare-workers)
  • 事件路由:所有租戶共用一個對外 Webhook URL,中繼站以 line_user_id → site_id 對照表判斷該轉給誰,並以該站的 relay_secret 重簽。(line-login-relay-cloudflare-workers)
  • 熱路徑快取 resolve:{line_user_id} 設 1800 秒,解決高併發下每則事件都查一次 D1 造成的排隊。(line-login-relay-cloudflare-workers)

集中化的代價

信任邊界往中間收攏會同時買到便利與風險,三項代價是結構性的,不是實作沒做好:

  1. 獨立失敗變成共同失敗。 原本每個租戶自己的憑證掛掉只影響自己,集中後中繼站掛掉全部租戶同時失效。
  2. 配額共用產生互相排擠。 平台配額(如 LINE 推播額度)算在主憑證上,尖峰時租戶彼此爭搶,這條通常先於技術瓶頸爆掉。
  3. 責任轉移不等於成本消失。 「租戶零設定」是對租戶零,設定、合規與配額管理的責任被收到營運方身上。

前提與局限性

  • 最強前提:租戶接受身分掛在營運方的平台帳號底下。 只要租戶要求品牌帳號必須是自己的,這套架構直接不適用,沒有折衷版本。這與 [[內容自主權 vs 託管便利]] 是同一條軸線的相反端點。
  • 有規模甜蜜區。 租戶 3 家時是過度工程,直接教設定更快;租戶 300 家時配額與單點問題會先爆。適用範圍是一段區間,不是一個方向。
  • 合規風險可能大於技術風險。 若第三方平台的服務條款禁止一組憑證服務多個獨立商家,架構再嚴謹也不合法。這一層必須先確認。
  • 不含權限分級。 一組租戶識別憑證等於該租戶的全部能力,沒有 RBAC,與 [[三層 API 驗證]] 的同一條限制。
  • 憑證只回傳一次擋不住人為外洩。 它降低的是後台反覆曝光的面積,與 [[API 金鑰管理]] 「Key 管理靠人」的局限一致。

衝突標記

  • 與 [[API 金鑰管理]] 的「只存 Hash 不存明文」原則表面矛盾。實際上兩者適用條件不同:只需驗證存 Hash,需要拿原文出來重簽就必須可逆加密。該條目已補上此判準。

跨域同構

  • 銀行聯行代收與清算中心:清算中心持有最高等級憑證、對每家成員銀行發一組識別碼。金融業的成熟答案是「清算中心必須有最高等級的可用性保證」,對應到中繼站就是:可靠性投資的優先序高於再加一道簽章。
  • 電力變電所降壓:高壓集中在變電所,配到每戶的是低壓。用戶端不接觸高壓不是功能缺陷而是設計目標,代價同樣是變電所故障全區停電。
  • 旅行社簽證代辦:把一次性的學習成本攤提到上千件,代價是掛在代辦方的配額與信譽底下。

關聯概念

  • [[Gateway 架構]]
  • [[請求簽章]]
  • [[API 金鑰管理]]
  • [[HMAC 驗證]]
  • [[重送攻擊防禦]]
  • [[第三方服務依賴風險]]
  • [[內容自主權 vs 託管便利]]