威胁模型:拥有普通账号的已登录用户攻击服务器。完整审计报告见
_experiments/security_audit_2026-09-02/(不入库),含实测复现记录。
严重/高危修复:
- 彻底移除文件夹打包下载(/api/download/folder 端点删除,gui/api_v1
目录下载分支改 410):文件型符号链接会被宿主进程解析,实测可读宿主
任意文件(含 settings.json 全部 LLM 密钥),删除比补校验更彻底
- XFF 伪造防护:get_client_ip 仅信任 ASTRION_TRUSTED_PROXIES
(默认空=不信 XFF);登录新增账号维度锁定(5 次失败锁 300s);
注册邀请码加爆破锁定;限流桶/失败表加 2 万键上限+GC 回收
- auth_debug.log 接入大小轮转;/api/client_debug_log 加限流+长度截断
- /host-login 增加 LINUX_SAFETY 检查且仅回环地址可用
容器加固:
- 默认 cpus=1 / memory=1g,新增 pids-limit=512、memory-swap、
no-new-privileges
- 新增每用户容器配额 MAX_ACTIVE_CONTAINERS_PER_USER(默认 3),
防止单用户占满全局容器池
api_v1:
- prompts/personalizations 的 name 加白名单校验(^[A-Za-z0-9_-]{1,64}$),
修复路径穿越写入;对话元数据中的引用名同步加白名单
- workspaces/conversations/messages/upload 四端点加用户维度限流
- 消息体加 MAX_MESSAGE_CHARS 上限(默认 200000,/api/tasks 同步)
- _path_within 加分隔符边界(修复 startswith 前缀碰撞)
其他:
- SVG 预览强制 application/octet-stream(修存储型 XSS 漏网)
- monitor_snapshot 缓存键加 username 维度(修跨用户快照读取)
- ensure/delete_workspace 加 workspace_id 白名单+父目录二次核验
- delete_folder 拒绝删除工作区根(crud_mixin 与容器代理同步修)
- GuiFileManager 死代码加名称校验防复活
- admin_dashboard 静态壳非 admin 访问一律 404
- /api/app/apk/latest 加登录校验+限流(原未认证可拉 133MB)
有意未修(见报告 7.3 遗留清单):容器 egress 过滤(部署层)、
--cap-drop ALL(怕破坏容器内工作流,已先上 no-new-privileges)、
API 用户/子智能体 LLM 按 token 计费(待产品决策)、str(exc) 收口、
WebSocket 限流、network_permission=restricted 容器语义。
验证:全部文件 py_compile 通过;冒烟测试 6/6 通过;关键新逻辑
(名称校验/路径边界/容器代理删除防护/限流回收)已单测级验证;
端点级行为待服务重启后实测复核(清单见报告 7.5)。
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
107 lines
5.3 KiB
Plaintext
107 lines
5.3 KiB
Plaintext
# ============================================================================
|
||
# Astrion 环境变量示例(开发备用)
|
||
#
|
||
# 推荐配置方式:<数据根目录>/settings.json 或系统环境变量(见 README)。
|
||
# 本文件仅供开发备用:启动时加载 仓库根目录/.env(不覆盖已有系统环境变量),
|
||
# 同名配置 settings.json 优先级更高。
|
||
# 用法:cp .env.example .env,按需修改;或运行 ./setup.sh 由向导生成。
|
||
# ============================================================================
|
||
|
||
# === 数据根目录 ==============================================================
|
||
# 运行态数据根目录(对话/用户/日志/部署级配置),默认 ~/.astrion/astrion
|
||
# ASTRION_DATA_ROOT=~/.astrion/astrion
|
||
|
||
# === 模型 ===================================================================
|
||
# 模型统一由 custom_models.json 注册(参考 config/custom_models.json.example,
|
||
# 生产环境放 <数据根目录>/config/custom_models.json)。
|
||
# 注意:旧的 AGENT_API_* / AGENT_THINKING_* / AGENT_TITLE_* 三件套已从代码移除,
|
||
# 配置它们不再有任何效果。
|
||
#
|
||
# 每轮最大响应 token(可选)
|
||
AGENT_DEFAULT_RESPONSE_MAX_TOKENS=32768
|
||
# 默认模型(可选,值为 custom_models.json 中已注册的 model_name;
|
||
# 不设置时使用列表中第一个可见模型)
|
||
# AGENT_DEFAULT_MODEL=
|
||
|
||
# === 第三方搜索(可选)========================================================
|
||
AGENT_TAVILY_API_KEY=
|
||
AGENT_TAVILY_API_KEY_2=
|
||
AGENT_TAVILY_API_KEY_BACKUP=
|
||
# 使用哪个 Tavily 环境变量请在 config/search.py 里改 TAVILY_API_KEY_ENV_NAME
|
||
|
||
# === 管理员账户 ===============================================================
|
||
AGENT_ADMIN_USERNAME=admin
|
||
# 生成哈希:python3 -c "from werkzeug.security import generate_password_hash; print(generate_password_hash('你的密码'))"
|
||
AGENT_ADMIN_PASSWORD_HASH=
|
||
|
||
# === Web Session =============================================================
|
||
WEB_SECRET_KEY=replace-with-random-hex
|
||
|
||
# === Web 服务 ================================================================
|
||
# 监听端口(统一来源,main.py / server.app / state 均读取此项)
|
||
WEB_SERVER_PORT=8091
|
||
# 监听地址:多用户/服务器用 0.0.0.0;单机使用建议 127.0.0.1 只听本机
|
||
WEB_SERVER_HOST=0.0.0.0
|
||
# 调试模式(同时控制 Flask reloader),生产保持 0
|
||
WEB_SERVER_DEBUG=0
|
||
# 可信反向代理列表(逗号分隔 IP,默认空=不信任任何 X-Forwarded-For)
|
||
# 仅当部署在 nginx/CF 等反代之后时才需要配置,例如 ASTRION_TRUSTED_PROXIES=127.0.0.1
|
||
# 直连部署切勿配置,否则登录限流可被伪造的 XFF 绕过
|
||
# ASTRION_TRUSTED_PROXIES=
|
||
|
||
# === 运行环境二进制(便携 release 包用,开发环境留默认即可)==================
|
||
# 子智能体使用的 node 可执行文件;留 "node" 表示走系统 PATH
|
||
AGENT_NODE_BIN=node
|
||
# Python 解释器路径;留空表示使用当前进程的 sys.executable
|
||
AGENT_PYTHON_BIN=
|
||
|
||
# === 终端容器沙箱 =============================================================
|
||
# 模式:docker(即 web 模式,多用户容器隔离)/ host(宿主机模式,本地个人)
|
||
TERMINAL_SANDBOX_MODE=docker
|
||
# 宿主机模式工作区配置(JSON 文件)
|
||
HOST_WORKSPACES_FILE=./config/host_workspaces.json
|
||
# 容器镜像(web 模式需先构建,见 README「Docker 镜像」一节)
|
||
TERMINAL_SANDBOX_IMAGE=my-agent-shell:latest
|
||
TERMINAL_SANDBOX_MOUNT_PATH=/workspace
|
||
TERMINAL_SANDBOX_SHELL=/bin/bash
|
||
# 资源与网络限制
|
||
TERMINAL_SANDBOX_NETWORK=bridge
|
||
TERMINAL_SANDBOX_CPUS=0.5
|
||
TERMINAL_SANDBOX_MEMORY=1g
|
||
# 容器内进程数上限(防 fork bomb)
|
||
TERMINAL_SANDBOX_PIDS_LIMIT=512
|
||
# 附加绑定目录(逗号分隔,可留空)
|
||
# 安全红线:严禁绑定 /var/run/docker.sock、/、/etc、/home、/root、~/.ssh、
|
||
# 数据根目录或源码目录——绑定 docker.sock 等于把宿主机 root 交给所有用户
|
||
TERMINAL_SANDBOX_BINDS=
|
||
# 运行时路径及容器名称前缀
|
||
TERMINAL_SANDBOX_BIN=docker
|
||
TERMINAL_SANDBOX_NAME_PREFIX=agent-term
|
||
# Docker 不可用时的行为:1=直接报错(web 模式建议);0=打印警告并尝试降级
|
||
TERMINAL_SANDBOX_REQUIRE=0
|
||
# 宿主机执行环境默认模式:sandbox / direct(建议 sandbox)
|
||
HOST_EXECUTION_MODE_DEFAULT=sandbox
|
||
# macOS 宿主机沙箱:额外可写白名单路径(逗号分隔,默认仅工作区+/tmp)
|
||
HOST_SANDBOX_MACOS_WRITABLE_PATHS=
|
||
# 注入到容器的额外环境变量(以 TERMINAL_SANDBOX_ENV_* 命名)
|
||
# 例如:TERMINAL_SANDBOX_ENV_HTTP_PROXY=http://127.0.0.1:7890
|
||
|
||
# === 资源控制 ================================================================
|
||
PROJECT_MAX_STORAGE_MB=2048
|
||
MAX_ACTIVE_USER_CONTAINERS=8
|
||
# 单个用户最多同时保活的容器数(防单用户占满全局容器池)
|
||
MAX_ACTIVE_CONTAINERS_PER_USER=3
|
||
# 单条消息最大字符数(防超大消息撑爆模型上下文/存储)
|
||
MAX_MESSAGE_CHARS=200000
|
||
|
||
# === MCP 工具扩展(可选) =====================================================
|
||
# 1=启用,0=禁用
|
||
MCP_TOOLS_ENABLED=1
|
||
# MCP 服务配置文件路径(默认 {DATA_DIR}/mcp_servers.json,即 ~/.astrion/astrion/<mode>/data/ 下,不在源码树)
|
||
# 下面仅为覆盖示例,按需启用:
|
||
# MCP_SERVERS_FILE=./data/mcp_servers.json
|
||
# MCP 协议版本(默认 2025-06-18)
|
||
MCP_PROTOCOL_VERSION=2025-06-18
|
||
# MCP 默认超时(秒)
|
||
MCP_DEFAULT_TIMEOUT_SECONDS=25
|