本地安全要求

10.1 基線

「只監聽 localhost」並不等於絕對安全:惡意網頁仍可能嘗試存取本機連線埠。因此 LMSP 組合使用多項措施。

  • 服務預設必須繫結回送位址。除非啟用了區域網路模式(第 10.5 節),否則不得監聽 0.0.0.0 或任何其他非回送位址。
  • 首次執行時,服務應生成高強度的隨機服務金鑰,並使用它(而不是任何內建的預設值)來簽發和驗證權杖。
  • 對核心介面的每個請求都必須攜帶有效的 Bearer Token,第 4.2 節列出的引導介面除外。僅僅來自回送位址,永遠不足以透過驗證。

10.2 配對與權杖

客戶端透過本機配對碼獲得屬於自己的 Bearer Token。使用者以服務提供的任意方式讓服務顯示配對碼,客戶端再提交該配對碼:

POST /lmsp/v1/pair
Content-Type: application/json
{
  "client_name": "example-client",
  "pairing_code": "K7QD-4M2X",
  "scopes": ["inference"]
}
請求欄位 含義
client_name 客戶端的顯示名稱,會展示給使用者。
pairing_code 使用者從服務獲得的配對碼。
scopes 可選,請求的許可權範圍列表。預設為 ["inference"]。

服務以權杖作答。token_type 始終為 Bearer:

{
  "client_id": "cli_01J8MAT3W6X9B2D5F8H1K4N7QZ",
  "access_token": "lmsp_example_3f9a1c52e7d84b60",
  "token_type": "Bearer",
  "scopes": ["inference"]
}

此後客戶端在每個請求中都傳送 Authorization: Bearer <token>。

  • 配對碼必須只能使用一次,並且應在 5 分鐘內過期。它應至少包含 40 位元熵。服務必須對失敗的嘗試限制速率。錯誤或過期的配對碼回傳 401 和 unauthorized。
  • 權杖按客戶端相互獨立,因此使用者可以撤銷某個客戶端而不影響其他客戶端。服務應允許使用者列出並撤銷已配對的客戶端。
  • 客戶端應把權杖儲存在作業系統鑰匙圈或認證管理員中。服務應只儲存每個權杖的雜湊。
  • 權杖缺失、無效或已被撤銷時,回傳 401、unauthorized 和 WWW-Authenticate: Bearer 回應標頭。權杖有效但缺少介面所需的許可權範圍時,回傳 403 和 forbidden。

10.3 許可權範圍

許可權被拆分為相互獨立的範圍。下載模型、刪除模型和執行工具,永遠不會附帶在 inference 範圍之內。

範圍 允許的操作
inference 讀取模型目錄,建立回應和任務,讀取並取消該客戶端自己的任務。
models:manage 載入和解除安裝模型。
models:install 預留。下載和刪除模型。
tools:execute 預留。在伺服端執行工具。

任務和已儲存的回應屬於建立它們的客戶端。對於來自其他客戶端的請求,服務應當作它們不存在來應答(task_not_found 或 response_not_found)。

10.4 瀏覽器與網路防護

  • 服務預設必須拒絕跨域的瀏覽器請求,只允許明確設定的 Origin 值。帶有其他 Origin 的請求回傳 403 和 forbidden。
  • 當某個來源被允許時,服務回應其 CORS 預檢請求,並在 Access-Control-Allow-Origin 中給出確切的來源,絕不使用 *。
  • 服務必須驗證 Host 請求標頭,以防止 DNS Rebinding。服務只接受自己所服務的主機名稱:回送名稱和位址,加上為區域網路模式設定的名稱。其他任何取值都回傳 403 和 forbidden。

10.5 區域網路模式

區域網路模式指監聽回送位址之外的位址。

  • 除非使用者明確開啟,服務不得啟用區域網路模式。
  • 在區域網路模式下,服務必須要求驗證,並且應同時啟用 TLS。除非使用者明確允許,客戶端不應透過明文 HTTP 向非回送位址傳送權杖。
  • 只有在區域網路模式下,且使用者也開啟了「區域網路發現」時,才允許 mDNS 廣播(第 3.2 節)。

10.6 日誌與隱私

  • 模型路徑、日誌、提示詞和生成內容不得出現在 mDNS 廣播中。
  • 預設情況下,服務應只記錄中繼資料(時間、介面、狀態碼、id、token 數量和耗時),不應記錄完整的提示詞和生成內容。
  • 健康檢查回應和錯誤詳情不得包含模型路徑、提示詞、存取權杖等敏感資訊。