HertaBase 致力于打造安全的后端基础设施,其架构遵循以下核心原则:
- 纵深防御 (Defense in Depth):在网关、路由、业务逻辑层与数据库层设置多重安全校验。
- 最小权限 (Least Privilege):所有模块(如 JS Sandbox)与系统操作默认剥夺非必要权限。
- 默认安全 (Secure by Default):新创建的 Collection 的 API Rules 默认值为
null(即仅管理员可访问),绝不默认开放。
作为 Phase 3 的核心特性,HertaBase 使用 rquickjs 引入了 JavaScript 运行时。为防止恶意 Hook 脚本破坏宿主,采取了极其严格的沙盒隔离:
- 内存限制:严格限制每个 V8/QuickJS 实例的内存,默认为 16MB(可配置)。
- 执行超时控制:利用 QuickJS 中断处理器 (Interrupt Handler) 限制 CPU 时间,默认最大执行时间为 100ms。
- 栈深度限制 (Stack Size):防止无限递归导致的 Stack Overflow 崩溃。
- 网络访问 (Network Access):默认完全禁用
fetch等网络调用;可通过显式的域名白名单 (Allowlist) 开启。 - 文件系统隔离 (Filesystem):不向脚本暴露宿主文件系统 API。可选的
$app.files只能访问配置的扩展文件根目录或 Storage 逻辑键,并强制执行路径规范化、符号链接逃逸检查、单文件上限和总配额。 - 环境变量限制:无法读取宿主 OS 的任何环境变量。如需使用环境配置,必须在系统后台添加并仅可通过
$app.env()获取。 - 上下文隔离:每次 Hook 执行均在完全独立且短暂的上下文中运行,杜绝状态污染。
- 出站请求限制:不暴露原生
fetch。$app.http.send对 scheme、域名、端口、DNS 解析结果和每次重定向重新校验,默认拒绝 localhost、私网、链路本地与云元数据地址,并限制超时和响应大小。 - 能力授权:邮件、HTTP、实时广播、文件写入和原生查询分别授权;未启用时返回明确错误,不允许脚本探测宿主服务或凭据。
- API Rules 强制执行:在请求下发至 SurrealDB 之前,HertaBase 会将 API Rules 编译并与查询合并。
- 防御 SurrealQL 注入:框架层面强制所有查询必须使用参数化绑定 (
$variables),彻底根除 SQL/SurrealQL 注入风险。 - 系统表隔离:
_admins、_collections等底层 Schema 配置表禁止通过公有 REST API 访问,仅可通过 Admin 内部接口或服务端 Rust/JS SDK 交互。 - 行级安全 (RLS):通过动态计算记录字段与
$auth上下文匹配度,在 SurrealDB 层实现不可绕过的行级数据隔离。
- TLS / HTTPS:生产环境下强制建议置于反向代理(如 Nginx/Caddy)之后以启用 TLS。
- CORS 策略:默认采用严格模式,要求显式配置
Allowed Origins;开发模式可放宽。 - 安全响应头 (Security Headers):Salvo 中间件自动注入:
X-Content-Type-Options: nosniffX-Frame-Options: DENY- 严格的内容安全策略 (CSP) 与 HSTS (HTTP Strict Transport Security)。
- 密码散列:使用抗 GPU 破解的 Argon2id 算法进行哈希。
- JWT 安全:当前使用 HS256 和至少 32 字节的密钥;Access Token 默认 15 分钟,Refresh Token 默认 7 天。
- 凭据撤销:刷新令牌 (Refresh Token) 采用轮转机制,一旦发现重复使用即视为失窃,自动级联撤销所有相关 Token。
- 异常拦截:所有敏感鉴权端点包含速率限制与多次失败后的账户临时锁定策略。
- 负载限制:严格限制 HTTP Request Body Size,防范 OOM 与带宽耗尽攻击。
- 文件上传限制:Phase 5 在写最终对象前校验 part 名称、数量、单文件大小、声明 MIME、扩展名、记录 schema 和 Collection Rule;JSON 请求不能伪造非空文件引用。
- 路径隔离:存储 key 拒绝绝对路径、空段、
.、..、反斜杠和 NUL。LocalFS 被限制在HB_DATA_DIR/storage,S3 bucket 保持私有。 - 文件令牌:短期令牌只绑定一个集合、记录和字段,并绑定账户
token_key。Authorization 请求头优先于查询令牌,凭据轮换会立即撤销文件令牌。 - 下载加固:下载重新校验记录字段成员关系,默认私有缓存并发送
nosniff;HTML、SVG、脚本、CSS 和 Wasm 等主动内容强制下载。 - 请求净化:路由层面对所有 URL Path Params 与 Query Params 进行强类型转换与非法字符清洗。
- 依赖 Rust 的
tracingcrate 输出结构化日志。 - 服务端日志默认将
info及以上级别持久化到_logs;HTTP 请求日志默认开启但可单独关闭。 - HTTP 日志仅保存请求元数据(方法、路径、状态、身份、referer、连接 IP、user-agent),不保存请求头、请求体或响应体,避免凭据和业务数据进入审计表。
- 关键安全事件(如管理员登录失败、高频 API Rules 鉴权拒绝、沙盒内存溢出/超时违规)将被标记为警告/错误级别并独立持久化,供事后审计分析。
当前版本尚未内置 WAF 功能;分布式环境下的全局速率限制暂依赖于外部网关组件。
(Placeholder: 请将安全漏洞提交至 wyatex@qq.com,在问题修复前请勿公开披露。)