更新日志

通往 v3.0.0 的道路。

每一项都对应一次提交与一次验证命令。条目只在实现、验证、文档全部完成后才会标记为 已发布,否则就是 规划中进行中

2026-06-24 已发布
单一二进制按规模授权 + 首次启动管理员

只发布一个二进制,其唯一强制区分是规模而非功能。每个版本都保留全部 WAF 能力;厂商签名授权只改变远程节点配额与显示版本。

  • 社区版 = 本地单机 WAF,永久免费。 没有有效授权时,完整产品运行在本地节点并允许 0 个远程节点。导入授权即可激活 Pro 或企业版节点配额,无需更换二进制。
  • 唯一且始终开启的闸门,位于接入事务内部。 旧的 license.mode 行会被忽略,写入会被拒绝。计数与插入共享同一事务,并发接入无法越过签名配额。既有站点、已知节点与本地管理始终不受授权状态影响。
  • 唯一信任锚。 授权由 Ed25519 针对二进制内嵌的厂商公钥签名;公钥覆盖项已移除。发布目标固定校验其 SHA-256 指纹,带版本的 claims 会拒绝未知套餐、非法配额与错误时间顺序。
  • 安全降级。 缺失、无效、篡改或过期授权都会回到社区版。数据平面永不停机,已知指纹始终可重连。
  • 需登录的实时状态。「系统 → 关于」展示版本、被授权方 / 到期与实时的「N / M 远程节点」计数;公开 Version RPC 不再暴露授权元数据。
  • 首次启动管理员。 单机首次启动且无用户、未提供凭据时,现在会自动创建 admin 并生成一次性随机密码(仅打印一次,仅以哈希存储);tiyi server 则打印可操作的警告,而不是留下无法登录的死胡同。
  • 厂商工具现在以 0600、排他且不覆盖的方式创建私钥;仅日期的到期值包含当天,截止 23:59:59Z
2026-06-18 已发布
站点路径路由(M9)

站点过去只能按主机匹配。现在可以按路径前缀分流到多个上游池 —— 一个主机、一张证书背后的 API 网关式路由 —— 同时保持数据平面与各层路径范围的一致。

  • 翻译器分发。 一条主机路由展开为按前缀的子路由,各自指向自己的上游池;零路由场景的输出与此前逐字节一致 —— 由 golden 测试钉住。
  • 按路由健康检查。 每条路由都有应用后健康探测(仅接受 200–399);即使站点默认后端健康,某条路由后端不健康也会让 apply 闸门失败。
  • 未命中策略。 未命中的路径回退到站点默认上游,或回退到无需默认的严格 404 白名单。
  • 完整归因。 每条访问日志都记录服务它的 route_idupstream_id —— 贯穿解析器、按日分区、API/CLI 过滤、导出与 Web 日志视图。
  • 统一路径范围。 /admin/Admin 在 WAF、IP 列表与限速器之间解析一致;大小写不敏感提示、实时规范化回显与命名的大小写重复错误在 Web + CLI 上守护每个路径输入。
  • 可通过 tiyi site routing get/set 或全新的 Web 路由编辑器驱动。实现后评审强化了零路由/404 校验、原子补偿捕获、replace 时稳定的路由 ID、严格的按池 endpoint/scheme/health-URI 检查,以及规范化的作用域 CRS 覆盖。
  • 验证:go test ./... 通过、buf lint 干净、vue-tsc 干净。交互式浏览器 QA 经运维要求跳过。
2026-06-18 已发布
策略限速编辑器

