ChatGPT工作文档AI 评分 · 73/100AI 辅助编辑·未发现明显提示词注入风险n8n.io

用 n8n 编排安全漏洞修复:Port + OpenAI + Jira + Slack

安全扫描告警 → Port 服务目录补全上下文 → OpenAI 生成修复方案 → 按严重级别路由 → Jira 工单 + Claude Code 自动修复 → Slack 通知

经验丰富步骤流程提示词
给谁
有 n8n 自托管实例、使用 Port 作为软件目录的安全/平台工程师
你会得到
收到漏洞告警后自动创建分级 Jira 工单,关键漏洞触发 Claude Code 提 PR,Slack 通知责任团队
你需要
n8n · slack · jira · port

硬约束

前置条件:Port 账户并完成初始化;服务与仓库已在 Port 编目并含负责人信息;安全扫描器(Snyk/Wiz/SonarQube)支持 webhook;n8n 自托管实例且已安装 Port 自定义节点;Jira Cloud 账户及项目权限;Slack 工作区及 bot 发消息权限;OpenAI API key。 限制:模板仅适用于自托管 n8n;Jira 项目 ID 和 Port 组织/仓库为占位符需替换;Claude Code 修复依赖 Port 平台侧 action 配置。

他们做了什么

Port IO 在 n8n 官方模板市场发布了该工作流模板,用于将安全扫描器(Snyk、Wiz、SonarQube 等)的漏洞告警通过 webhook 接入 n8n,经 Port 软件目录补全服务上下文后,由 OpenAI 生成修复方案,再按严重级别分流:关键漏洞创建最高优先级 Jira 工单并尝试触发 Claude Code 自动提 PR,高危漏洞创建高优先级工单并发 Slack 通知,中低危仅创建跟踪工单。

效果如何

作者声明该模板提供端到端生命周期管理,包括自动 Jira 工单创建、AI 修复规划和 Claude Code 关键漏洞修复(author_report)。模板在 n8n.io 显示为已发布状态,view 数 181。

值得知道

模板明确标注仅适用于自托管 n8n 实例;Claude Code 修复依赖 Port 平台侧的 run_claude_code action 和 Bearer 认证;workflow.json 中的 Jira project/issueType/priority 值为模板占位符(如 10000/10002/10001),必须替换为实际项目 ID;gpt-4o-mini 在 OpenAI 节点中显式配置,gpt-4o 未在可见节点参数中出现但来源声称支持;来源未提供 ROI 或实际运行指标;本站未实测(reproduction=not_tested)。

n8n 工作流模板

结构已检查 · 未实际运行

下载后在 n8n 选择“Import from File”,或复制 JSON 后粘贴到编辑器。先配置自己的账号,再用测试数据运行;模板默认未启用。

配置与测试清单

需要绑定的凭证

  • 导入后按各需鉴权节点绑定你自己的凭证;本附件不含原作者密钥。

需要替换的配置

  • 源模板来自 n8n 公开库 #11726(约 16 个节点)。导入后先保持未启用,核对触发器、表达式与外部 API 端点。
  • Sticky Note 中的说明仅供参考;按自己的账号、表结构或频道 ID 替换占位配置。

测试输入与预期结果

  • 在测试环境手动执行一次主路径,确认每个需凭证的节点已连接且无鉴权错误。
  • 用一条合成/脱敏样例数据跑通,核对输出字段与下游写入目标,再考虑生产启用。

模板处理说明

  • 已移除原作者凭证绑定、webhookId 与执行数据,工作流设为未启用;节点、连线与原文提示词保持原样。未在 n8n 中实际运行。
  • 未改业务逻辑;运行前请自行核对密钥、配额与隐私合规。

模板获取日期: 2026-10-24

