# 本地安全要求

> LMSP 服務的安全要求，包括回送繫結、配對與 Bearer Token、許可權範圍、防範惡意網頁的 Origin 與 Host 驗證、區域網路模式和日誌規則。

Source: https://madeforagent.com/zh-tw/lmsp/1.0/security/
Language: zh-TW
Specification: LMSP 1.0 (draft)
Updated: 2026-11-08

## 10.1 基線 {#baseline}

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

- 服務預設**必須**繫結回送位址。除非啟用了區域網路模式（[第 10.5 節](https://madeforagent.com/zh-tw/lmsp/1.0/security.md#lan)），否則**不得**監聽 `0.0.0.0` 或任何其他非回送位址。
- 首次執行時，服務**應**生成高強度的隨機服務金鑰，並使用它（而不是任何內建的預設值）來簽發和驗證權杖。
- 對核心介面的每個請求都**必須**攜帶有效的 Bearer Token，[第 4.2 節](https://madeforagent.com/zh-tw/lmsp/1.0/endpoints.md#conventions)列出的引導介面除外。僅僅來自回送位址，永遠不足以透過驗證。

## 10.2 配對與權杖 {#pairing}

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

```http
POST /lmsp/v1/pair
Content-Type: application/json
```

```json
{
  "client_name": "example-client",
  "pairing_code": "K7QD-4M2X",
  "scopes": ["inference"]
}
```

| 請求欄位 | 含義 |
| --- | --- |
| `client_name` | 客戶端的顯示名稱，會展示給使用者。 |
| `pairing_code` | 使用者從服務獲得的配對碼。 |
| `scopes` | 可選，請求的許可權範圍列表。預設為 `["inference"]`。 |

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

```json
{
  "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 許可權範圍 {#scopes}

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

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

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

## 10.4 瀏覽器與網路防護 {#browser}

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

## 10.5 區域網路模式 {#lan}

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

- 除非使用者明確開啟，服務**不得**啟用區域網路模式。
- 在區域網路模式下，服務**必須**要求驗證，並且**應**同時啟用 TLS。除非使用者明確允許，客戶端**不應**透過明文 HTTP 向非回送位址傳送權杖。
- 只有在區域網路模式下，且使用者也開啟了「區域網路發現」時，才允許 mDNS 廣播（[第 3.2 節](https://madeforagent.com/zh-tw/lmsp/1.0/discovery.md#mdns)）。

## 10.6 日誌與隱私 {#logging}

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