# 本地安全要求

> LMSP 服务的安全要求，包括回环绑定、配对与 Bearer Token、权限范围、防范恶意网页的 Origin 与 Host 校验、局域网模式和日志规则。

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

## 10.1 基线 {#baseline}

“只监听 localhost”并不等于绝对安全：恶意网页仍可能尝试访问本机端口。因此 LMSP 组合使用多项措施。

- 服务默认**必须**绑定回环地址。除非启用了局域网模式（[第 10.5 节](https://madeforagent.com/zh-cn/lmsp/1.0/security.md#lan)），否则**不得**监听 `0.0.0.0` 或任何其他非回环地址。
- 首次运行时，服务**应**生成高强度的随机服务密钥，并使用它（而不是任何内置的默认值）来签发和校验令牌。
- 对核心接口的每个请求都**必须**携带有效的 Bearer Token，[第 4.2 节](https://madeforagent.com/zh-cn/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-cn/lmsp/1.0/discovery.md#mdns)）。

## 10.6 日志与隐私 {#logging}

- 模型路径、日志、提示词和生成内容**不得**出现在 mDNS 广播中。
- 默认情况下，服务**应**只记录元数据（时间、接口、状态码、id、token 数量和耗时），**不应**记录完整的提示词和生成内容。
- 健康检查响应和错误详情**不得**包含模型路径、提示词、访问令牌等敏感信息。
