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]` 中配置存储后端。知识文档会以 `-.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)
标签:ChatOps, EVTX分析, Ruby, Slack机器人, 复盘分析, 日志审计, 漏洞探索, 知识库