本地安全要求

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 数量和耗时),不应记录完整的提示词和生成内容。
  • 健康检查响应和错误详情不得包含模型路径、提示词、访问令牌等敏感信息。