背景 / 问题
运维专家(expertId=ops)可通过 Bash / BashOutput / KillShell 在本机容器或远程主机(ssh/sshpass)执行 shell 命令。当前无人工审批,存在误操作与安全风险:
AgentScopePermissionSupport 使用 PermissionMode.BYPASS,注释写明:"Our chat UI does not collect confirmations yet"
AgentScopeToolConfirmSupport 对 pending 工具调用自动确认
- 前端
ThinkingProcess.vue 仅展示工具调用时间线,无 Approve / Deny 按钮
- Bash 在
ai-apm-web 容器内以 JVM 进程权限运行,非沙箱;远程 SSH 可触达主机级操作
典型风险命令:rm -rf、kill -9、docker stop、sshpass ... ssh ... "..." 等。
期望方案
1. 启用 AgentScope 审批流(P0)
- 对运维专家的
Bash、KillShell(及可选 BashOutput)从 BYPASS 改为 ASK 模式
- 移除或按策略关闭
AgentScopeToolConfirmSupport 的自动确认
- Agent 进入
ToolCallState.ASKING 时暂停 ReAct 循环,等待用户操作
2. 后端 Pending Approval API(P0)
新增接口(路径可调整):
| 接口 |
说明 |
GET /api/v1/ai/sessions/{sessionId}/pending-approvals |
列出待审批工具调用 |
POST /api/v1/ai/sessions/{sessionId}/approvals/{toolCallId} |
{ approved: true|false, reason?: string } |
- 持久化 pending 状态:sessionId、toolCallId、toolName、command、expertId、taskId、创建时间
- Approve → 注入
ConfirmResult(true) 并恢复 Agent 执行
- Deny → 注入
ConfirmResult(false),Agent 重新规划或向用户说明
- Brain → Ops 异步派发(
ExpertTaskService)路径同样支持暂停/恢复
3. 前端审批 UI(P0)
- 在 AI 平台聊天区,当 Bash/KillShell 待审批时展示:
- 完整命令预览(复用
formatBashToolParamsDisplay)
- 批准 / 拒绝 按钮
- 远程命令(含 ssh/sshpass)额外警告标识
- 审批期间可选禁用发送新消息,避免状态冲突
- 审批结果写入对话时间线
4. 审批策略(P1,可配置)
| 策略 |
行为 |
| 默认 |
所有 Bash / KillShell 需审批 |
| 只读白名单 |
ls、cat、df -h、ps、docker ps 等自动放行 |
| 高危黑名单 |
rm、kill、shutdown、curl | bash 等强制审批 |
| 按专家配置 |
BuiltInExpertCatalog 中为 ops 增加 requireCommandApproval: true |
配置可通过环境变量或系统设置页管理。
5. 审计与脱敏(P1)
- 记录:审批人、时间、完整命令、执行结果、exit code
- 存储时对
sshpass -p 密码脱敏
- 可选导出审计日志
6. 超时与并发(P2)
- Pending 超过 N 分钟(如 30)自动过期,Agent 提示用户重新发起
- 同一 session 同时仅一个 pending approval
不在本期范围
- 容器级沙箱 / 命令 allowlist 硬拦截(可与 HITL 并行规划)
- 多用户审批链(如「需两人批准」)
- RBAC 按角色限制谁可批准高危命令
验收标准
相关代码
ai-apm-web/.../ai/platform/runtime/AgentScopePermissionSupport.java
ai-apm-web/.../ai/platform/runtime/AgentScopeToolConfirmSupport.java
ai-apm-web/.../ai/platform/runtime/AgentScopeExpertRuntime.java
ai-apm-web/.../tools/local/BashTools.java
ai-apm-web/.../ai/platform/task/ExpertTaskService.java
ai-apm-frontend/src/views/aiPlatform/chat/(ThinkingProcess 等)
安全说明
HITL 降低误执行风险,但批准后命令仍以容器/SSH 权限运行。生产环境建议配合:网络 egress 限制、只读文件系统、专用执行 sidecar 等(可另开 hardening Issue)。
背景 / 问题
运维专家(
expertId=ops)可通过Bash/BashOutput/KillShell在本机容器或远程主机(ssh/sshpass)执行 shell 命令。当前无人工审批,存在误操作与安全风险:AgentScopePermissionSupport使用PermissionMode.BYPASS,注释写明:"Our chat UI does not collect confirmations yet"AgentScopeToolConfirmSupport对 pending 工具调用自动确认ThinkingProcess.vue仅展示工具调用时间线,无 Approve / Deny 按钮ai-apm-web容器内以 JVM 进程权限运行,非沙箱;远程 SSH 可触达主机级操作典型风险命令:
rm -rf、kill -9、docker stop、sshpass ... ssh ... "..."等。期望方案
1. 启用 AgentScope 审批流(P0)
Bash、KillShell(及可选BashOutput)从BYPASS改为ASK模式AgentScopeToolConfirmSupport的自动确认ToolCallState.ASKING时暂停 ReAct 循环,等待用户操作2. 后端 Pending Approval API(P0)
新增接口(路径可调整):
GET /api/v1/ai/sessions/{sessionId}/pending-approvalsPOST /api/v1/ai/sessions/{sessionId}/approvals/{toolCallId}{ approved: true|false, reason?: string }ConfirmResult(true)并恢复 Agent 执行ConfirmResult(false),Agent 重新规划或向用户说明ExpertTaskService)路径同样支持暂停/恢复3. 前端审批 UI(P0)
formatBashToolParamsDisplay)4. 审批策略(P1,可配置)
ls、cat、df -h、ps、docker ps等自动放行rm、kill、shutdown、curl | bash等强制审批BuiltInExpertCatalog中为 ops 增加requireCommandApproval: true配置可通过环境变量或系统设置页管理。
5. 审计与脱敏(P1)
sshpass -p密码脱敏6. 超时与并发(P2)
不在本期范围
验收标准
相关代码
ai-apm-web/.../ai/platform/runtime/AgentScopePermissionSupport.javaai-apm-web/.../ai/platform/runtime/AgentScopeToolConfirmSupport.javaai-apm-web/.../ai/platform/runtime/AgentScopeExpertRuntime.javaai-apm-web/.../tools/local/BashTools.javaai-apm-web/.../ai/platform/task/ExpertTaskService.javaai-apm-frontend/src/views/aiPlatform/chat/(ThinkingProcess 等)安全说明
HITL 降低误执行风险,但批准后命令仍以容器/SSH 权限运行。生产环境建议配合:网络 egress 限制、只读文件系统、专用执行 sidecar 等(可另开 hardening Issue)。