内容
# Tenable ATT&CK 映射工具
**MCP 服务器** 可将您的 **Tenable 安全中心** 发现结果映射到 **MITRE ATT&CK**,然后让您使用 **Claude Code** 以自然语言分析您的暴露情况。想要可视化展示?在浏览器中打开 **VPR 评分的 ATT&CK 矩阵**,点击任意技术以查看其背后的漏洞,每个漏洞都链接到安全中心中的详细页面。

---
## 快速入门
### 1. 安装 uv
**uv** 是一个快速(基于 Rust)的 Python 包和虚拟环境管理器,比 pip 快约 8 倍,并且会自动为您管理正确的 Python 版本。一次性安装:
```bash
curl -LsSf https://astral.sh/uv/install.sh | bash
```
然后打开一个新的终端,使 `uv` 位于您的 PATH 中。在 Windows 上,请参阅 [uv 安装文档](https://docs.astral.sh/uv/)。
### 2. 安装工具
```bash
git clone https://github.com/ayuksel-tenb/tenable-attack-mapper
cd tenable-attack-mapper
uv venv && source .venv/bin/activate
uv pip install -e .
```
虚拟环境将依赖项隔离(不会与基础 Python 或 conda Python 冲突)。在新的终端中重新激活它(`source .venv/bin/activate` 或 Windows 上的 `.venv\Scripts\activate`)。
> 如果没有 uv,可以使用 `python3 -m venv .venv && source .venv/bin/activate && pip install -e .`(Python 3.12+),只是速度较慢。
### 3. 配置
```bash
cp .env.example .env
```
设置您的安全中心 URL 和密钥(`TSC_URL` / `TSC_ACCESS_KEY` / `TSC_SECRET_KEY`)。这是唯一必需的配置 - 语义映射通过本地的 `claude` CLI 运行在您的 **Claude Code 订阅**上(无需 API 密钥,无需按令牌计费),因此请确保 `claude` 位于您的 PATH 中并且已登录 (`claude login`)。可选:调整 `TASC_CLAUDE_MODEL`(默认为 `claude-haiku-4-5`)和 `TASC_SEMANTIC_WORKERS`。
### 4. 连接到 Claude Code
在存储库文件夹中运行此命令(步骤 2 已将服务器安装到 `.venv`):
```bash
claude mcp add --transport stdio tenable-attack-mapper -- "$(pwd)/.venv/bin/tenable-attack-mapper-mcp"
```
无需重复密钥 - 服务器读取您在步骤 3 中设置的 `.env`,即使 Claude Code 从另一个目录启动它。然后 `/mcp` 应该显示已 **连接**。
> 如果在没有存储库 `.env` 的情况下安装(例如全局或 uvx 安装),请显式传递密钥:添加 `--env TSC_URL=… --env TSC_ACCESS_KEY=… --env TSC_SECRET_KEY=…` 在 `--transport` 之前。
### 5. 使用
在当前文件夹中打开 Claude Code 并按顺序提问:
```
打开攻击矩阵。
```
> **请先执行此操作**。第一次同步会拉取您的发现结果并将它们映射到 ATT&CK - 在冷缓存上需要几分钟(它通过 `claude` CLI 映射约 1000 个发现结果)。"打开攻击矩阵"作为一个可见步骤运行,以便您可以查看进度,然后打开浏览器。完成后,缓存使得以下所有操作都立即完成。
```
映射我的环境并按 VPR 显示顶部技术。我的发现结果中哪些映射到 T1190 和 T1059?
```
`打开攻击矩阵`会启动一个本地查看器并在您的浏览器中打开它 - 技术按 VPR 暴露程度着色;点击一个技术以查看其漏洞,每个漏洞都有 ⓘ 理由和 **在安全中心打开** 的深层链接。
---
## 常见问题
**“映射我的环境”实际上是做什么的,为什么第一次运行需要几分钟?**
它(1)连接到您的安全中心并拉取开放的发现结果,(2)将每个发现结果确定性地映射到 ATT&CK(CVE → CWE → CAPEC/ATT&CK - 完全本地),并且(3)对于其余的,询问 Claude(通过本地 `claude` CLI)哪些技术适用。语义步骤在您的 CVE 承载的发现结果上运行 Claude,批量并行处理 - 对于约 1000 个发现结果,这需要几分钟。结果被缓存(`data/.semantic_cache.json`),因此重新运行是即时的。
**提示:** 使用 **"打开攻击矩阵"** 或 CLI(`uv run tenable-attack-mapper run --out layer.json`)进行第一次(冷缓存)同步,以便您可以查看进度 - 然后 "映射我的环境" 和其他提示立即从缓存返回。MCP 工具调用(例如 "映射我的环境")会阻塞,没有进度条,因此在冷缓存上可能看起来卡住了几分钟。
**在 `claude mcp add` 之后,为什么它不是立即“连接” - 它在等待什么?**
只等待 Claude Code 启动服务器并进行握手 - 加载 Python 包并注册其 4 个工具需要几秒钟。它 **不** 在连接时连接到安全中心(仅在工具运行时连接)。`/mcp` 应该在几秒钟内显示已连接;如果它停留,Python 导入只是正在启动,而不是等待您的安全中心或网络。
**我的数据会离开我的机器吗?我的 IP 地址/端口/主机名会被发送到任何地方吗?**
**不会有主机识别数据离开您的机器**。对于语义步骤,本地 `claude` CLI 发送到 Anthropic 的唯一信息是通用漏洞信息:**插件 ID、插件名称、CVE ID 和插件描述**(截断)- 所有这些都是公共的、供应商发布的 数据。
**不会发送:** IP 地址、端口、主机名、MAC 地址、资产/主机计数、VPR 分数或您的安全中心 URL 和 API 密钥。该工具甚至不 *获取* 安全中心中的主机/IP/端口字段 - 它按插件工作,而不是按主机。
**确定性映射是离线的吗?**
是的 - 完全本地,无需网络调用,除非您选择进行实时的 NVD CVE → CWE 查找(`TASC_USE_NVD=true`),它只会发送 CVE ID 到 NVD。
**我的发现结果和 ATT&CK 层存储在哪里?**
完全在您的机器上。层 JSON 在本地编写,查看器在本地容器中运行,并且 `layers/*.json` 被 git 忽略,因此暴露数据永远不会被提交。
**它使用哪个 LLM,费用是多少?**
语义映射使用本地的 **`claude` CLI**(默认模型 `claude-haiku-4-5`),计费到您的 **Claude Code 订阅** - 无需 API 密钥,无需按令牌计费。调用被批量处理,并行运行(`TASC_SEMANTIC_WORKERS`),并且每个插件缓存,因此对相同的发现结果重新运行是免费的。
## 重新开始
`./uninstall.sh` 删除了该工具在 Docker 中运行的所有内容 - 攻击导航器查看器/Navigator 容器、它们的镜像、网络和卷,以及之前运行的任何孤立容器。它按名称/镜像/组合项目范围限定,因此不会触及无关的容器(例如 Tenable SC 实验室盒)。
---
**更多信息:** [映射工作原理](docs/mapping.md) · [CLI、OpenCode 和工具](docs/usage.md) · [查看器](https://github.com/ayuksel-tenb/attack-navigator) · MIT 许可。