crisroura/sift-assistant
GitHub: crisroura/sift-assistant
基于 Claude Code 的 DFIR 编排层,在 SANS SIFT 工作站上将 30 余种取证工具组织为分阶段自动化调查流程,并内置证据完整性保护与审计机制。
Stars: 0 | Forks: 0
# SIFT 助手
一个用于 SANS SIFT Ubuntu 工作站的 Claude Code 编排层,专注于数字取证与事件响应 (DFIR)。提供全局行为规则、32 项技能(30 个细粒度的 `dfir-*` 工具,加上 `case-investigate` 和 `case-init`)、集中式工具路径文件、多资产案件模板以及分阶段的调查 pipeline(解析 → 分析 → 关联 → 报告)。
## 前置条件
| 要求 | 说明 |
|-------------|-------|
| SANS SIFT Workstation | Ubuntu x86-64,已安装标准 SIFT 工具集 |
| Claude Code CLI | `npm install -g @anthropic-ai/claude-code` |
| Anthropic API key | 在首次运行 `claude` 后设置 — **切勿复制** `~/.claude/.credentials.json` |
| Python 3 + WeasyPrint + markdown | `pip3 install weasyprint markdown` — 生成 PDF 报告所需 |
| dotnet runtime v6 | SIFT 已预装;EZ Tools 位于 `/opt/zimmermantools/` |
## 安装说明
### 方法 1 — curl 一行命令安装(推荐)
```
curl -fsSL https://raw.githubusercontent.com/crisroura/sift-assistant/main/install.sh | bash
```
该脚本将:
- 将 repo 克隆到临时目录(退出时自动清理)
- 在覆盖前备份现有的 `~/.claude/{CLAUDE.md,settings.json,settings.local.json,tools.env,evidence_guard.py,action_logger.py,SIFT_SERVER_DFIR_TOOLS.json}`
- 将全局配置(包括 `tools.env`、`evidence_guard.py` PreToolUse hook、`action_logger.py` PostToolUse hook 以及 `SIFT_SERVER_DFIR_TOOLS.json` 后备工具路由器)、所有 32 项技能、案件模板和 PDF 脚本安装到 `~/.claude/`
- 提供可选的 WeasyPrint 安装(当通过管道传递 stdin 时跳过提示)
若需同时以交互方式安装 WeasyPrint:
```
curl -fsSL https://raw.githubusercontent.com/crisroura/sift-assistant/main/install.sh -o /tmp/install.sh
bash /tmp/install.sh
```
### 方法 2 — 克隆 repo
```
git clone --depth=1 https://github.com/crisroura/sift-assistant.git
cd sift-assistant
bash install.sh
```
### 方法 3 — 下载 ZIP
1. 在 GitHub 上点击 **Code → Download ZIP**
2. 解压并运行:
unzip sift-assistant-main.zip && cd sift-assistant-main
bash install.sh
## Repository 结构
```
sift-assistant/
├── README.md
├── install.sh
├── global/
│ ├── CLAUDE.md ← role, constraints, methodology, Skills reference
│ ├── settings.json ← permissions + PreToolUse evidence guard + audit Stop hook
│ ├── settings.local.json ← machine-local sudo/apt overrides
│ ├── tools.env ← single source of truth for tool paths ($VOLATILITY3, $EZ*)
│ ├── evidence_guard.py ← PreToolUse hook: blocks writes/deletes to evidence
│ ├── action_logger.py ← PostToolUse hook: appends every action to audit/forensic_actions.jsonl
│ └── SIFT_SERVER_DFIR_TOOLS.json ← fallback tool router: artifact→installed-tool catalog (parse phase)
├── skills/
│ ├── case-investigate/SKILL.md ← thin pipeline orchestrator (chains the phase skills)
│ ├── dfir-triage/SKILL.md ← Phase 0 (advisory): evidence triage & prioritization
│ ├── case-parse/SKILL.md ← Phase 1: mount + run all parsers → export/
│ ├── case-analyze/SKILL.md ← Phase 2: per-asset evidence-tagged analysis reports
│ ├── case-correlate/SKILL.md ← Phase 3: cross-asset correlation report
│ ├── case-report/SKILL.md ← Phase 4: final report + evidence verify + PDF
│ ├── case-evidence-verify/SKILL.md ← Phase 4.5: citation verification
│ ├── case-init/SKILL.md ← multi-asset case directory scaffold
│ ├── tools-preflight/SKILL.md ← Phase-0 tool availability check (run before a case)
│ ├── tools-mount/ ← mount orchestrator + gen_mount_commands.sh (EWF + raw; validate→identify→emit sudo mount→verify)
│ ├── tools-mount-e01/SKILL.md ← ewfmount EWF/E01 images (low-level reference)
│ ├── tools-mount-ntfs/SKILL.md ← loop-mount NTFS partitions (low-level reference)
│ ├── tools-mount-vss/SKILL.md ← VSS access on Linux (vss_carver/vshadowmount)
│ ├── dfir-sleuthkit-file-recovery/ ← fls, icat, tsk_recover, mactime
│ ├── dfir-file-carving/ ← bulk_extractor, photorec, foremost
│ ├── dfir-mft/ ← MFTECmd ($MFT + UsnJrnl)
│ ├── dfir-evtx/ ← EvtxECmd + key Event ID reference
│ ├── dfir-registry/ ← RECmd (Kroll batch) + RegRipper
│ ├── dfir-prefetch/ ← pref.pl + prefetch.py (PECmd absent on SIFT)
│ ├── dfir-amcache/ ← AmcacheParser
│ ├── dfir-recentfilecache/ ← RecentFileCacheParser (Win7 RecentFileCache.bcf)
│ ├── dfir-shimcache/ ← AppCompatCacheParser
│ ├── dfir-srum/ ← SrumECmd
│ ├── dfir-scheduled-tasks/ ← xmllint (Task XML) + jobparser (legacy .job)
│ ├── dfir-lnk-jumplists/ ← LECmd + JLECmd
│ ├── dfir-shellbags/ ← SBECmd
│ ├── dfir-recyclebin/ ← RBCmd ($Recycle.Bin $I/$R)
│ ├── dfir-browser/ ← SQLECmd (Chrome/Edge/Firefox) + WxTCmd
│ ├── dfir-strings/ ← bstrings + strings
│ ├── dfir-plaso-timeline/ ← log2timeline.py, psort.py, image_export.py
│ ├── dfir-memory-volatility/ ← Volatility 3 (all plugins)
│ └── dfir-yara/ ← YARA rules and IOC sweeps (python3-yara)
├── case-templates/
│ ├── CLAUDE.md ← reference-only per-case template
│ └── context/
│ └── case_context.md ← case intel template (evidence, IOCs, timeline)
└── analysis-scripts/
├── generate_pdf_report.py ← Markdown → HTML → WeasyPrint PDF generator (CLI)
└── samples/
└── baseline-memory-sample.html ← reference-only sample (never emitted as a deliverable)
```
## 工作原理
### 全局配置 (`~/.claude/CLAUDE.md`)
将 Claude 的角色设置为 DFIR Orchestrator,并附带严格的证据完整性规则:
- **无幻觉** — 所有结论仅基于原始工具输出
- **有证据支持的声明** — 每一条事实陈述都包含指向真实 `export/` 文件的内联 `[EV-NNNNN]` 引用(在阶段 4.5 中验证)
- **证据只读** — 切勿修改 `/cases/`、`/mnt/`、`/media/`;仅限取证工具写入 `./export/`
- **输出路由** — 分析和报告分别进入 `./analysis/`、`./reports/`、`./context/`
- **有限制的自我纠正** — 验证每个工具(退出代码 + 非空输出);失败时,使用文档化的 fallback 重试一次,然后记录差异
- **自主运行** — 无需中途确认;假设和偏差记录在报告的 Gaps 部分
- **UTC 时间戳** — 始终使用,并为每个支持该参数的工具显式传递 UTC 标志
### 技能 (`~/.claude/skills/dfir-*/SKILL.md`)
每项技能都是独立的:包含特定 DFIR 任务的工具路径、关键标志、使用示例和分析提示。每个 artifact 技能分为两个带标识的部分 — **第 1 部分 · 解析**(在阶段 1 中由 `/case-parse` 使用)和 **第 2 部分 · 分析**(在阶段 2 中由 `/case-analyze` 使用) — 位于共享的前置条件 + 概述前言之下。Claude 在需要使用该工具时会读取相应的技能。技能通过名称(例如 `/dfir-evtx`)调用,或由 `case-investigate` pipeline 自动引用。
### 权限 (`~/.claude/settings.json`)
允许 `Bash(*)`,这样 Claude 在调查期间就不会因等待权限而暂停;**deny list 才是真正的边界**。Write/Edit 的范围仅限于 `./analysis/*`、`./reports/*`、`./context/*`,并在 `sources/**`、`./export/**` 和操作层面的 `./audit/**` 上被明确拒绝;`./export/` 中的已解析证据仅由取证工具 (bash) 写入,绝不使用 Write/Edit 工具,而 `./audit/` 控制 + 审计记录仅由技能 (bash) 和 hooks 写入。
Deny list 会阻止破坏性命令(`rm -r*`、`shred`、`truncate`、`mkfs`、`wipefs`、`fdisk`、`parted`、`sgdisk`、`dd`)以及所有网络出口流量(`wget`、`curl`、`ssh`、`scp`、`rsync`、`nc`、`ncat`、`netcat`、`telnet`、`ftp`、`WebFetch`)。
有两个 hooks 提供后备支持:
- **PreToolUse** (`evidence_guard.py`) — 阻止任何试图写入或删除 `sources/`、`/mnt`、`/media` 或 `*.E01` 的 Bash 命令(语义层面的监管链保障)。
- **Stop** — 将会话元数据(session id、cwd、transcript path)附加到 `./audit/forensic_audit.log`。
## 案件目录结构
每个案件都遵循此布局,支持任意数量的资产:
```
/cases/CLIENT-IR-YYYY-NNN/
CLAUDE.md ← @context/case_context.md + @case-investigate skill
context/
case_context.md ← investigator-maintained: evidence inventory,
network topology, accounts, IOCs, timeline, notes
sources/
/
base-dc-cdrive.E01 ← disk image (read-only, never modified)
.img ← memory image (read-only, never modified)
e01-base-dc-cdrive/ ← ewfmount FUSE point, named from the image (created at mount time)
mnt-001-base-dc-cdrive/ ← filesystem volume mount, named mnt-NNN- (every NTFS/FAT/exFAT partition)
mnt-001-vss-NNN-base-dc-cdrive/ ← VSS snapshot mount (created at mount time)
export/ ← parsed evidence ONLY (tool output; chmod 444, immutable)
/
mnt-001-base-dc-cdrive/ ← one subtree per Windows volume (mnt-001-, mnt-002-, ...)
mft/ usnjrnl/ evtx/ registry/ prefetch/ amcache/ shimcache/
srum/ lnk/ shellbags/ browser/ yara/
memory/ timeline/ ← asset-level (Volatility / plaso), created once per asset
← per-volume subdirs created by case-parse at parse time
analysis/
{case_id}-{asset_id}-analysis-report.md ← one per asset
{case_id}-global-correlation-report.md
reports/
{case_id}-final-report.md
{case_id}-final-report.pdf
audit/ ← operational/control plane (not evidence, not analysis output)
.dfir_phase ← pipeline phase marker (gates ./export writes)
artifact_failures.log ← parse failures / unparseable artifacts
forensic_actions.jsonl ← per-action audit trail (PostToolUse hook)
forensic_audit.log ← per-session record (Stop hook)
/
parse_state.txt ← per-volume, per-artifact status
parse.log ← per-asset parse progress log
```
## 启动调查
### 1. 创建案件目录结构
创建案件目录,从中启动 Claude,并调用 case-init 技能:
```
cd /cases
mkdir ACME-IR-2026-001 # the case directory name becomes the case_id
cd ACME-IR-2026-001
claude
# Prompt: /case-init
# case-init 检测当前目录作为 case root 并在 scaffolding 之前进行确认。
# 提供:client name 和 asset IDs(例如 dc01 rd01)——或将 assets 留空以便稍后添加。
```
或者手动创建:
```
CASE="ACME-IR-2026-001"
ASSETS="dc01 rd01"
mkdir -p /cases/${CASE}/{analysis,reports,context,audit}
for A in $ASSETS; do
mkdir -p /cases/${CASE}/sources/${A} /cases/${CASE}/export/${A} /cases/${CASE}/audit/${A}
done
cp ~/.claude/case-templates/CLAUDE.md /cases/${CASE}/CLAUDE.md
cp ~/.claude/case-templates/context/case_context.md /cases/${CASE}/context/
```
### 2. 填写案件情报
编辑 `/cases/${CASE}/context/case_context.md`:
- **事件时间窗口 (Incident Window, UTC)** — 分析的基准锚点;除非与事件相关,否则窗口之外的活动均被视为基线行为
- **资源清单 (Sources Inventory)** — 每个资产占一行:主机名、角色、磁盘镜像路径、内存镜像路径
- **网络拓扑** — 子网和关键主机
- **域账户** — DA、服务账户、本地管理员
- **已知 IOCs** — 在具有类型的 `ioc` 块中每行一个指标(`hash:`/`ip:`/`domain:`/…),以便 pipeline 确定性地 grep 它们
- **事件时间线 (Incident Timeline)** — 带有时间戳的已知事件(随着分析的进展进行更新)
- **案件备注** — 范围决策、客户限制
### 3. 投递证据并启动
```
# 将 evidence 文件复制或 symlink 到 sources//
cp /media/evidence/dc01.E01 /cases/${CASE}/sources/dc01/
# 从 case root 启动 Claude
cd /cases/${CASE} && claude
# 启动完整 pipeline
# Prompt: /case-investigate
```
### 4. 调查 pipeline
`case-investigate` 技能是一个轻量级的编排器,它链接了四个阶段的技能(每个技能也可以独立运行以便恢复/调试):
| 阶段 | 技能 | 执行内容 |
|-------|-------|-------------|
| **1 — 解析** | `/case-parse` | 从 `case_context.md` 引导启动,通过 `/tools-mount` 挂载每个资产,以有限的并行度 (`MAX_PARALLEL`) 运行所有解析器,并在 `parse_state.txt` 中跟踪状态 |
| **2 — 分析** | `/case-analyze` | 读取 `export//`;为每个资产编写一份带证据标签的分析报告,锚定于事件时间窗口和案件 IOC 块;从不修改 export 文件 |
| **3 — 关联** | `/case-correlate` | 交叉比对所有资产报告;编写全局关联报告 |
| **4 — 报告** | `/case-report` | 编写最终报告,运行 `/case-evidence-verify`(阶段 4.5),如果 WeasyPrint 可用则生成 PDF |
## 逐文件参考
### global/CLAUDE.md → `~/.claude/CLAUDE.md`
全局系统提示。设置 DFIR Orchestrator 角色、证据完整性规则、自主运行偏好,以及一行指向 `dfir-*` 技能的指针。
```
cp global/CLAUDE.md ~/.claude/CLAUDE.md
```
### global/settings.json → `~/.claude/settings.json`
权限策略以及 PreToolUse 证据保护和审计 Stop hook。
允许的 Write/Edit:`./analysis/*`、`./reports/*`、`./context/*`(并且在 `sources/**`、`./export/**`、`./audit/**` 上被明确拒绝)。`./export/` 仅由取证工具 (bash) 写入,从不使用 Write/Edit 工具;`./audit/` 包含阶段标记、解析状态/日志以及由 hook 编写的审计追踪。
```
cp global/settings.json ~/.claude/settings.json
```
### global/settings.local.json → `~/.claude/settings.local.json`
机器本地覆盖设置(sudo apt、psort.py)。尽量保持最少。
```
cp global/settings.local.json ~/.claude/settings.local.json
```
### global/tools.env → `~/.claude/tools.env`
工具路径(`$VOLATILITY3`、`$EZ*`、`$REGRIPPER`,fallback)的唯一真相来源。技能和 pipeline 会 `source` 它;只需在这里更正一次错误的路径,而无需在技能中更改。使用 `/tools-preflight` 进行验证。
```
cp global/tools.env ~/.claude/tools.env
```
### global/evidence_guard.py → `~/.claude/evidence_guard.py`
PreToolUse hook (Bash 匹配器)。读取 stdin 上的工具调用,并通过 `exit 2` 阻止任何试图写入或删除证据(`sources/`、`/mnt`、`/media`、`*.E01`)的命令;允许读取证据。
```
cp global/evidence_guard.py ~/.claude/evidence_guard.py
```
### global/action_logger.py → `~/.claude/action_logger.py`
被 `settings.json` 引用的 PostToolUse hook (Bash|Write|Edit 匹配器)。将每个操作附加到只增不减的 `./audit/forensic_actions.jsonl` 追踪记录中(时间戳、会话、阶段、工具、目标、结果)。
```
cp global/action_logger.py ~/.claude/action_logger.py
```
### global/SIFT_SERVER_DFIR_TOOLS.json → `~/.claude/SIFT_SERVER_DFIR_TOOLS.json`
只读的后备工具路由器:一个机器可读的目录,将每种取证 artifact 类型映射到已安装的 SIFT 命令。仅在作为第三级 fallback(技能的主要工具和文档化的 fallback 均失败)或针对没有 `dfir-*` 技能涵盖的 artifact 类型时,才由 `/case-parse` 调用。`tools.env` 仍然是技能映射工具的唯一真相来源;路由器工具是由其列出的 `command` 路径调用的特许例外。
```
cp global/SIFT_SERVER_DFIR_TOOLS.json ~/.claude/SIFT_SERVER_DFIR_TOOLS.json
```
### skills/ → `~/.claude/skills/`
由安装程序单独安装的 32 个技能(30 个 `dfir-*` 加上 `case-investigate` 和 `case-init`)。
每一项都是独立的,并从 `~/.claude/tools.env` 读取工具路径。伴随文件(例如 `tools-mount/gen_mount_commands.sh`)会与其 `SKILL.md` 一起被复制。
```
# Installer 负责处理此操作。手动复制示例:
mkdir -p ~/.claude/skills/dfir-evtx
cp skills/dfir-evtx/SKILL.md ~/.claude/skills/dfir-evtx/SKILL.md
```
### case-templates/CLAUDE.md → `/cases//CLAUDE.md`
仅供参考的模板。仅包含案件元数据表和两个 `@` 引用:
- `@./context/case_context.md` — 加载特定案件的情报
- `@~/.claude/skills/case-investigate/SKILL.md` — 加载调查 pipeline
此文件中不应包含任何命令、工具路径或特定案件的数据。
```
cp ~/.claude/case-templates/CLAUDE.md /cases//CLAUDE.md
# 仅编辑:Case ID、Client、Case Root
```
### case-templates/context/case_context.md → `/cases//context/case_context.md`
由调查员维护的案件情报文件。部分:
1. 事件时间窗口 (Incident Window, UTC) — 分析的基准锚点
2. 资源清单(资产表)
3. 网络拓扑
4. 域账户
5. 已知 IOCs(具有类型的、可 grep 的 `ioc` 块)
6. 事件时间线 (UTC)
7. 案件备注
这是唯一应包含特定案件事实、IOCs 和时间线条目的文件。
Claude 在每次会话开始时读取它,并在整个分析过程中参考它。
### analysis-scripts/generate_pdf_report.py
Markdown -> HTML -> WeasyPrint PDF 生成器 (CLI: `generate_pdf_report.py --case-id ID --client NAME`)。
由安装程序安装到 `~/.claude/analysis-scripts/`。如果 WeasyPrint 和 markdown 可用,`/case-report` 阶段会在阶段 4 结束时调用它。它不包含任何内置内容;旧示例以不可执行的形式存放在 `analysis-scripts/samples/` 中。纯 Markdown 会被自动丰富为带有样式的组件(严重性徽章、`[!TYPE]` 警告标注、编号章节、深色代码块);字体仅限系统自带(无远程 `@import`),因此可以在气隙隔离主机上运行。
```
pip3 install weasyprint markdown # add --break-system-packages on PEP 668 systems, or use a venv
# 如果缺少 WeasyPrint 的 native libs:
sudo apt-get install -y python3-gi python3-gi-cairo gir1.2-gtk-3.0 libpango-1.0-0
```
## 手动安装(复制粘贴)
```
#!/bin/bash
set -e
# 全局配置
mkdir -p ~/.claude
cp global/CLAUDE.md ~/.claude/CLAUDE.md
cp global/settings.json ~/.claude/settings.json
cp global/settings.local.json ~/.claude/settings.local.json
cp global/tools.env ~/.claude/tools.env
cp global/evidence_guard.py ~/.claude/evidence_guard.py # PreToolUse hook referenced by settings.json
cp global/action_logger.py ~/.claude/action_logger.py # PostToolUse hook referenced by settings.json
cp global/SIFT_SERVER_DFIR_TOOLS.json ~/.claude/SIFT_SERVER_DFIR_TOOLS.json # parse-phase fallback tool router
# Skills
for skill in \
tools-preflight tools-mount \
tools-mount-e01 tools-mount-ntfs tools-mount-vss \
dfir-sleuthkit-file-recovery dfir-file-carving \
dfir-mft dfir-evtx dfir-registry dfir-prefetch \
dfir-amcache dfir-recentfilecache dfir-shimcache dfir-srum \
dfir-scheduled-tasks dfir-lnk-jumplists dfir-shellbags \
dfir-recyclebin dfir-browser dfir-strings \
dfir-plaso-timeline dfir-memory-volatility \
dfir-yara case-evidence-verify \
dfir-triage case-parse case-analyze case-correlate case-report \
case-investigate case-init; do
mkdir -p ~/.claude/skills/${skill}
cp skills/${skill}/SKILL.md ~/.claude/skills/${skill}/SKILL.md
done
# 随 tools-mount 附带的配套脚本
cp skills/tools-mount/gen_mount_commands.sh ~/.claude/skills/tools-mount/gen_mount_commands.sh
# Case template 和分析脚本
mkdir -p ~/.claude/case-templates/context ~/.claude/analysis-scripts
cp case-templates/CLAUDE.md ~/.claude/case-templates/CLAUDE.md
cp case-templates/context/case_context.md ~/.claude/case-templates/context/case_context.md
cp analysis-scripts/generate_pdf_report.py ~/.claude/analysis-scripts/generate_pdf_report.py
pip3 install weasyprint markdown # add --break-system-packages on PEP 668 systems, or use a venv
echo "Done."
```
## 监管链
- Claude 从不写入 `sources/`、`/mnt/`、`/media/` 或任何证据目录
- 通过多层强制执行:只读挂载 (`ro`)、范围限定且在 `sources/**` 上被拒绝的 `Write`/`Edit`、经过强化的 Bash deny list,以及阻止任何写入或删除证据命令的 `evidence_guard.py` PreToolUse hook
- 挂载点在挂载时于 `sources//` 内部创建;证据文件从不被修改
- 所有解析后的输出都位于 `export///` 中 — 仅由取证工具写入,此后不再修改
- 分析和报告文件仅写入 `analysis/` 和 `reports/`
- `Stop` hook 会在每次会话后将案件元数据(session id、cwd、transcript path)附加到 `./audit/forensic_audit.log`
- 在分析前应验证镜像完整性:`ewfverify /cases//sources//*.E01`
## 未包含的内容
| 排除项 | 原因 |
|----------|--------|
| `~/.claude/.credentials.json` | Anthropic API key — 切勿共享 |
| `~/.claude/history.jsonl` | 会话命令历史 — 特定于机器 |
| `~/.claude/projects/` | 会话记忆 — 特定于案件 |
| 证据文件 (`*.E01`, `*.img`) | 只读证据 — 切勿复制或共享 |
| 案件分析输出 | 特定于案件 — 位于 `/cases//` |
标签:Claude Code, LLM编排, SIFT工作站, 后端开发, 库, 应急响应, 应用安全, 数字取证, 自动化报告, 自动化脚本, 防御加固