步骤

  1. 配置触发器与 Port 上下文 enrichment

    在 n8n 中导入模板后,配置 Webhook Trigger 节点接收安全扫描器的 POST 请求(路径 security/vulnerability)。然后配置 Get Context From Port 节点:选择 operation 为 invokeAgent,agentIdentifier 填 context_retriever_agent,将下方提示词粘贴到 prompt 字段。该节点会向 Port 软件目录查询受影响服务、负责人、环境、SLA、Slack 频道和 Jira 项目 key。

    运行提示词 · 来源原文。Get Context From Port 节点的 prompt 字段

    =You are an assistant that provides contextual enrichment for vulnerabilities using the Port catalog as a knowledge base. A new security vulnerability has been detected.
    Vulnerability Details:
    - Identifier: {{ $('Webhook Trigger').item.json.body.vulnerability_id }}
    - Description: {{ $('Webhook Trigger').item.json.body.description }}
    - Severity: {{ $('Webhook Trigger').item.json.body.severity }}
    - CVE: {{ $('Webhook Trigger').item.json.body.cve || 'N/A' }}
    - Package: {{ $('Webhook Trigger').item.json.body.package || 'N/A' }}
    
    Using the Port catalog, return relevant contextual information. Specifically, retrieve:
    1. The affected service or repository
    2. Service owners and responsible team
    3. Environment (production/staging/dev)
    4. Service tier and SLA requirements
    5. Team's Slack channel
    6. Related dependencies
    7. Jira project key for security tickets
    
    Your response must be a single valid JSON object only, without any code block formatting, markdown, explanations, or extra text.
    Do not include ```json or ``` or any surrounding characters — just raw JSON.
    
    Required output schema:
    {
      "service_name": "",
      "repository": "",
      "service_tier": "production|staging|development",
      "sla_hours": 0,
      "owners": [],
      "slack_channel": "",
      "environment": "",
      "dependencies": [],
      "jira_project_key": ""
    }
  2. 配置 OpenAI 修复方案生成

    配置 OpenAI Remediation Plan 节点:resource 选 chat,model 选 gpt-4o-mini(或 gpt-4o),将下方提示词粘贴到 messages[0].content。该节点结合漏洞详情和 Port 上下文,输出包含摘要、影响评估、修复步骤、是否可自动修复、Claude Code 修复提示词和努力程度的 JSON。

    运行提示词 · 来源原文。OpenAI Remediation Plan 节点的 messages[0].content 字段

    =You are a security engineer. Analyze this vulnerability and create a remediation plan.
    
    Vulnerability:
    - ID: {{ $('Webhook Trigger').item.json.body.vulnerability_id }}
    - Description: {{ $('Webhook Trigger').item.json.body.description }}
    - Severity: {{ $('Webhook Trigger').item.json.body.severity }}
    - CVE: {{ $('Webhook Trigger').item.json.body.cve || 'N/A' }}
    - Package: {{ $('Webhook Trigger').item.json.body.package || 'N/A' }}
    
    Service Context from Port:
    {{ $('Get Context From Port').item.json.executionMessage }}
    
    Your response must be a single valid JSON object only, without any code block formatting, markdown, explanations, or extra text.
    Do not include ```json or ``` or any surrounding characters — just raw JSON.
    
    Required output schema:
    {
      "summary": "Brief description of the vulnerability",
      "impact": "Business impact assessment",
      "remediation_steps": ["Step 1", "Step 2"],
      "is_auto_fixable": true or false,
      "fix_prompt": "Detailed prompt for a coding agent to fix this vulnerability",
      "estimated_effort": "low|medium|high"
    }
  3. 配置严重级别路由与 Jira 工单

    配置 Check Severity Level 节点(Switch 类型):value1 取 webhook body.severity.toLowerCase(),三条分支分别匹配 critical、high、和默认(regex .*)。然后分别配置三个 Jira 节点:Critical 优先级选 'Now (Urgent)',High 选 'High',Medium/Low 选 'Low';每个节点的 project、issueType、summary、description 均需选择你的实际 Jira 项目。description 中已嵌入 Port 上下文和 AI 修复方案的表达式。

  4. 配置关键漏洞自动修复与 Slack 告警

    在 Critical 分支后配置 Is Auto-Fixable? 节点(If 类型):条件检查 OpenAI 输出的 is_auto_fixable 为 true,或 fix_prompt 长度大于 10。若 true,走 Trigger Fix via Port AI Agent 节点:method 为 POST,URL 为 https://api.getport.io/v1/actions/run_claude_code/runs,authentication 选 genericCredentialType + httpBearerAuth,jsonBody 使用模板中的表达式(含 service、prompt 属性)。随后接 Alert Critical to Slack 节点发送修复已触发通知。若 false,走 Alert Critical (Manual Fix) 节点发送需人工修复通知。两个 Slack 节点的 channel 均从 Port 上下文读取,fallback 为 #security-alerts。

    运行提示词 · 来源原文。Alert Critical to Slack 节点的 text 字段

    =🚨 *CRITICAL SECURITY VULNERABILITY DETECTED*
    
    *Vulnerability:* {{ $('Webhook Trigger').item.json.body.vulnerability_id }}
    *CVE:* {{ $('Webhook Trigger').item.json.body.cve || 'N/A' }}
    *Severity:* CRITICAL 🔴
    
    *Affected Service:* {{ (() => { try { const ctx = $('Get Context From Port').item.json.executionMessage; const parsed = typeof ctx === 'string' ? JSON.parse(ctx) : ctx; return parsed?.service_name || 'Unknown'; } catch(e) { return 'Unknown'; } })() }}
    *Environment:* {{ (() => { try { const ctx = $('Get Context From Port').item.json.executionMessage; const parsed = typeof ctx === 'string' ? JSON.parse(ctx) : ctx; return parsed?.environment || 'Unknown'; } catch(e) { return 'Unknown'; } })() }}
    *Owners:* {{ (() => { try { const ctx = $('Get Context From Port').item.json.executionMessage; const parsed = typeof ctx === 'string' ? JSON.parse(ctx) : ctx; return parsed?.owners?.join(', ') || 'Not specified'; } catch(e) { return 'Not specified'; } })() }}
    
    *Summary:*
    {{ (() => { try { let content = $('OpenAI Remediation Plan').item.json.message?.content || '{}'; if (content.includes('```json')) { content = content.replace(/```json\n?/g, '').replace(/```\n?/g, ''); } const ai = JSON.parse(content); return ai.summary || 'See Jira ticket'; } catch(e) { return 'See Jira ticket'; } })() }}
    
    *Impact:*
    {{ (() => { try { let content = $('OpenAI Remediation Plan').item.json.message?.content || '{}'; if (content.includes('```json')) { content = content.replace(/```json\n?/g, '').replace(/```\n?/g, ''); } const ai = JSON.parse(content); return ai.impact || 'See Jira ticket'; } catch(e) { return 'See Jira ticket'; } })() }}
    
    *Jira Ticket:* {{ $('Create Critical Jira Ticket').item.json?.key || 'Creating...' }}
    
    🤖 *Auto-Fix Status:* Triggered
    
    _SLA: Resolve within {{ (() => { try { const ctx = $('Get Context From Port').item.json.executionMessage; const parsed = typeof ctx === 'string' ? JSON.parse(ctx) : ctx; return parsed?.sla_hours || 24; } catch(e) { return 24; } })() }} hours_

    运行提示词 · 来源原文。Alert Critical (Manual Fix) 节点的 text 字段

    =🚨 *CRITICAL SECURITY VULNERABILITY - MANUAL FIX REQUIRED*
    
    *Vulnerability:* {{ $('Webhook Trigger').item.json.body.vulnerability_id }}
    *CVE:* {{ $('Webhook Trigger').item.json.body.cve || 'N/A' }}
    *Severity:* CRITICAL 🔴
    
    *Affected Service:* {{ (() => { try { const ctx = $('Get Context From Port').item.json.executionMessage; const parsed = typeof ctx === 'string' ? JSON.parse(ctx) : ctx; return parsed?.service_name || 'Unknown'; } catch(e) { return 'Unknown'; } })() }}
    *Owners:* {{ (() => { try { const ctx = $('Get Context From Port').item.json.executionMessage; const parsed = typeof ctx === 'string' ? JSON.parse(ctx) : ctx; return parsed?.owners?.join(', ') || 'Not specified'; } catch(e) { return 'Not specified'; } })() }}
    
    *Summary:*
    {{ (() => { try { let content = $('OpenAI Remediation Plan').item.json.message?.content || '{}'; if (content.includes('```json')) { content = content.replace(/```json\n?/g, '').replace(/```\n?/g, ''); } const ai = JSON.parse(content); return ai.summary || 'See Jira ticket'; } catch(e) { return 'See Jira ticket'; } })() }}
    
    *Remediation Steps:*
    {{ (() => { try { let content = $('OpenAI Remediation Plan').item.json.message?.content || '{}'; if (content.includes('```json')) { content = content.replace(/```json\n?/g, '').replace(/```\n?/g, ''); } const ai = JSON.parse(content); return ai.remediation_steps?.map((s, i) => (i+1) + '. ' + s).join('\n') || 'See Jira ticket'; } catch(e) { return 'See Jira ticket'; } })() }}
    
    *Jira Ticket:* {{ $('Create Critical Jira Ticket').item.json?.key || 'Creating...' }}
    
    ⚠️ *This vulnerability requires manual remediation*
    
    _SLA: Resolve within {{ (() => { try { const ctx = $('Get Context From Port').item.json.executionMessage; const parsed = typeof ctx === 'string' ? JSON.parse(ctx) : ctx; return parsed?.sla_hours || 24; } catch(e) { return 24; } })() }} hours_
  5. 配置高危漏洞 Slack 通知

    在 High 分支的 Create High Jira Ticket 节点后,配置 Alert High to Slack 节点:channel 从 Port 上下文读取,fallback 为 #security-alerts。text 字段使用下方模板,包含漏洞摘要和 Jira 工单链接。

    运行提示词 · 来源原文。Alert High to Slack 节点的 text 字段

    =⚠️ *HIGH SEVERITY VULNERABILITY DETECTED*
    
    *Vulnerability:* {{ $('Webhook Trigger').item.json.body.vulnerability_id }}
    *CVE:* {{ $('Webhook Trigger').item.json.body.cve || 'N/A' }}
    *Severity:* HIGH 🟠
    
    *Affected Service:* {{ (() => { try { const ctx = $('Get Context From Port').item.json.executionMessage; const parsed = typeof ctx === 'string' ? JSON.parse(ctx) : ctx; return parsed?.service_name || 'Unknown'; } catch(e) { return 'Unknown'; } })() }}
    *Owners:* {{ (() => { try { const ctx = $('Get Context From Port').item.json.executionMessage; const parsed = typeof ctx === 'string' ? JSON.parse(ctx) : ctx; return parsed?.owners?.join(', ') || 'Not specified'; } catch(e) { return 'Not specified'; } })() }}
    
    *Summary:*
    {{ (() => { try { let content = $('OpenAI Remediation Plan').item.json.message?.content || '{}'; if (content.includes('```json')) { content = content.replace(/```json\n?/g, '').replace(/```\n?/g, ''); } const ai = JSON.parse(content); return ai.summary || 'See Jira ticket'; } catch(e) { return 'See Jira ticket'; } })() }}
    
    *Jira Ticket:* {{ $('Create High Jira Ticket').item.json?.key || 'Creating...' }}

可复制提示词

搭建指导 · 本站建议版本。交给搭建助手,先确认输入和权限

这一段是提示词,页面不会在这里插入广告。

你正在搭建 n8n 安全漏洞自动修复工作流。先确认已具备:Port 账户及编目数据、n8n 自托管实例、Jira/Slack/OpenAI 凭证。导入模板后按步骤替换 Jira 项目、仓库组织名、Webhook URL,再用样例 payload 测试。

搭建前需在 Port 中创建 context_retriever_agent;Claude Code action 需 Port 平台侧预配置

来源

Orchestrate security vulnerability remediation with Port, OpenAI, Jira and Slack · portio · n8n.io · 2025-12-12

留言与反馈

试过这个方法吗?分享效果、遇到的问题或改进建议。留言审核后公开,请勿填写敏感信息。

正在加载…

    相关用例