策略的 Rate Limits 标签页从草图升级为可供运维使用的编辑器,其校验会拒绝任何 agent 实际无法执行的规则。

  • 端点行。 路径模式限制(如 /login/api/auth/**)按解析后的客户端 IP 计键,阻断时返回 HTTP 429 —— 或用 log-only 金丝雀模式先观察再执行。
  • 客户端范围。 跨所有路径的全局上限,按 ipsession cookie 或命名 header(header:<name>)计键。Burst 为 0 表示突发等于每分钟限额。
  • 内联校验。 缺失路径/header、非正数限额、负 burst、重复的模式/范围以及未知 action 都会阻止保存。
  • 规范化。 API 将历史的 client_ipipdetectionlog 归一;编译器与运行时对历史行保持向后兼容。在 Coraza 之前执行,不使用持久化集合。
  • 验证:go test ./... 通过、buf lint 干净、vue-tsc 干净。
2026-06-09 已发布
AI 顾问层 + 交互式 Copilot

一个可选、默认关闭的 LLM 顾问层,位于确定性 WAF 之侧 —— 在控制平面内,绝不进入请求路径,也绝不自行变更状态。它富化事件、起草需人工批准的调优建议,并用自然语言回答关于日志的问题。

  • 流式分析。 全局 AI Copilot 抽屉可解释任意事件或单条日志,或分析一组过滤后的日志结果 —— 逐 token 流式返回。主题被收敛为脱敏白名单投影,绝不发送原始审计 JSON。
  • 对话式智能体。 StreamChat 助手通过对五个只读、租户范围的日志查询进行工具调用,回答开放式问题(「最近一小时 Top 10 攻击者」「example.com 今天是否被攻击、来自哪些 IP?」)—— 不新增任何日志面。
  • 只做顾问,绝不自治。 事件富化、策略调优补丁、自然语言→日志查询翻译、自定义规则草案(强制 log-only 金丝雀)与攻击活动关联都只是建议;唯一改变状态的路径是运维显式应用,经由既有审计化变更执行,并受 ai:apply 把关。
  • provider 无关 + 安全。 兼容 OpenAI(OpenAI / Ollama / vLLM / LM Studio / llama.cpp)与 Azure OpenAI;密钥经 KEK 加密、绝不作为设置项。每条提示都经过脱敏(§ 8.6)、双重 RBAC 把关(ai:read 外加主题自身的 incident:read/log:read)、限速并 panic 隔离。
  • 验证:go test ./... 通过、buf lint 干净、vue-tsc 干净、i18n_check.py 0 缺失,外加针对 mock provider 的 Playwright QA。
2026-06-09 已发布
离线图标、遥测浏览器、静态二进制
  • 离线图标包。 管理控制台过去会在运行时从公共 Iconify API 拉取图标 SVG —— 在隔离网环境中无法工作。现在图标在构建时从前端源码 + 后端菜单种子收集并打包,在首次绘制前注册完成。
  • 遥测浏览器。 基于内置遥测管线的全新 Top-N / 时间序列视图(QPS、top-K、序列)—— 无需外部时序数据库。
  • 静态二进制。 发布构建现为静态链接(CGO_ENABLED=0,纯 Go SQLite),去除了对构建主机 glibc 的依赖,同一产物可在更老的发行版(CentOS 7+)上运行。
  • 运维修复。 稳定的每事件访问日志 ID(支持精确查找)、启动时配置下发,以及让受权限限制的运维落在其真正可打开的首个页面(而非硬编码的仪表盘)。
2026-05-31 已发布
安全事件聚合 —— Phase 1–4

在每请求 security_event 流之上引入 security_incident 层。它与作为事实来源的事件行、审计链、告警评估器、SIEM 转发组合 —— 而不替代其中任何一个。

  • Phase 1 —— 聚合。(tenant, site, client_ip, attack_class) 在滑动空闲窗口内折叠为一个事件。security_incident_event 链表(event_id 唯一)持有关系;security_event.incident_id 是查询加速缓存。检测遵循 OWASP AppSensor;对外线格遵循 OCSF 类目分类。迁移 00200021
  • Phase 2 —— 运维打磨。 重开、合并、实时跟踪与按站点事件覆盖。UI 在合并/重开后保持事件在视野内,并在重新激活时关闭抽屉。
  • Phase 3 —— 确定性富化。 每个事件在创建时即打上 MITRE ATT&CK 技术 + 子技术与杀伤链阶段(由 attack_class + 规则 ID 家族派生),以及按最高频的国家 / ASN 地理汇总。运维可扩展的 mitre_mapping 覆盖表(迁移 0023)可覆盖内置映射。示例:一个 RCE + 933 事件得到 T1190 [T1059, T1505.003] / execution,地理 CN / AS4134。
  • Phase 4 —— 自动响应。 incident_response_rule 资源 + IncidentResponseRuleService CRUD,以及一个在事件状态迁移时通过既有审计写入路径变更实时控制(封禁 IP 列表 / 限速端点 / 告警 webhook)的响应器。三层默认关闭 —— 未创建则无规则、每条规则出厂 enabled=0、租户级开关 incident.response_enabled 默认 false。每次变更在审计链中归属到 system:incident-response。一个 60 秒 TTL sweeper 通过审计化的 RemoveIPListEntries 路径自动回退过期封禁条目并重编译相关策略。
  • 通过 tiyi incident / tiyi incident-response CLI 动词与 WAF → 自动响应 下的 Web UI 暴露。Sigma 风格的运维自定义关联 DSL 显式推迟 —— 固定的 12 类 + 4 轴键关联即已发布的 v1。
  • 验证:go test ./... 通过、buf lint 干净、vue-tsc 干净、i18n_check.py 0 缺失,外加每个 phase 的 CLI/API 运行时冒烟测试。
2026-05-31 已发布
告警重新设计 —— Phase 1–4(D1–D14)

保留评估器确定性的轮询形态与 SQLite 存储;补上每个成熟告警系统都有的另一半 —— 业界收敛的「评估 / 通知」分离(Prometheus + Alertmanager),且不引入任何外部依赖。

  • 正确性修复。 关闭了 UI 暴露但后端从未实现的规则 kind、被查询页大小静默截断的阈值计数,以及 UI/API 契约与投递实现不一致的通道 kind。
  • 生命周期,而非只触发一次。 通知 dispatcher 驱动 pending → firing → recovered/resolved,带 for 时长去抖、事件持续打开期间的重复通知与自动恢复 —— 取代旧的「只触发一次随后沉默」行为。
  • 持久性。 持久化通知 outbox(迁移 0026)加退避重试,关闭了可能永久丢掉新事件唯一通知的崩溃窗口。评估器状态持久化于 alert_eval_state(迁移 0025)。
  • 安全。 通道密钥(webhook URL、PagerDuty key、Slack token)从明文 JSON 改为 KEK 加密存储,读取时与写入审计链时都不再原样返回(迁移 0024)。
  • 默认安静。 分组、抑制与静默,外加按事件的备注时间线、规则生命周期与通道路由。
  • 过程中实现了此前缺失的 RPC、审计了静默变更,并清理了无用的证书 UI。
2026-05-31 已发布
合并前安全 + QA 加固
  • 关闭 fail-open RBAC 缺口 —— 若干系统与证书管理 RPC 未做权限检查,默认放行调用。现已加门,并有 rbac_coverage_test.go 回归测试断言整个面上的覆盖。
  • 单机面板读到零流量 —— telemetry.enabled 默认 true,会关掉旧的 rollup 写入器,但内嵌的 StoreAccess 路径从未调用 telemetry.Ingest,于是访问流量被记录在面板读取不到的地方。通过在 StoreAccess 中摄入修复,并加回归测试。
  • race 感知的测试预算 —— TestFlushReturnsTrueWhenDrained 有一个硬性 2s 排空预算,被 race 检测器的开销冲破;改为 race 感知。同时修复了一处既存的 gofmt 漂移,使 make lint 变绿。
v3.0.0-rc.1 2026-05-27 候选版本
日志列表支持直跳分页

CursorRequest.offset 上限 10 万,与 cursor 路径互斥。Offset 计数走过滤后的行,因此 CIDR / 规则过滤器跳过的是命中的行数。前端弃用 cursorStackwalkForwardTo,直接由目标页号算 offset。

  • 4 个 store 测试 + 2 个 wire 测试,固化 offset 语义并拒绝 cursor+offset 同传
  • 文件:proto/tiyi/v1/common.protointernal/store/log_repo.gointernal/api/log_handler.go、三个日志列表 .vue 文件
  • 验证:go test ./... 通过、buf lint 干净、vue-tsc 干净
2026-05-26 已发布
六项发布后 QA 修复
  • DEF-002 —— API 边界接受 IP 列表 geo:CC 条目(alpha-2/alpha-3 + 精选的 PRIVATE/LOOPBACK 桶);SecLang 编译器在编译期已把它们展开成 CIDR,所以条目现在完整跑通而不必把数据集 fork 一份。
  • DEF-003 —— 可书签的参数化路由(/agents/:id/waf/policies/:id)在后端菜单生成把它们丢掉之后被重新注册;router.hasRoute 防止重复注册。
  • DEF-004 —— ResolveAgentGroup 现在能针对 ListAgents 解析选择器,既接受已保存组的 id,也接受即兴规约预览(按 match_agent_ids ∪ tag_selectors 匹配)。
  • DEF-005 —— 单机节点命令现在被一个 2 秒消费者消费;reload 调用 ApplyActiveSitesrestart 作为 no-op 成功(拆掉本地管理平面是错误的默认行为)。
  • DEF-006 —— 信任配置变更现在写入 trust.update_profiletrust.reset_profiletrust.update_site_overridetrust.reset_site_overridetrust.refresh_cdn 行入审计链。
  • DEF-007 —— 访问日志默认 RecordingMode 在三层从 "off" 翻为 "on",符合系统设置文案 "默认访问日志模式 = 完整(自动)"。
2026-05-24 已发布
安全加固 + 前端清理

对全后端代码评审一遍,关闭了所有可执行项,且没有删除任何特性。

  • KEK 持久化 —— 只有显式配置 crypto.kek_file 时,服务端才会调用 db.SetKEK(envelope.LoadKEK)。之前的无条件覆盖会在每次重启时生成临时 KEK,静默打破已加密的证书私钥、ACME 账户与 DNS 凭据。
  • 持久 ed25519 配置签名密钥 —— 在 bundle_signing_key 单例行中存储,使用上文 KEK 信封加密。在迁移与 Bootstrap 之后,在 store.Open 中预热。替代了重启时内存生成器破坏节点 TOFU 固定的旧实现。
  • 节点版本回放保护 —— applyConfigUpdate 拒绝任何版本号不严格大于 LastAppliedRevision 的 bundle。
  • 迁移漂移检测 —— internal/store/migrate.go 记录每条已应用迁移的 SHA-256;在漂移时拒启。
  • 前端清理 —— 删除 16 个 Vben 演示页与 5 个支持 .ts 文件,重写布局壳,修复了把角色与 'standby'/'active' 比较的破损角色检查(实际值是 standalone|primary|secondary)。
2026-05-24 已发布
WAF 调优评审 —— PR 1–8

对策略调优抽屉进行了深度评审,通过 8 个协调的 PR 关闭所有可执行项。重点:

  • 审计链覆盖 —— rule_overridecustom_ruleip_listip_list_bindingrate_limit_endpoint 上的每一次 Upsert/Update/Delete 现在都会追加一行哈希链记录;之前的代码静默绕过它。
  • 评分覆盖发射 —— 从加性的 setvar:tx.inbound_anomaly_score=+N 改为按桶的 tx.<sev>_anomaly_score_pl<pl> 重置+设置,消除重复计数。
  • 批量 upsert 原子化 —— BulkUpsertRuleOverrides 在单个事务中执行 N 次 upsert,要么全成要么全败,最后只刷一次 bundle hash 与一次 apply。
  • 规则覆盖动作枚举 —— DEFAULT|DISABLE|LOG_ONLY|SCORE_OVERRIDE;旧的 disabled 布尔与 action 字符串标记为 deprecated;score_override 迁移到 optional int32
  • 字段掩码纪律 —— UpdatePolicy 强制空 ip_list_bindings 只在 update_mask.paths 包含该字段时才会清空。
  • 路径前缀校验 —— 在 API 边界拒绝非可打印 ASCII 与 SecLang 引号 metacharacter。
  • i18n 区域对齐 —— en-US 与 zh-CN 之间 1786/1786 个 key 对齐,vue-i18n 链式消息前的 @ 字面量已转义。
2026-05-16 已发布
客户端 IP 信任管道

统一信任管道终结了零散的 XFF 解析。替代了限速器中盲目以 XFF 优先的解析 —— 这是安全级别的修复。

  • tenant_settings.trust_profile_json + site.trust_profile_override_json
  • 自动拉取 Cloudflare、Fastly、Akamai、CloudFront、Front Door、GCLB 的 CIDR 快照;刷新器按 job 单 goroutine,带抖动间隔与 panic 隔离
  • 翻译器为每个 http.servers 块发射 trusted_proxies + trusted_proxies_strict
  • 严格的右到左行走,与 Caddy v2 字节级一致
  • TrustService.Explain 把任意 (peer, headers) 元组回溯到解析后的客户端 IP
  • 默认开启的告警:Origin Bypass Attempt(5 分钟窗口、严重)
2026-05-10 已发布
遥测管道(Phase 1–6)

计数器 → 采样 → API 树 → 读 API → Prometheus 导出器,完整通路。

  • Phase 1 —— 分片入流环、10 秒开桶聚合、每日 SQLite 分区位于 logs/rollup_10s/YYYY-MM-DD.db
  • Phase 2 —— 带 __other__ 桶的 Misra-Gries Top-K(SUM(*) 等于真实流量);每日字典日志;按小时/日/月降采样
  • Phase 3 —— 按 IP 的 LRU + 全局采样环;CRC 保护的循环文件 WAL;启动时回放
  • Phase 4 —— 按站点 URL 前缀树,带 MaxNodesPerSite + MaxDepth 上限;空闲叶子撤入 api_tree_archive
  • Phase 5 —— REST API 位于 /api/v1/telemetry/* + 前端浏览器
  • Phase 6 —— 本地管理 socket 的 /metrics Prometheus 导出器
  • 旧路径切换 —— 启用遥测后,logsink.recordAccessRollup 会短路掉旧的 traffic_rollup_minute 每事件写入(PRD-TELEMETRY 把它定为 100k EPS 下的 I/O 放大点)
2026-05-09 已发布
前端壳完成

所有服务端注入的菜单都解析到真实页面;所有 PRD-UI § 4 页面端到端打通;所有 PRD-UI § 5 中可复用的 Tiyi 组件都已就绪。

  • Dashboard 调用 GetDashboardStatsGetTrafficTimeseriesGetAttackDistributionGetTopAttackersStreamAlerts
  • 策略编辑器 12 个标签,可深链:CRS Core · HTTP Policy · Limits · 规则调优 · IP 列表 · 自定义规则 · 插件 · 限速 · 排除项 · 预览 · 版本 · 测试台
  • System 分支:健康、日志管道、用户、角色、设置(10 标签)、复制、更新中心(4 标签)、关于
  • 告警规则、告警通道、IP 列表、节点详情、遥测浏览器、审计 + diff 抽屉
  • 韧性原语:useResilientStreamformatRpcErroruseResponsiveWidth
  • 完整 zh-CN + en-US,所有 $t() 调用全部解析
2026-05-07 已发布
WAF 策略 —— 完整生命周期

store/API/Web/CLI 的 CRUD;内置模板(Strict/Standard/Permissive);版本快照与回滚;引擎状态切换;CRS 绑定;规则覆盖 / 自定义规则 / IP 列表 / 插件 / 限速调优;SecLang 预览;CRS 影响预览;策略测试台。

  • 带 CRS 最佳实践告警的确定性 SecLang 编译
  • 按站点策略覆盖把标量叠加到策略上而不必 fork
  • CRS 规则排除包(WordPress、Drupal、Nextcloud、phpBB、phpMyAdmin、XenForo、cPanel、DokuWiki)支持离线归档导入
2026-05-07 已发布
远程节点

一次性入网 token、挂载的 AgentStreamtiyi agent 运行时、实时远程 bundle 投递 / 缓存 / 应用结果上报、尽力的远程访问 / 安全 / 错误日志上传。

  • 固定的 bundle 签名公钥校验,首次连接 TOFU
  • 周期性指标推送(内存 / CPU)
  • 角色追踪(primary / secondary / agent)
  • tiyi agents issue-token | install-script | send-command | commands CLI
2026-05-06 已发布
ACME —— Phase A 到 D
  • Phase A —— 真正的 RFC 8555 客户端(包装 golang.org/x/crypto/acme)替代了之前的自签桩;按(租户、目录)的账户生命周期
  • Phase B —— 多节点 HTTP-01,每个节点上有 loopback 响应器,并通过节点流广播(token, key_authorization)
  • Phase C —— 带可插拔驱动注册表的 DNS-01:Cloudflare 驱动完整,Route53 与阿里云提供凭据校验桩;权威 NS 感知的传播检查器
  • Phase D —— 可观测性:Dashboard 暴露 certs_expiring_14dacme_renewals_failed_24h 等;首次启动种入默认告警
  • UI:"签发(ACME)" 模态、按行的续期按钮、"DNS Provider" 页面
2026-05-05 已发布
CRS 目录 + 站点 + 日志转发
  • OWASP CRS 4.25.0 嵌入到二进制中,首次启动自动导入
  • 通过 SystemService.ListUpstreamCrsReleases 抓取 GitHub 发布;离线归档导入也支持
  • 站点生命周期:store/API/Web/CLI 的 CRUD/状态;真实的 Caddy JSON 预览;上传证书与 WAF 策略选择
  • 单机运行时:Caddy 访问日志通过 tiyi.log_forwarder 转发;Coraza SecAuditLogType tiyi;实时安全跟踪
2026-05-03 已发布
WAF 拦截修复 + 边界 defer recover

关闭了拦截请求时的 "empty reply from server" bug。根因:audit_writer.auditMessages 中的有类型 nil 接口 panic(message.Data() 返回了非 nil 接口包裹 nil *MessageData)在 WAF 中间件返回 caddyhttp.HandlerError 之前抖断了 coraza-caddy 的延迟 tx.ProcessLogging

三个边界现在都有函数级 defer recover():audit_writer.Writer.Writelog_forwarder.writeAccessLine/writeWAFLinelogsink worker。跨层金丝雀位于 /debug/logsink/stats,暴露 panicked 计数。

2026-05-01 已发布
告警、审计 SIEM、完整单机可观测
  • 告警评估器带 security_thresholderror_thresholdaudit_failure 三种 kind,投递到 webhook / Slack / PagerDuty / 飞书 / 企业微信
  • 审计链行通过 SIEM 转发,带显式 siem.filter.include_audit 开关
  • RFC 5424 / CEF / LEEF 通过 TCP / UDP / unixgram
  • Vben 安全、访问、错误、实时跟踪、审计、告警(活动 / 规则 / 通道)页面
2026-04-28 已发布
基础
  • Go 1.25.0;ConnectRPC 1.19.2;proto/tiyi/v1/*.proto 下 14 个服务
  • SQLite 模式(完整 Phase-1)—— audit、CRS、policy_version、config_bundle
  • 服务模式:standaloneserver/primarysecondary/standbydashboardagent
  • 本地管理 socket,带 OS 文件权限鉴权
  • Argon2id 登录、JWT 签发 / 校验、刷新 token 链
  • Koanf 配置加载;SQLite 打开 / 迁移 / 引导;权限与菜单种子
  • 审计骨架 —— repo、哈希链、校验器、AuditService、变更审计行、tiyi audit CLI
← 返回首页