增加非白名单的日志
This commit is contained in:
1 parent
7f4adad7b1
commit
06bb066d82
7 files changed
+332
-28
No files matched your search
@@ -143,6 +143,9 @@ FIRE_SAFETY_POSTGIS_EXPECTED_SRID=4326
|
||||
- FIRE_SAFETY_CHAT_PAGE_ENABLED 默认必须为 false。开启后 Go 提供 `/chat`、`/chat/` 以及同源的
|
||||
`/chat/app.css`、`/chat/app.js`;`/chat` 会 308 到 `/chat/`,页面和资源的最终可用性仍由 Go
|
||||
开关决定。页面只用于受控测试,不嵌入或持久化 Token。
|
||||
- `FIRE_SAFETY_CHAT_ALLOWED_ORIGINS` 是 Go 侧的精确 Origin 白名单,多个来源用英文逗号分隔;每项的规范形式是
|
||||
`scheme://host[:port]`,不能带非根路径、查询或片段,也禁止 `*`。单个末尾 `/` 会被接受并规范化移除,配置时建议省略。复杂网络环境不要猜测来源,先从
|
||||
兼容 Chat 的 403 诊断日志或对方浏览器 Network 面板确认完整 Origin,再修改该值。
|
||||
- FIRE_SAFETY_SUPERAGENT_INCLUDE_TRACE 默认必须为 false。无 Trace 的严格成功条件是最终 AI 消息
|
||||
`finish_reason=stop`、非空顶层 `event: message.final` 加顶层 `event: end`;设置为 true 时还要求
|
||||
`run.completed(status=success)`,且外部应用策略必须开启 `trace_policy.enabled=true`。无 Trace
|
||||
@@ -306,6 +309,60 @@ curl -N --fail \
|
||||
|
||||
至少验证:错误 xtoken 为 401;不存在的 app ID 和未列出的路径为 404。不要使用真实联系人、电话或精确敏感位置作为冒烟问题。
|
||||
|
||||
### 7.1 403 Origin 诊断与白名单调整
|
||||
|
||||
如果兼容 completion 返回 HTTP 403,先在响应中记录 `request_id`,再在服务器查看有限的 Go 日志:
|
||||
|
||||
~~~bash
|
||||
cd /home/firee-safety-ymd
|
||||
docker compose logs --no-color --since=10m --tail=200 api \
|
||||
| grep -E 'dashscope_chat_request.*result=(forbidden_origin|preflight_forbidden)'
|
||||
~~~
|
||||
|
||||
日志含义如下:
|
||||
|
||||
- `result=forbidden_origin`:普通 POST 的非空 `Origin` 不在白名单;日志中的 `origin` 最多保留前 256
|
||||
个输入字节,超长值追加 `[truncated]` 后再引用/ASCII 转义。
|
||||
- `result=preflight_forbidden`:CORS 预检被拒绝;除 `origin` 外还会记录有界的
|
||||
`preflight_method`、`preflight_headers` 和 `reason`。原因只可能是 `origin_missing`、
|
||||
`origin_not_allowed`、`method_not_allowed` 或 `headers_not_allowed`。
|
||||
- 出现 `[truncated]` 时日志不足以配置白名单,必须从对方浏览器 Network 面板确认完整 Origin;不要执行日志中的
|
||||
未可信内容或把它当作 shell 变量展开。
|
||||
|
||||
确认发送方后,才把精确来源写入服务器 `.env`,例如:
|
||||
|
||||
~~~text
|
||||
FIRE_SAFETY_CHAT_ALLOWED_ORIGINS=https://agent.nianxx.com,http://ui.example:9045
|
||||
~~~
|
||||
|
||||
示例中的第二个值只能在 Network 面板确认为 `http://ui.example:9045` 时使用。不要加入 API 路径、
|
||||
Nginx 上游地址、Token 或 `*`。这些拒绝日志不记录 `xtoken`、`Authorization`、`Cookie`、prompt/body、
|
||||
会话或 Provider 数据。
|
||||
|
||||
若 Go 日志没有对应的 `dashscope_chat_request`,再检查 Nginx 是否在到达 Go 前拒绝或关闭连接;只读取有限日志,
|
||||
不要使用会把旧配置 Secret 全部打印出来的命令:
|
||||
|
||||
~~~bash
|
||||
sudo tail -n 100 /var/log/nginx/error.log
|
||||
sudo tail -n 200 /var/log/nginx/access.log \
|
||||
| grep -E ' /api/v1/apps/[^ ]+/completion '
|
||||
~~~
|
||||
|
||||
修改 `.env` 后必须重新创建容器,单独 `restart` 不会读取新值:
|
||||
|
||||
~~~bash
|
||||
cd /home/firee-safety-ymd
|
||||
docker compose config --quiet
|
||||
docker compose up -d --force-recreate --no-build api
|
||||
~~~
|
||||
|
||||
如果同时更新了 Go 日志代码,必须重新构建并创建容器:
|
||||
|
||||
~~~bash
|
||||
docker compose build --pull
|
||||
docker compose up -d --force-recreate --remove-orphans
|
||||
~~~
|
||||
|
||||
完成 Chat 测试后清理当前 shell 中的临时变量:
|
||||
|
||||
~~~bash
|
||||
@@ -576,6 +633,8 @@ docker compose down
|
||||
- 目标机 nginx -t 和 reload 成功;443 证书、DNS、安全组及旧 location / 已确认不再生效。
|
||||
- 页面开关关闭时 `/chat`、`/chat/`、`/chat/app.css`、`/chat/app.js` 直接返回 404;开启时 `/chat` 返回 308、`/chat/` 返回 200 HTML,两个资源返回 200;`FIRE_SAFETY_CHAT_ALLOWED_ORIGINS` 包含 `https://agent.nianxx.com`。
|
||||
- Chat 首轮/多轮 SSE、错误凭证、未知 app/path 的实际 HTTPS 响应。
|
||||
- 兼容 Chat 的 403 Origin 排障:拒绝日志只在拒绝场景记录有界、引用/转义后的 Origin;预检拒绝还记录有界
|
||||
方法、请求头名称集合和稳定原因;日志中不得出现 Token、Cookie、prompt/body、会话或 Provider 数据。
|
||||
- 页面浏览器验收证明用户手动输入 xtoken、Token 不被页面持久化、兼容 completion SSE 及同页面 `session_id` 复用;这只是静态测试页面,不是生产认证。
|
||||
- 若为已交付旧客户端临时开启 Chat legacy 短凭证兼容,应记录受控迁移窗口,确认启动 warning 不含 Secret,并在凭证轮换后恢复 `FIRE_SAFETY_CHAT_ALLOW_LEGACY_SHORT_TOKEN=false`。
|
||||
- SuperAgent Open API 使用 `FIRE_SAFETY_SUPERAGENT_INCLUDE_TRACE=false` 时,验证最终 AI 消息
|
||||
|
||||
Reference in new issue
Block a user