本地安全要求
- 规范性
- 草案 1.0
- 更新于
- 查看 Markdown
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 数量和耗时),不应记录完整的提示词和生成内容。
- 健康检查响应和错误详情不得包含模型路径、提示词、访问令牌等敏感信息。