安全
登录
- 管理员密码来自 Worker 机密
ADMIN_PASSWORD(至少 8 位;短了不生效,登录页会直说)。面板第一次读到它时,会把加盐的 PBKDF2 哈希存进 D1——不是明文,也不是能离线快速爆破的单轮摘要——这样重新部署丢了机密也不会被锁在门外。机密还在时以机密为准(恒定时间比较摘要),机密没了则用库里的记录校验。 - 登录后得到一个签名的会话 Cookie:HttpOnly、SameSite=Strict,HTTPS 下带 Secure,7 天有效。签名密钥由
TOKEN_KEY经 HKDF 派生出单独的一把(加密数据的密钥从不直接用来签名),并以当前的密码记录为盐:修改密码即让所有会话失效。 - 退出登录会让所有设备上的登录一起失效:Cookie 里带着一个会话代数,退出时它加一,之前签发的 Cookie(包括被人复制走的)都不再有效。
- 同一地址 15 分钟内失败 10 次后,暂停这个地址的登录;IPv6 按 /64 计(一台机器通常有整个 /64,换地址绕不过去)。
- 会改动数据的请求必须来自面板自己的页面(浏览器的
Sec-Fetch-Site/Origin),别的网站借你的登录状态发请求会被拒绝;SameSite=Strict 之外的第二道锁。 - 需要更强的保护时,可以在面板前面加 Cloudflare Access,放行
/api/agent/*和/sub/*(服务器和订阅客户端不会登录)。
页面
- 页面带 Content-Security-Policy(只运行面板自己的脚本,不允许被嵌进别的网站)、
X-Content-Type-Options: nosniff、Referrer-Policy: no-referrer;接口的回答一律不缓存。 - 订阅地址、节点链接、安装命令里的令牌默认遮住中间一段,点 👁 才显示,复制不需要先显示——截图、共享屏幕时不会顺带泄露。
服务器
- psm-agent 不监听任何端口,只主动用 HTTPS 连接面板。面板地址必须是
https://(本机和内网地址的测试面板除外)。 - 安装命令里的令牌一次性、24 小时有效;同一台服务器再看安装命令还是同一条(加密保存,D1 里没有明文),不会越点越多;怀疑泄露时在服务器页 重新生成,旧的立即失效。接入后换成这台服务器自己的 agent 令牌,面板只存它的 SHA-256。
- psm-agent 只执行白名单校验过的
psm命令:内核、协议、节点名、端口、密钥、中转的地址和端口等逐项校验,参数以数组传递,从不经过 shell。面板无法让服务器执行 PSM 命令行做不到的事。 - 同一个 agent 令牌一分钟内同步远超 psm-agent 正常频率时,面板让它放慢(429)。
- psm-agent 下载时用发布页的 SHA256SUMS 校验(校验的是完整性:发布页本身被篡改防不住,没有另外的签名)。
- 自动选择 REALITY 伪装目标时,面板自己查网络测绘引擎,API Key 不会发给服务器;服务器只拿到候选网站去做 TLS 检查。
数据
节点的协议参数(密码、密钥)、客户端链接、下发的任务、订阅令牌、安装命令的令牌、中转隧道的密码、服务器的诊断报告,在 D1 里都用 AES-GCM 加密保存。
agent 令牌、加入令牌、订阅令牌的查找都用哈希;数据库里没有明文令牌。
加密密钥放在哪:一键部署时面板自己生成密钥并存在 D1 里——和它加密的数据在一起,拿到数据库导出就能解开。系统设置里能看到密钥的位置,并按步骤把它挪进 Cloudflare 机密
TOKEN_KEY,再删掉 D1 里的副本,见 系统设置 · 数据加密密钥。旧数据每天自动清理(北京时间凌晨 3 点,由 Worker 的定时触发器执行,不依赖服务器在线;服务器同步时也会顺带清理,最多一小时一次):
数据 保留 操作日志 7 天 已完成的任务 7 天 中转测量 7 天(图表最多看 7 天) 每日流量 60 天(流量页显示 30 天) 登录失败记录 1 天 用过或过期的安装令牌 1 天 Worker 默认开启 Workers Logs(Cloudflare 控制台里只有你自己能看),请求日志会记下访问的地址,订阅地址里的令牌也在其中。不希望这样时,把
wrangler.jsonc里的observability.enabled改成false。订阅地址泄露时在面板上重置即可。仓库里没有任何密钥;密钥只在你自己 Cloudflare 账号的 Worker 机密里(或按上面说的,暂时在 D1 里)。