作业18:Agent 出站白名单 · 审核业务策略 · 密钥轮换 Runbook(跟学 + Cursor)
作业目标:列出本环境 Agent 能调用的全部工具出站域名,做成白名单草案;写清审核未通过时的业务策略与签字链;Cursor 生成「密钥轮换 Runbook」骨架(填真实系统名)。
验收标准:
1. 白名单覆盖 OpenAPI 工具 + 工作流 HTTP + 后端二次出站(SSH/钉钉)
2. 能说明 L1/L2/L3 风险分级与审核挂掉时的业务降级
3. 审核签字表可执行(知道找谁签)
4. 密钥轮换 Runbook 骨架已生成,含 ≥8 类系统占位符
环境:207 Dify + 作业1/5/7 Agent 工具 API(8777/8779/8780)+ 作业2 工作流 8778。
HTML:
docs/html_cursor/作业18_Agent出站白名单与密钥轮换_cursor.html
脚本:
scripts_cursor/作业18_Agent出站白名单与密钥轮换/白名单草案:
作业18_Agent工具出站域名白名单草案_cursor.md审核策略:
作业18_出站审核与业务策略_cursor.md密钥 Runbook:
作业18_密钥轮换Runbook_cursor.md结果:
data/homework18/
目录
做完长什么样
| 项 | 值 |
|---|---|
| Agent OpenAPI 出站 | 192.168.110.207:8777/8779/8780 |
| 工作流出站 | 192.168.110.207:8778 |
| 后端二次出站 | 116.62.10.183:22/8000、oapi.dingtalk.com:443 |
| 白名单产物 | data/homework18/agent_egress_whitelist_draft.md |
| 密钥 Runbook | 作业18_密钥轮换Runbook_cursor.md({{PLACEHOLDER}} 待填) |
学习路线
A 理解两层出站:Dify→工具 API vs 工具 API→SSH/外网
B 跑 hw18_01 生成白名单,对照 OpenAPI yaml
C 读审核策略:谁签、挂了就降级什么
D 跑 hw18_02 生成密钥轮换骨架,填你们系统名Part A · 出站全景(两层)
A1. 第一层:Dify Agent → HTTP 工具(经 ssrf_proxy)
flowchart LR USER[用户] --> DIFY[Dify api/worker] DIFY --> SSRF[ssrf_proxy :3128] SSRF --> T8777[207:8777 作业1] SSRF --> T8779[207:8779 作业5] SSRF --> T8780[207:8780 作业7] SSRF --> T8778[207:8778 作业2 工作流]
| Agent / 应用 | 工具 | OpenAPI server | operationId |
|---|---|---|---|
| 运维巡检 Agent(作业1) | server_status | http://192.168.110.207:8777 | getServerStatus |
| vLLM 健康检查(作业5) | vllm_health | http://192.168.110.207:8779 | get_vllm_status, get_gpu_info, get_request_queue |
| vLLM 故障自愈(作业7) | vllm_self_heal | http://192.168.110.207:8780 | detect_vllm_anomaly, restart_vllm_container, send_recovery_notification |
| 客服意图路由(作业2) | —(工作流 HTTP 节点) | http://192.168.110.207:8778 | POST /ticket |
| 播城行政问答 | 无自定义 HTTP 工具 | — | 仅模型+知识库 |
A2. 第二层:207 FastAPI 后端 → 真实系统(白名单易漏)
| 后端 | 二次出站 | 用途 |
|---|---|---|
| 8779 / 8780 | 116.62.10.183:22 SSH | docker inspect / restart / logs |
| 8779 | 116.62.10.183:8000 HTTP | vLLM /metrics |
| 8780 / 作业6 | oapi.dingtalk.com:443 | 钉钉 Markdown 通知 |
结论:Agent 白名单不能只写 877x,必须包含 SSH 与外网 IM。
A3. 风险分级
| 级别 | 定义 | 本环境示例 |
|---|---|---|
| L1 高 | 可改生产状态 / 特权通道 | SSH restart vLLM |
| L2 中 | 内网读操作 / 模拟写 | 8777 查状态、8778 建模拟工单 |
| L3 外网 | 出公网 | 钉钉 oapi |
Part B · 白名单草案
B1. 生成
python scripts_cursor/作业18_Agent出站白名单与密钥轮换/hw18_01_出站域名白名单.pyB2. 建议纳入 SSRF / 防火墙的核心条目
192.168.110.207:8777-8780 # Agent 工具 + 工单 API(可拆端口)
116.62.10.183:22 # 仅允许源 207(8779/8780 后端)
116.62.10.183:8000 # vLLM metrics
oapi.dingtalk.com:443 # 已审批 IM
DENY ALL ELSEB3. 禁止默认放行
marketplace.dify.ai— 插件市场,非 Agent 工具;按需单独开- 任意公网 URL — 禁止作为 OpenAPI server
- 169.254.0.0/16 — 云元数据
完整表见 作业18_Agent工具出站域名白名单草案_cursor.md。
Part C · 审核挂了怎么办(签字)
完整策略与签字表:
作业18_出站审核与业务策略_cursor.md
C1. 三类审核
| 类型 | 触发 | 业务影响若 不通过 |
|---|---|---|
| 新增出站域名 | 新 OpenAPI / 新工作流 URL | 不得上线该工具;Agent 继续用旧工具集 |
| L1 高权工具 | SSH、restart、写生产 | 默认拒绝;仅只读巡检可用 |
| L3 外网域名 | 钉钉以外新 SaaS | 不得调用;通知类走已审批钉钉 |
C2. 签字链(草案)
| 变更 | 发起人 | 审核 | 批准 |
|---|---|---|---|
| L2 内网新端口(877x 只读) | 平台运维 | 业务产品负责人 | 平台负责人 |
| L1 SSH/重启类 | 平台运维 | 业务负责人 + 信息安全 | IT/CTO 授权(或值班授权单 24h) |
| L3 新外网域名 | 平台运维 | 信息安全 + 法务(涉数据出境时) | 平台负责人 |
| 密钥轮换 R2 | 平台运维 | — | 平台负责人 |
| 密钥泄露 R1 | 值班 | 信息安全 | IT 负责人 + 通报业务 |
C3. 审核挂掉时的业务策略(执行口径)
- 不静默失败:工具调用返回明确错误「未通过安全审核」,写 Langfuse
error_type=egress_denied - Agent 降级:关闭未审批工具;Prompt 声明「当前仅支持问答/只读巡检」
- 工作流:HTTP 节点不得指向新 URL;已发布版本 回滚 到上一快照
- 临时紧急(P0 生产故障):L1 操作可走「24 小时临时授权单」— 值班经理 + 平台负责人 双签,事后 3 个工作日内补正式审核
- 记录:所有拒绝/临时放行写入
{{AUDIT_LOG}}(工单号、签字人、域名、过期时间)
Part D · Cursor:密钥轮换 Runbook
D1. 提示词
根据本仓库 LiteLLM、Langfuse、Dify、钉钉、GPU SSH、Xinference、Higress、PG/Redis,
生成密钥轮换 Runbook 骨架 Markdown,系统名用 {{PLACEHOLDER}},
含轮换分级、分系统步骤、验收、回滚、检查清单。
脚本名 hw18_02_密钥轮换Runbook骨架.pyD2. 运行
python scripts_cursor/作业18_Agent出站白名单与密钥轮换/hw18_02_密钥轮换Runbook骨架.py \
--org "播城科技" --platform-owner "平台组" --oncall "运维值班群" --write-doc将 {{LITELLM_MASTER_KEY}}、{{AUDIT_LOG}} 等替换为你们真实名称与路径。
完整程序
| 文件 | 作用 |
|---|---|
hw18_01_出站域名白名单.py | 扫描 OpenAPI + 补充 SSH/钉钉 |
hw18_02_密钥轮换Runbook骨架.py | 生成轮换 Runbook |
验收清单
- [ ] 白名单含 8777/8778/8779/8780 + 116 SSH + 钉钉
- [ ] 能区分「Agent 第一层」与「FastAPI 第二层」出站
- [ ] 说出 L1/L2/L3 各一例及审核挂掉时的降级
- [ ] 签字表知道找谁(业务 / 信息安全 / 平台 / CTO)
- [ ] 密钥 Runbook 骨架 ≥8 系统,已填或标注待填占位符
- [ ] 未把真实密钥/webhook 提交 Git
相关文档
- 作业1/5/7 工具 Agent
- 作业11 白皮书 §4 安全
- 作业17 配置发布 Runbook
- 专题七 Shell 出站