nlink-jp/ir-hub

GitHub: nlink-jp/ir-hub

一个基于 Slack 的安全事件响应生命周期管理机器人,利用 LLM 自动执行复盘分析并积累知识以供后续事件复用。

Stars: 0 | Forks: 0

# ir-hub 事件响应生命周期中心 —— 一个一体化的 Slack ChatOps 机器人,支持由 LLM 驱动的完整 IR 生命周期:创建案件频道、响应过程中的实时支持、复盘分析,以及知识的积累与复用。 [日本語版 README はこちら](README.ja.md) ## 概念 ``` /ir-hub new ──→ case channel ──→ response ──→ /ir-hub close │ (status / Q&A support) │ │ ▼ └── initial briefing ◀── knowledge store ◀── postmortem from past cases (JSON + Markdown, (auto + re-runnable) local / GCS / S3) ``` - **Slack 上的案件生命周期** —— `/ir-hub new` 为每个事件开通专用频道;`/ir-hub close` 关闭案件并自动执行复盘 - **LLM 复盘(基于 ai-ir2 理论重构)** —— 在 Vertex AI Gemini 上进行五个阶段的分析(摘要、参与者活动、角色推断、战术提取、流程审查),在模型前后均采用 nonce 标签提示注入防御和 IoC 消除处理。分析以英语为基准;频道发布的内容会翻译为配置的语言 - **知识文档** —— 每个提取出的战术都会生成一对 JSON + Markdown 文件,并在复盘完成时在数据库中建立索引(标签 / 分类 / 摘要);重新执行会替换该案件的原有知识 - **知识复用** —— `@ir-hub ` 基于积累的知识进行回答(并引用相关战术 ID);`/ir-hub new` 会发布以往相关战术的简报;知识会以 JSON + Markdown 格式导出至本地 / GCS / S3 存储(通过 `/ir-hub export` 命令或每次复盘后自动执行),以便 IR 团队之外的其他团队使用 - **双模式斜杠命令** —— 传入参数可直接执行,或直接运行无参数的 `/ir-hub` 通过弹窗选择操作 - **内置 ACL** —— 基于用户 ID 和 Slack User Group 的白名单 + 黑名单机制,具备故障保护(未配置白名单 = 拒绝所有访问),拒绝操作会被静默记录到审计日志中;专为拥有数万名成员的工作区而设计 - **持续摄入** —— 打开的案件频道中的消息会实时存储在嵌入式 SQLite 数据库中,并在重新连接后自动补齐历史记录 - **单一 Go 二进制文件** —— Socket Mode 常驻机器人;无需入站端点,无运行时依赖 ## 命令 | 命令 | 效果 | |---|---| | `/ir-hub` | 打开弹窗以选择操作(无需记忆任何参数) | | `/ir-hub new <标题> [--severity low\|medium\|high\|critical] [--private\|--public]` | 创建案件频道,邀请您加入,并发布启动消息 | | `/ir-hub status` | 发布案件元数据,随后附上 LLM 生成的状况摘要(当前状态 / 待办事项 / 后续行动) | | `/ir-hub close` | 关闭案件并自动执行复盘(在案件频道内进行) | | `/ir-hub reopen` | 重新打开已关闭的案件(恢复消息摄入) | | `/ir-hub pm` | 手动执行(或重新执行)复盘 —— 会替换该案件现有的知识文档 | | `/ir-hub export` | 将所有知识文档导出至配置的存储后端 | | `@ir-hub <问题>` | 知识问答 —— 基于积累的知识进行回答,并引用战术 ID | 复盘会发布一份简明的摘要(严重程度、流程评分、优势/改进摘要、战术数量),并将完整的 Markdown 报告作为代码片段附加在内。 ## 前置条件 - Go 1.26+(用于构建) - 一个启用了 Socket Mode 的 Slack 应用(设置说明见下文) - 一个启用了 Vertex AI API 并配置了应用默认凭证(Application Default Credentials,通过 `gcloud auth application-default login` 获取)的 GCP 项目 —— 复盘和状态分析在 Gemini 上运行 - 对于知识导出:一个本地目录(默认),或一个 GCS 存储桶(使用 ADC) / S3 存储桶(使用默认 AWS 凭证链)。如果云客户端无法初始化,导出功能将被禁用,但机器人会继续运行。 ## Slack 应用设置 从此清单创建应用(App settings → App Manifest): ``` display_information: name: ir-hub description: >- Incident-response lifecycle hub: opens a channel per case, tracks the response, runs postmortems, and reuses the lessons learned. long_description: |- ir-hub supports security incident-response teams across the full lifecycle of a case. - /ir-hub new opens a dedicated case channel, invites the opener, and posts a kickoff briefing - /ir-hub status summarizes the current state of the case - /ir-hub close ends the response and runs an automated postmortem - Lessons learned are accumulated as knowledge and reused on future incidents Access is restricted to the IR team by an in-app allowlist, and denied attempts are audit-logged. Messages are ingested only from case channels the app itself creates. Operated by: / Questions: # features: bot_user: display_name: ir-hub always_online: true slash_commands: - command: /ir-hub description: Incident response lifecycle hub usage_hint: "new | close | status" should_escape: false oauth_config: scopes: bot: - commands - chat:write - app_mentions:read - users:read - usergroups:read - channels:manage - channels:read - channels:history - channels:join - groups:write - groups:read - groups:history - files:write - reactions:write settings: event_subscriptions: bot_events: - app_mention - message.channels - message.groups interactivity: is_enabled: true socket_mode_enabled: true ``` 然后生成: 1. **App-level token** (Basic Information → App-Level Tokens),包含 `connections:write` scope → `IRHUB_SLACK_APP_TOKEN` 2. **Bot token** (Install App) → `IRHUB_SLACK_BOT_TOKEN` ## 安装 ``` git clone https://github.com/nlink-jp/ir-hub.git cd ir-hub make build # → dist/ir-hub ``` ## 配置 将 [`config.example.toml`](config.example.toml) 复制到 `~/.config/ir-hub/config.toml` 并进行编辑(或通过 `--config` 传入路径)。任何 字段都可以通过 `IRHUB_*` 环境变量进行覆盖 (例如 `IRHUB_ACL_ALLOW_GROUPS=ir-team,secops`)。文件中包含未知的键会报错,从而能够快速检测出拼写错误。 设置 `language = "ja"`(或 `IRHUB_LANGUAGE=ja`)可将所有面向用户的消息 —— 包括弹窗、启动/状态/关闭发布、错误提示 —— 切换为日语。日志仍保持为英文。 Slack token 应放在配置文件的 `[slack]` 部分或环境变量中(环境变量优先级更高): | 变量 | 说明 | |---|---| | `IRHUB_SLACK_APP_TOKEN` | App-level token (`xapp-…`, `connections:write`) | | `IRHUB_SLACK_BOT_TOKEN` | Bot token (`xoxb-…`) | 如果将 token 存放在文件中,请保持文件的私密性(`chmod 600`);如果在启动时发现文件对用户组或其他用户可读,ir-hub 会发出警告。 **ACL 默认为拒绝**:如果没有配置 `allow_users` / `allow_groups`,所有命令和提及都将被拒绝(并记录到审计日志中)。请在启动前填充白名单: ``` [acl] allow_groups = ["ir-team"] # User Group handles or IDs ("S…") deny_users = [] # deny wins over allow notify_denied = false # true: tell denied users ephemerally ``` 未知的用户组名称会导致启动失败 —— 这是另一种防止拼写错误的保护机制。 ## 运行 ``` export IRHUB_SLACK_APP_TOKEN=xapp-... # pragma: allowlist secret export IRHUB_SLACK_BOT_TOKEN=xoxb-... # pragma: allowlist secret ir-hub serve ``` 机器人会自动重新连接;每次重连后,它都会通过 `conversations.history` 补齐错过的消息。 ## 知识导出 在 `[storage]` 中配置存储后端。知识文档会以 `<tactic-id>-<slug>.json` 和 `.md` 对的形式写入(在本地存储于 `local_path`,或在 S3 存储于 `s3_prefix`),无论是在手动操作时(`/ir-hub export`)还是每次复盘后自动执行时均如此。 ``` [storage] backend = "local" # local | gcs | s3 local_path = "./knowledge" # gcs_bucket = "my-ir-knowledge" # backend = "gcs" (使用 ADC) # s3_bucket = "my-ir-knowledge" # backend = "s3" (默认 AWS 链) # s3_prefix = "ir-hub/" ``` GCS 使用应用默认凭证;S3 使用默认的 AWS 凭证链。由于路径是确定性的,重复导出会直接覆盖原文件。 ## 已知限制 - **不会摄入消息的编辑/删除操作**(`message_changed` / `message_deleted` 会被跳过)。由于会存储原始事件的 JSON,后续阶段可以扩展处理逻辑。 - **案件序列号可能会出现断层**:设计上,创建频道失败也会消耗一个序列号(保留以供审计)。 - **私密案件频道**日后无法转换为公开频道,且为保持消息的持续摄入,ir-hub 必须始终保留为该频道的成员。 - **过长的案件在分析时会被截断**:当案件内容超过 `analysis.max_input_tokens` 时,将仅分析预算允许范围内的最新消息,并在报告中注明截断情况。 - **知识检索使用标签/关键字 (LIKE) 缩小范围**,而非向量搜索 —— 适用于数百份文档;如果是更大规模的语料库,则需考虑使用 FTS 或 embedding。 - **重新导出的对象可能会成为孤立文件**:重新执行复盘会分配新的战术 ID,因此之前执行所导出的对象可能会一直保留在存储中,直到被手动清理。 ## 构建 ``` make build # current platform → dist/ir-hub make build-all # 5-platform cross-compile (CGO-free) make test # or: go test ./... make package # release zips; darwin builds signed + notarized ``` ## 文档 - [部署指南](docs/en/deployment.md) / [日本語](docs/ja/deployment.ja.md) - [Slack 应用设置手册](docs/en/slack-app-setup.md) / [日本語](docs/ja/slack-app-setup.ja.md) - [RFP(已批准的设计)](docs/en/ir-hub-rfp.md) / [日本語](docs/ja/ir-hub-rfp.ja.md) ## 许可证 [MIT](LICENSE)</div><div><strong>标签:</strong>ChatOps, EVTX分析, Ruby, Slack机器人, 复盘分析, 日志审计, 漏洞探索, 知识库</div></article></div> <!-- 人机验证 --> <script> (function () { var base = (document.querySelector('base') && document.querySelector('base').getAttribute('href')) || ''; var path = base.replace(/\/?$/, '') + '/cap-wasm/cap_wasm.min.js'; window.CAP_CUSTOM_WASM_URL = new URL(path, window.location.href).href; })(); </script> </body> </html>