Files
Telegram-Panel/docs/developer/admin-auth-security.md

48 lines
4.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 后台认证安全
适用版本:v1.31.87 起;要求持久化数据目录可写,前后端使用同一版本。此变更不修改 Telegram 账号、代理和任务数据。
## 初始化和升级
匿名登录页不得输出初始用户名、密码或秘密文件内容。默认不再分发固定口令;未提供口令时使用加密随机数生成一次性口令,写入凭据同目录的 `admin-bootstrap-password.txt`。Linux 创建权限 `0600`,Windows 继承私有数据目录权限;不写入日志、HTTP、镜像或发布资产。
现有已改密的凭据保留。历史未改密且仍为固定 `tgpanel123` 的凭据旋转为随机口令。重启不会重新生成已保存口令。旧默认文件仍参与持久化恢复识别,不能覆盖用户已设置的真实凭据。首次登录后必须改为至少 12 位、不同于当前口令的新密码。更改用户名不能跳过此步骤。
凭据原子保存成功后才更新内存状态。完成改密后清理初始化明文文件;清理失败仅记录不含秘密的错误,后续启动重试。
## 登录请求和会话
两个登录入口共用滚动窗口:每来源地址 60 秒内最多 5 次、进程全局最多 30 次,不排队且不永久锁定账号。拒绝返回 `429` 与剩余窗口的 `Retry-After`。转发 IP 依赖可信反代,默认全局窗口也限制伪造来源地址造成的哈希负载。多实例需在可信入口部署共享限流。
未知用户名也执行相同的 PBKDF2-SHA256 口令计算,然后组合用户名与口令结果;不靠添加固定 sleep 隐藏差异。服务端表单和 JSON 登录使用 ASP.NET 防伪 Cookie 与令牌;后端在认证之后执行防伪检查,桌面环回 HTTP 登录仍支持。
Cookie 携带持久化 `SecurityStamp`。升级首次填充旧凭据安全版本时,旧 Cookie 需重新登录。改密码或用户名轮换该版本并刷新当前请求会话,其他浏览器 Cookie 在下次请求时失效。
首次设置阶段由后端限制后台业务 API、Cookie 后台模块、旧 Blazor 通道及下载,改密入口统一使用 Vue 页面;身份查询、登录、防伪令牌、注销、用户名及密码设置仍可访问。健康检查及独立 API Key/Webhook 按各自合同鉴权,不能把模块任意 `AllowAnonymous` 当作后台豁免依据。
## 验收与排查
### SPA 静态资源与中间件顺序(v1.31.88 起)
前置条件是发布目录包含 `wwwroot/panel-spa/index.html` 及其引用的资源。
`/ui` 的公开 SPA 静态文件中间件必须先于 `UseRouting` 注册:路由选中
`/ui/assets/{**path}` 兜底端点后,ASP.NET Core 静态文件中间件会跳过已有文件,
导致入口 HTML 返回 200、所有 JS/CSS 返回 404,浏览器显示空白。
只前移 SPA 文件处理;路由、认证和强制改密检查仍按原顺序执行,默认 wwwroot
与持久化 uploads 的安全边界不变。真实 HTTP 测试须覆盖匿名及首次改密会话的
资源 GET/HEAD、正文、MIME 和缓存,以及原有 CSRF、业务接口和下载限制。
部署工作流使用 `tools/check-spa-assets.py` 检查入口引用的全部 JS/CSS,
请求间共享 50 秒预算,工作流另设 60 秒硬超时;任意资源失败都必须中止验收。该检查不等同于登录后的业务验收,
还需浏览器确认登录页及仪表盘渲染。回滚保留数据和凭据,仅恢复应用版本;
未包含此修复的 v1.31.87 存在上述路由冲突,不应作为已通过页面验收的回滚版本。
验收必须覆盖:匿名页面无秘密;表单/JSON 缺失、错误防伪令牌拒绝;带同浏览器令牌成功登录;登录后的匿名令牌不可用于改密;两入口共享额度、窗口恢复;未知用户名与错误密码均失败;首次登录不能读业务 API;仅改用户名仍受限;改密后当前会话可用、第二会话失效;随机口令重启后不变;旧已改密凭据恢复正常;桌面 HTTP 登录;发布目录无秘密文件。
`400 INVALID_CSRF_TOKEN` 时刷新页面,检查代理是否保留 Cookie 与请求头,避免混用旧前端;`429` 时按 `Retry-After` 等待;首次密码不可用时在服务器读取私有初始化文件或核对显式配置,禁止通过网页暴露文件。升级后需要重新登录属预期行为。不要删除 `admin_auth.json` 解决登录问题。
## 回滚
升级前备份持久化凭据和数据保护密钥,保留原镜像。代码回滚应保留当前数据目录和管理员已修改的凭据;旧代码会忽略新增安全版本字段。回滚到 v1.31.86 会重新带回匿名初始口令提示、弱限流和旧会话风险,不宜作为长期公网配置。没有发生新注册、账号换绑或数据库结构迁移。