diff --git a/CHANGELOG.md b/CHANGELOG.md index b71a4db..fd3c791 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,89 @@ ## [未发布] +### 新增 —— L2 系统级审计兜底(`7d781d1`,`docs/AUDIT-L2.md`) + +L1 是 agent 自己记的,只看得见经过自己 RPC 的调用;攻击者**绕过 agent 直接操作机器、 +或把 agent 停掉**时 L1 全盲。L2 采集操作系统自己的审计事件,补的正是这块。 + +- **信任边界(写进能力描述与文档,不夸大)**:采集器与 agent 同进程同权限 —— + 能停 agent 就能停采集器。故本地 `audit-l2.log` 只是**归一化副本**,防篡改价值有限; + 真正的独立性来自**把记录转发出机**(与 SECURITY.md §4.8 锚定同一思路)。本实现不自动转发。 +- **Windows 落地**(选内置 auditpol 而非 Sysmon —— 第三方驱动需单独分发、重启生效、 + 版本行为有差异;内置策略零依赖即可立起来;检测到 Sysmon 则并用,未装不尝试下载): + - `status`:查策略是否启用,并提示两个关键开关 —— `SCENoApplyLegacyAuditPolicy` + (不设它,组策略旧式类别策略会盖掉 subcategory,表现为「auditpol 显示已启用但 + 事件日志里没有 4688」)与 `ProcessCreationIncludeCmdLine_Enabled`(不开则 4688 + 只有进程名,看不到参数); + - `enable`(需管理员)/ `collect`(拉取并归一化落盘,独立于 L1 的 `audit-l2.log`)/ + `verify`(校验 L2 链,与 L1 同构的「对含 prev 的记录求哈希」)。 +- **三端现状如实记录**:Linux(auditd)需预装、macOS(ESF)受 Apple entitlement + 限制,均**未实现** —— 非 Windows 被控端明确报 `E_UNSUPPORTED_PLATFORM`, + 不伪装成空结果。CLI 已有 `nodeagent audit l2` 入口。 + +### 新增 —— 交付流水线规范落地(`2bf45fd`,`docs/DELIVERY-PIPELINE.md`) + +将《代码审计 → 上线 完整交付方案》适配到 nodeagent。原方案面向 Web/容器服务, +nodeagent 无服务端、无容器、无多环境 —— 照搬会产生「跑得很好但守不住任何东西」的 +假门禁,故每个阶段给三档判定:适用 / 改造后适用 / 不适用(但必须给替代)。 + +关键替换:容器镜像扫描 → **交付物 PE 架构断言**(arm64 包误装 x64 node.exe 的真实事故); +DAST → **协议健壮性测试**(对外输入面是 WebSocket RPC,非 HTTP); +dev/staging/prod → **真机矩阵**(Win x64/arm64、macOS、Linux); +金丝雀 → **设备分批自更新**(先一台试点,latest.json 灰度); +Prometheus → `system.metrics` + 发布后复核清单。 + +- 覆盖率门禁 `scripts/ci/check-coverage.mjs`:全量**只观测不阻断**(实测基线 66.9%), + 变更文件行覆盖 ≥70% 阻断。 +- **LKG 回滚锚点**:被控端「能启动」后记最后已知可用版本(`agent-lkg.json`), + 给回滚提供确定目标;**刻意不做自动回滚**(无法归因、回滚循环、失控 —— 决策权留给控制端)。 + +### 新增 —— Linux 被控端适配(`00992e5`,`docs/DEPLOY-LINUX.md`) + +面向「服务器型被控端」(命令/状态/文件/审计;无 GUI),实测环境 Debian 12。 + +- `scripts/install-linux.sh`:一键安装器(对齐 Windows `install.ps1` 语义)—— + 自动获取 Node 运行时(走 npmmirror)、**systemd 服务**(系统级 / 用户级+linger / + `--no-service` 三种模式)开机自启、幂等(复用既有密钥并自动备份 `agent.json`)、 + 卸载保留配置(`--purge` 才删)。 +- `apps/agent/src/util/platform.ts`:**统一平台守卫**(`assertPlatform` / + `assertGuiPlatform` / `assertWindows`),抛 `E_UNSUPPORTED_PLATFORM` 并带上 + 「支持哪些平台」。修复前的表现是**误导性错误**(`screen.capture` 在 Linux 上报 + 「region 宽高必须 ≥ 1」,像是参数没传对)。 +- `scripts/verify.mjs`:补 `E_UNSUPPORTED_PLATFORM → skip`(此前把「平台不支持」 + 记成失败)。 + +### 变更 —— 质量门禁与 CI 修复(`141f479` / `c7d596e` / `630ea7d` / `3680218`) + +质量门禁曾**连续 8 次运行全部失败**(从引入起就没绿过)—— 一道长期红的门禁等于 +没有门禁。两处独立原因: + +- **SCA**:`.npmrc` 指向 npmmirror(加速用),但镜像不实现 audit 接口, + `pnpm audit` 必报 `ERR_PNPM_AUDIT_ENDPOINT_NOT_EXISTS` → 显式加 + `--registry=https://registry.npmjs.org`。 +- **typecheck 缺 build 顺序**:各包 import 的是 `@nodeagent/protocol` 的**类型产物** + (`dist/*.d.ts`)。CI 全新检出没有 dist → 集体 `TS2307: Cannot find module`, + 而本地因为 dist 还在看不出来(典型「本地绿 / CI 红」)→ typecheck 前先建 protocol。 + 注入验证:移走 `packages/protocol/dist` 复现 TS2307 → 执行 build 步骤 → 零错误。 +- 精确忽略 4 处测试占位密钥误报(`630ea7d`);typecheck 前改为**全量构建** + (只建 protocol 不够,`3680218`)。 + +### 新增 —— 控制台安装包接入 Release(`9f95560`) + +`scripts/release.mjs` 此前只产出 agent / cli / mcp,`apps/console` 从来没接进去。 +后果很具体:控制台修复**只存在于 CI artifact**,而 artifact retention 是 7 天 —— +用户从 Release 页面下载到的永远是旧控制台(「修复发了但没人拿得到」)。 + +- `console-windows.yml` 加 `workflow_call:` + `publish` job:只有 tag 才发布; + 下载两架构产物 → **断言安装包数 ≥ 4**(exe+msi × x64/arm64),少了直接报红, + 绝不静默少发一个架构;`gh release upload --clobber` 挂到 Release。 +- 新增 `console-release.yml`:只认 `push: tags: ['v*']`。 +- **为什么不把 tags 直接写进 console-windows.yml**:它带 `paths` 过滤, + `paths` 与 `tags` 并存时 tag 推送会被路径判定挡掉而**静默不触发** —— + 失败形态是「什么都没发生」,最难察觉。拆成「日常验证走分支 + 发布只认 tag」最稳。 + +--- + > 主题:**控制台「去命令行化」** —— 双击应用即用,启停/重启/更新/日志/托盘常驻/开机自启全部在界面里完成。 > 目标原文:「不再打开命令行窗口,运行应用之后,有启动、停止、重启、检查更新等功能, > 有日志功能,可以后台运行和开机自启等等功能」。 @@ -113,7 +196,9 @@ 故 `taskkill` 收进程树、PowerShell 计划任务、`node.exe` 路径等分支此前从未产出过 Windows 产物。 - **实测产物**:x64 `.msi` **34.2 MiB** / NSIS **23.2 MiB**;arm64 NSIS **19.5 MiB**(均低于 40MB 目标)。 `if-no-files-found: error` + `fail-fast: false`:一条架构没产出就报错,同时一条挂了不掩盖另一条的结果。 -- **尚未接入 `scripts/release.mjs`**:安装包目前只作为 CI artifact 产出,未随 Release 发布。 +- **接入 Release**:安装包起初只作为 CI artifact 产出(retention 7 天),已由本版 + 「控制台安装包接入 Release」一节补上 —— tag 发布时四包(exe+msi × x64/arm64) + 挂到 GitHub Release,修复才真正到得了用户手里。 > **首个 run 两个 job 全红,但错的不是构建,是断言。**(run `38151366534`) > 两个 job 的失败点完全一致,而日志显示构建链路**一路全绿**:构建机架构(arm64 runner 上 diff --git a/apps/agent/package.json b/apps/agent/package.json index 76a3287..e006807 100644 --- a/apps/agent/package.json +++ b/apps/agent/package.json @@ -1,6 +1,6 @@ { "name": "@nodeagent/agent", - "version": "2.0.3", + "version": "2.1.0", "private": true, "type": "module", "main": "./dist/index.js", diff --git a/apps/cli/package.json b/apps/cli/package.json index a421cd8..a658503 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,6 +1,6 @@ { "name": "@nodeagent/cli", - "version": "2.0.3", + "version": "2.1.0", "private": true, "type": "module", "main": "./dist/index.js", diff --git a/apps/console/package.json b/apps/console/package.json index 3a4c4c5..85138c9 100644 --- a/apps/console/package.json +++ b/apps/console/package.json @@ -1,7 +1,7 @@ { "name": "nodeagent-console", "private": true, - "version": "2.0.3", + "version": "2.1.0", "type": "module", "scripts": { "dev": "vite", diff --git a/apps/console/src-tauri/Cargo.lock b/apps/console/src-tauri/Cargo.lock index 471c316..bc2b38e 100644 --- a/apps/console/src-tauri/Cargo.lock +++ b/apps/console/src-tauri/Cargo.lock @@ -2101,7 +2101,7 @@ checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "nodeagent-console" -version = "2.0.3" +version = "2.1.0" dependencies = [ "serde", "serde_json", diff --git a/apps/console/src-tauri/Cargo.toml b/apps/console/src-tauri/Cargo.toml index dbd4b1b..3ed61af 100644 --- a/apps/console/src-tauri/Cargo.toml +++ b/apps/console/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nodeagent-console" -version = "2.0.3" +version = "2.1.0" description = "nodeagent 桌面控制台(主控 + 被控一体,含本机服务托管)" authors = ["jkooe"] edition = "2021" diff --git a/apps/console/src-tauri/tauri.conf.json b/apps/console/src-tauri/tauri.conf.json index 90b2b91..1358964 100644 --- a/apps/console/src-tauri/tauri.conf.json +++ b/apps/console/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "nodeagent-console", - "version": "2.0.3", + "version": "2.1.0", "identifier": "cn.jkooe.nodeagent-console", "build": { "beforeDevCommand": "pnpm dev", diff --git a/apps/console/src/components/QuitGuard.vue b/apps/console/src/components/QuitGuard.vue index 5594566..3112c76 100644 --- a/apps/console/src/components/QuitGuard.vue +++ b/apps/console/src/components/QuitGuard.vue @@ -1,6 +1,6 @@