rsp2k/nautobot-app-scanner

GitHub: rsp2k/nautobot-app-scanner

面向 Nautobot 的 nmap 扫描集成插件,可直接扫描 IPAM 目标并将发现的网络资产与漏洞信息展示在现有设备页面中。

Stars: 0 | Forks: 0

# nautobot-app-scanner [![许可证: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![Python: 3.10+](https://img.shields.io/badge/Python-3.10%2B-blue.svg)](https://www.python.org/downloads/) [![Nautobot: 3.x](https://img.shields.io/badge/Nautobot-3.x-00a99d.svg)](https://docs.nautobot.com/) [![版本: CalVer](https://img.shields.io/badge/version-2026.5.24-informational.svg)](https://github.com/rsp2k/nautobot-app-scanner/releases) **在 Nautobot 中运行 nmap。** 扫描 IPAM 定义的目标,将主机 / 端口 / 服务 / CVE 存储为一等模型,并将结果直接显示在您的团队已经在使用的 `dcim.Device`、`ipam.IPAddress` 和 `ipam.Prefix` 页面上。 ![包含统计卡片和已发现主机表的已完成扫描详情页](https://static.pigsec.cn/wp-content/uploads/repos/cas/0c/0c0e072670154c28fc8a8243cd628b0915e09619fcb1894969ca8189d1c258e7.png) ## 功能简介 | | | |---|---| | **现有的目标** | 扫描 `ipam.Prefix` 和 `ipam.IPAddress` 记录 —— 无需维护单独的目标列表。 | | **两种执行模型** | 在 Nautobot worker (`LocalBackend`) 内部运行 nmap,或者卸载到一个或多个远程 agent (`RemoteBackend`),以覆盖 Nautobot 无法访问的 DMZ / OT / 分支网段。 | | **默认只读** | 扫描输出存在于*独立的* `DiscoveredHost` / `DiscoveredPort` / `NseFinding` 模型中。提升为 IPAddress 和提升为 Device 是明确的、受权限控制的应急通道。 | | **随时可见** | `TemplateExtension` 将扫描仪面板注入到 Device / IPAddress / Prefix 详情页中,因此您可以在查找其他所有内容的相同位置找到扫描数据。 | | **真正的 nmap,而非包装器** | 配置文件是 nmap 参数字符串(如 `-sS -sV -O --top-ports 1000` 等)。预置的目录涵盖发现、端口扫描、OS 指纹、全 TCP、漏洞、路由追踪和 UDP。30 秒内即可编写您自己的配置。 | | **一流的作业机制** | 扫描通过 Nautobot Jobs 进行调度 —— 调度、审计跟踪、日志流、重试、JobResult 页面全部随附。 | ## 工作原理 ``` flowchart TD job([RunScan Job]) subgraph local["LocalBackend — in Celery worker"] direction TB localScan["Scan
status=running"] nmap1["nmap subprocess
parser.parse_xml
parser.persist"] localDone["Scan
status=completed"] localScan --> nmap1 --> localDone end subgraph remote["RemoteBackend — standalone agents"] direction TB remoteScan["Scan
status=pending
ingestion_token=uuid"] agent["Agent polls /pending-scans/
runs nmap locally
POSTs XML to /ingest/"] remoteDone["Scan
status=completed"] remoteScan --> agent --> remoteDone end job --> localScan job --> remoteScan host[(DiscoveredHost)] port[(DiscoveredPort)] vuln[(NseFinding)] trace[(TraceRouteHop)] localDone --> host remoteDone --> host host --> port host --> trace port --> vuln ``` 本地后端由两个容器(Nautobot + worker)和一个单一的 Python 依赖项组成。远程 agent 是位于 Docker 容器中的单个 Python 文件 —— 包含的三个 compose 变体涵盖了 host-network、bridge-network 和 dev-bridge 场景。 ### 扫描数据的显示位置
**在 `dcim.Device` 详情页上** 在导入时通过与 `Device.primary_ip4/6` 的 IP 匹配进行自动关联 —— 无需手动关联步骤。 ![Device 详情页上的 Scanner Activity 面板](https://static.pigsec.cn/wp-content/uploads/repos/cas/80/801c9e28b538a7882ff5fabb7cf55810049371306d131a11897ad6a929629214.png) **在 `ipam.Prefix` 详情页上** 覆盖率统计数据(扫描的 IP 百分比、存活主机、最近的扫描)缓存 5 分钟,因此 /16 网段不会导致页面卡顿。 ![Prefix 详情页上的 Scan Coverage 面板](https://static.pigsec.cn/wp-content/uploads/repos/cas/99/9999c818503cee8fcba9e247fd2c918d387f7f78848f8782ed7db5b6f836c93a.png)
## 安装说明 ``` pip install nautobot-app-scanner ``` 然后在 `nautobot_config.py` 中: ``` PLUGINS = ["nautobot_scanner"] ``` …并执行: ``` nautobot-server migrate nautobot-server post_upgrade ``` 迁移附带了 7 个配置目录(`discovery`、`top-100-tcp`、`os-detect`、`full-tcp`、`vuln`、`topology`、`udp-common`),通过 `get_or_create` 进行预置 —— 您的修改将在后续迁移中得以保留。 ## 快速入门 —— 开发环境 ``` git clone https://github.com/rsp2k/nautobot-app-scanner cd nautobot-app-scanner cp development/.env.example development/.env # 编辑 development/.env:设置 DOMAIN 并轮换 changeme- secrets make build make up make migrate ``` 浏览至 `https://${DOMAIN}/`(Caddy 负责处理 TLS)并使用预置的超级用户登录。然后执行 **Apps > Scanner > Scanner Agents > Add** 添加本地 agent,执行 **Jobs > Run Scan**,并从您的 IPAM 中选择一个 `Prefix` 作为目标。 完整的开发指南 —— 包括 docker external-network 设置和 `smoke_local_scan.py` 助手脚本 —— 位于 [docs/dev/dev_environment.md](docs/dev/dev_environment.md)。 ## 远程 Agent 为了扫描 Nautobot 无法访问的网络网段(DMZ、OT、分支机构、合作伙伴对等连接),[`agent/`](agent/) 目录提供了一个容器化的参考 agent。相同的镜像,三种 compose 变体: | 模式 | 使用场景 | Compose 文件 | |---|---|---| | **Host network** | LAN 扫描、SPAN 端口、物理接口、OT 网段 | `agent/docker-compose.host-mode.yml` | | **Bridge / attached** | 清点特定 docker overlay 内部的服务 | `agent/docker-compose.bridge-mode.yml` | | **Dev-bridge** | 针对开发堆栈进行本地开发 | `agent/docker-compose.dev-bridge.yml` | Agent 身份验证为每个 `ScannerAgent` 使用专用的 `auth.User`(通过 signal 自动创建),并使用 DRF Token 作为 bearer 凭证。任何语言的自定义 agent 都可以遵循 [Agent Protocol](docs/dev/agent_protocol.md) 进行交互 —— 它仅包含三个 HTTP endpoint。 ## 文档 | | | |---|---| | **[App 概览](docs/user/app_overview.md)** | App 存储了什么以及它如何与 Nautobot 的其余部分集成 | | **[运行扫描](docs/user/running_scans.md)** | 通过 Jobs 调度、计划、重叠策略、取消 | | **[扫描配置文件](docs/user/scan_profiles.md)** | 7 个内置配置,如何编写您自己的配置,NSE 脚本处理 | | **[提升已发现的主机](docs/user/promotion.md)** | 提升为 IPAddress 和提升为 Device 的工作流 | | **[Scanner Agent](docs/user/agents.md)** | 本地与远程对比、活性检测、离线标记 | | **[安装远程 Agent](docs/admin/install_remote_agent.md)** | 操作部署演练 —— 6 个步骤及故障排除 | | **[Agent Protocol](docs/dev/agent_protocol.md)** | 针对自定义 agent 的 REST 契约 | | **[架构决策](docs/dev/architecture.md)** | 为什么这个 App 是现在这样的(以及什么是故意排除在范围之外的) | 完整的 MkDocs 站点随 App 一起打包 —— 安装后,在 App 内的 **Apps > Scanner > docs** 处浏览,或使用 `mkdocs serve` 在本地构建。 ## *未* 包含的内容 一些被特意排除在外的常见需求 —— 每一项在[架构决策](docs/dev/architecture.md)中都有原因: - **从扫描自动同步 IPAM** —— 误报将变成永久性的 IPAM 记录。请使用提升功能。 - **自定义 cron 调度器** —— Nautobot 内置的 Job 调度器已经做到了这一点。无需重复造轮子。 - **`ARPBinding` 模型** —— `DiscoveredHost.mac_address` 已经捕获了 ARP 解析的 MAC。 - **`ServiceFingerprint` 模型** —— 指纹字段直接存在于 `DiscoveredPort` 上;无论如何,nmap 的 `-sV` 都会使用 `service_name` 生成它们。 ## 许可证 [Apache-2.0](LICENSE) — © Ryan Malloy
标签:CTI, 请求拦截, 逆向工具