在做资产梳理、红蓝对抗或者护网前期准备时,你大概率经历过这样的场景:手里只有一个目标域名,却要在有限时间内尽可能找出它的子域名、开放端口、关联邮箱、敏感信息泄露、云资产归属,甚至从一堆看似无关的公开数据里串出完整攻击面。人工操作的做法是打开 VirusTotal、Shodan、DNS Dumpster、Whois、GitHub 等十几个在线平台,一个一个查,再把结果复制到表格里手工去重、拼接。这个过程耗时长、容易漏,最要命的是你很难把不同来源的信息自动关联起来。
SpiderFoot 解决的正是这个问题。它是一款开源 OSINT 自动化情报收集与关联工具,由 Steve Micallef(GitHub 用户 smicallef)开发,采用 Python 编写,能够基于一个种子信息自动调用 200 多个模块,从域名、IP、邮箱、人名、用户名、电话等实体出发,完成信息收集、交叉关联、关联性分析和结果导出。这篇文章会用完整流程带你从零部署 SpiderFoot,讲清楚它的核心概念、Web 界面操作、命令行用法、模块配置和常见坑,帮助你把它真正落到日常安全工作中。
1. 这篇文章真正要解决的问题
很多安全从业者第一次接触 SpiderFoot 时的直觉是:这不就是一个“多合一在线工具聚合器”吗?如果只是把多个 API 的结果拉出来展示,那它和写几十个独立脚本没有本质区别。
这种理解只看到了输入输出,忽略了 SpiderFoot 的核心价值:关联引擎。它不只是收集数据,而是把不同数据源返回的实体之间的关系自动建立起来。比如你在一个域名扫描结果里发现一条 DNS 记录指向某 IP,同时该 IP 的 whois 信息中有某个邮箱,SpiderFoot 会把“域名 -> DNS 记录 -> IP -> 邮箱”自动串成一条链路,并作为一个事件进行关联性评估。这个能力在全网资产测绘、钓鱼演练目标分析、账号泄露溯源、红队信息收集阶段非常实用。
所以这篇文章要解决的问题包括:
- SpiderFoot 到底能做什么,不能做什么;
- 本地部署需要什么条件;
- Web 界面和命令行分别怎么用;
- 如何配置 API 密钥和模块,提升扫描质量;
- 扫描结果怎么读,如何导出给后续工具使用;
- 实际使用中常见的报错、坑和合规边界。
无论你是安全工程师、渗透测试人员、安全运维,还是正在学习威胁情报的学生,读完这篇文章后,你应该能独立完成一次“输入域名 -> 自动收集全网公开情报 -> 生成关联分析报告”的完整流程。
2. 核心概念与工作原理
2.1 OSINT 与主动扫描的区别
SpiderFoot 属于 OSINT(Open Source Intelligence,开源情报)工具。它收集的信息全部来自公开渠道:DNS 解析记录、证书透明度日志、whois 数据库、社交媒体账号、泄露数据库查询接口、搜索引擎缓存、威胁情报平台等。
需要特别注意,OSINT 不等于被动探测。SpiderFoot 的部分模块会主动访问目标站点,例如查询 DNS 记录、爬取网页、连接证书颁发机构等。这类行为会被目标记录,因此在授权范围内使用时,要提前和业务方确认扫描边界。
2.2 核心实体与扫描类型
SpiderFoot 以“种子”为扫描起点,支持的种子类型包括:
| 种子类型 | 说明 | 典型示例 |
|---|---|---|
| 域名 | 针对某个域名进行关联分析 | example.com |
| IP 地址 | 针对某个公网 IP 进行反向关联 | 8.8.8.8 |
| 邮箱地址 | 从邮箱反查注册信息、泄露记录 | test@example.com |
| 人名 | 收集公开人物相关信息 | Zhang San |
| 用户名 | 在社交平台、开源社区中搜索用户名 | root |
| 电话 / 银行卡 / AS 号 | 特定场景下的实体分析 | AS13335 |
每种扫描类型会调用不同模块组合。比如域名扫描侧重 DNS、证书、子域名枚举、whois 查询;IP 扫描侧重端口测绘、IP 反查域名、ASN 归属分析;邮箱扫描则侧重于账号泄露记录、社交平台关联、Telegram 钓鱼检测等。
2.3 模块与扫描计划
SpiderFoot 的模块命名遵循sfp_前缀 + 数据源的约定,例如:
sfp_dns:执行 DNS 解析与记录收集;sfp_shodan:调用 Shodan 接口查询暴露资产;sfp_virustotal:调用 VirusTotal 接口查询威胁情报;sfp_whois:查询域名和 IP 的注册信息;sfp_haveibeenpwned:查询邮箱是否出现在已知泄露数据库中。
扫描时,SpiderFoot 会根据扫描类型自动推荐一组模块,也允许手动勾选或排除。每个模块返回的数据会成为另一个模块的输入。这种“数据驱动”的流水线设计,是它和普通 API 聚合脚本最大的区别。
2.4 事件关联:从“数据堆”到“关系图”
SpiderFoot 内部把收集到的信息统一抽象为“事件”(Event)。事件可以是 DNS 记录、IP 地址、关联邮箱、泄露记录、网页内容等等。关联引擎会基于事件类型和实体值,把重复信息折叠,把能互相印证的实体串联。
举个例子,域名扫描过程中发现一个子域名,该子域名解析到的 IP 上又运行着邮件服务,邮件服务返回的 banner 中包含某个用户名,用户名在另一个数据源中被关联到了一个 GitHub 仓库。这一整条链路在 SpiderFoot 的 Web 界面中会以图结构呈现,你不必在几十个标签页之间来回切换。
3. 环境准备与前置条件
SpiderFoot 对部署环境要求不高,普通 Linux 虚拟机和 Docker 环境都能顺畅运行。以下环境配置是以多数项目的通用情况为例,具体版本请以实际部署环境为准。
3.1 操作系统与运行环境
- Linux(CentOS 7 / Ubuntu 20.04 及以上)或 macOS;
- Docker 环境(推荐,省去依赖问题);
- Python 3.9 及以上(源码安装方式需要);
- 至少 2GB 内存、20GB 磁盘空间,结果数据库和扫描缓存会随使用增长。
3.2 网络条件说明
SpiderFoot 大量依赖外部 API 和公开数据源,需要能够直接访问这些服务的网络环境。部分数据源接口需要注册并配置 API Key,这一点会在后文专门说明。
3.3 使用方式的选型建议
| 方式 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|
| Docker 部署 | 环境隔离好、快速启动 | 数据卷和端口需要配置 | 快速试用、生产服务 |
| 源码安装 | 方便调试和二次开发 | 依赖安装步骤多 | 想改源码、做模块开发 |
| 云服务器部署 | 公网扫描不受本地 IP 限制 | 需要自己维护环境 | 长期运行、定时任务 |
4. 安装与启动流程
4.1 使用 Docker 快速部署
Docker 是上手最快的方案。执行以下命令即可拉取镜像并启动:
docker run -d \ --name spiderfoot \ -p 5001:5001 \ -v /data/spiderfoot:/var/lib/spiderfoot \ smicallef/spiderfoot:latest参数说明:
-p 5001:5001:将容器的 Web 管理端口映射到宿主机;-v /data/spiderfoot:/var/lib/spiderfoot:持久化 SQLite 数据库、日志、模块配置;-d:后台运行。
启动后,浏览器访问http://<服务器IP>:5001,看到登录页面说明服务已正常运行。首次使用需要在页面中设置管理员账号和密码。
4.2 使用源码安装
如果选择源码安装,先克隆仓库:
git clone https://github.com/smicallef/spiderfoot.git cd spiderfoot创建并激活虚拟环境(推荐,避免污染系统 Python):
python3 -m venv venv source venv/bin/activate安装依赖:
pip install -r requirements.txt启动 Web 服务:
python3 spiderfoot.py -l 0.0.0.0:5001-l参数指定监听地址和端口。日志中如果出现Server started字样,说明启动成功。
4.3 首次配置管理员账号
Web 页面首次打开时会要求设置管理员账号。注意这里不是系统登录账号,而是 SpiderFoot 自身的管理员凭证,用于后续管理扫描任务和模块配置。账号密码请妥善保管。
5. 使用 Web 界面完成第一次扫描
5.1 新建扫描任务
登录 Web 界面后,页面顶部是一个种子输入框。以域名example.com为例,在输入框中填写域名,然后点击“Run Scan”。
SpiderFoot 会根据种子类型自动识别扫描对象。如果没有特殊要求,直接使用默认的扫描类型和模块组合即可。
5.2 开始扫描
点击运行后,界面会进入扫描详情页,包含以下几个主要区域:
- 扫描状态:显示当前任务进度、正在运行的模块、已生成的事件数量;
- 扫描时间线:显示每个模块的运行顺序和耗时;
- 事件列表:所有收集到的事件以表格形式展示,按实体类型和关联数排序;
- 关联图:以可视化方式展示实体之间的关系。
第一次扫描建议选择一个测试域名,而不是直接扫描生产资产,先熟悉流程和结果展示方式。
5.3 增量扫描与数据继承
Web 界面允许在已有扫描结果上继续扫描。点击“Scan Again”可以选择保留原有数据还是清空,这在你新增了某个 API 密钥后想补查数据时很有用。
这个设计的意义在于:OSINT 收集不可能一次完成,很多数据源需要等待 API 额度恢复或模块更新。SpiderFoot 支持在同一个扫描任务里逐步扩大覆盖面,不需要重新从零开始。
6. 使用命令行进行自动化扫描
Web 界面适合交互式分析,但如果你需要在 CI/CD 流水线、定时任务或批量资产调研中使用 SpiderFoot,命令行是不可或缺的。
6.1 基本命令行参数
spiderfoot-cli.py是命令行扫描入口,常用参数如下:
python3 spiderfoot-cli.py \ -s example.com \ -t DOMAIN_NAME,IP_ADDRESS \ -m sfp_dns,sfp_whois,sfp_shodan \ -o /tmp/scan.json \ -d参数说明:
-s:指定种子(seed),必填;-t:指定希望收集的事件类型,多个类型用逗号分隔;-m:指定只运行的部分模块,未指定则运行全部模块;-M:排除某些模块;-o:导出结果文件路径,支持 JSON、CSV、GEXF 等格式;-d:开启 debug 日志。
6.2 使用部分模块快速扫描
不是每次都需要跑完数百个模块,合理的做法是先跑基础 DNS 和 whois 模块,快速得到画像,再根据结果决定是否深入:
python3 spiderfoot-cli.py \ -s example.com \ -m sfp_dns,sfp_whois,sfp_cert,sfp_subdomains \ -o /tmp/scan-fast.json这种“先快后慢”的策略可以显著减少外部数据源的 API 消耗,也能让结果更聚焦。
6.3 让扫描结果输出为 CSV
在安全团队协作场景下,CSV 格式更适合导入表格工具或内网资产管理系统:
python3 spiderfoot-cli.py -s example.com -o /tmp/scan.csv输出文件会根据扩展名自动决定格式。CSV 适合人工审查,JSON 适合二次编程处理。
7. 模块配置与数据源 API 管理
7.1 为什么需要配置 API Key
SpiderFoot 内置不少模块依赖第三方服务的 API。例如sfp_shodan需要 Shodan 账号 API Key,sfp_virustotal需要 VirusTotal API Key。未配置密钥时,这些模块仍然可以运行,但查询返回的数据量很小,或者直接以模块错误告终。
7.2 在 Web 界面配置模块
在 Web 界面右上角“Settings”部分可以进入模块配置页面。页面会列出所有模块,每个模块旁边显示与之关联的 API Key 配置入口。
配置密钥的通用步骤:
- 进入第三方平台注册账号,申请 API Key;
- 在 SpiderFoot 设置页面找到对应模块;
- 输入 API Key 并保存。
需要提醒的是,API Key 属于敏感凭证。建议使用专门的限量账号申请,不要直接使用核心平台的管理员 Key;Key 泄露后要有立即吊销的预案。
7.3 在命令行场景下配置
命令行扫描读取的配置与 Web 界面共用同一个 SQLite 数据库,因此在 Web 界面保存的模块配置,命令行同样会生效。如果你完全不用 Web 界面,也可以直接编辑配置文件,但官方更推荐通过 Web 界面管理,因为格式校验和错误提示更友好。
7.4 模块请求延迟与限速
调用第三方 API 时,SpiderFoot 允许配置请求延迟参数。合理的延迟可以避免触发目标平台的限流策略,尤其在批量扫描多个资产时,不能把第三方 API 打挂。这个参数需要根据实际账号额度设置,建议从 1 秒起步,根据报错情况上调。
8. 扫描结果解读与数据导出
8.1 事件类型与严重程度
SpiderFoot 的扫描结果中,每个事件都带有类型标签和“风险等级”概念。虽然不同扫描类型下事件语义不同,但大致可以按以下方式归类:
| 事件类型 | 典型示例 | 业务判断 |
|---|---|---|
| DNS 记录 | A 记录、CNAME、MX | 用于资产发现和攻击面扩展 |
| WHOIS 信息 | 注册邮箱、组织名 | 可用于社会工程学和钓鱼演练 |
| 证书透明度 | 子域名证书 | 子域名枚举的高价值来源 |
| 关联邮箱 | 域名下暴露的邮件 | 可能成为钓鱼目标 |
| 泄露记录 | 邮箱在已知泄露库出现 | 需要第一时间验证真实性 |
| IP/ASN 归属 | 云厂商、IDC 数据 | 判断资产是否托管在公网 |
8.2 关系图的用法
Web 界面右侧的关联图是 SpiderFoot 最直观的功能。你可以点击任意实体节点,查看它与其他节点的连接关系。在实际分析中,我建议优先看“出现在路径中间的实体”,它们通常是关键跳板。例如一个不显眼的用户名,如果同时连接了 GitHub 仓库和公司邮箱,那么它很可能是一条值得深入挖掘的情报链路。
8.3 导出给其他工具使用
扫描完成后,导出 JSON 或 CSV 文件,后续可以:
- 导入 Neo4j 图数据库做更深层关联分析;
- 交给内部资产管理系统做自动化入库;
- 作为 Red Team 报告的附件提供给委托方。
9. 常见问题与排查方法
以下问题是 SpiderFoot 使用过程中比较常见的情况,整理成表格方便快速定位。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 启动时提示 Python 版本过低 | 系统 Python 版本不满足要求 | python3 --version检查版本 | 使用 3.9+ 版本或改用 Docker 部署 |
| Docker 端口冲突 | 5001 端口已被占用 | netstat -tlnp | grep 5001 | 修改宿主映射端口,如-p 5002:5001 |
| 扫描无结果 | 部分模块需要 API Key 且未配置 | 查看模块运行日志,筛选ERROR关键字 | 到 Settings 页面为对应模块补充 API Key |
| 模块返回 429 或 403 | 触发第三方 API 限流或请求被拒绝 | 检查模块日志和第三方平台配额 | 调大请求延迟,升级 API 套餐,或限制扫描范围 |
| 数据库文件损坏 | 容器异常退出或存储盘空间不足 | 检查/var/lib/spiderfoot下的.db文件 | 从备份恢复,或重新初始化数据库 |
| 扫描过程中 Web 界面卡死 | 事件量过大,浏览器渲染压力高 | 查看服务器 CPU 和内存 | 使用命令行扫描大量种子资产;Web 界面只用于结果分析 |
| 子域名收集不全 | 部分搜索引擎和证书源限流 | 对比相同种子在多个模块的运行结果 | 配置更多可用的 API Key,增加模块覆盖面 |
如果某个模块长期报错,可以先单独运行它做排查:
python3 spiderfoot-cli.py -s example.com -m sfp_whois -d单独运行能减少无关模块的干扰,快速判断是模块配置问题还是数据源本身不可用。
10. 最佳实践与工程建议
10.1 授权范围内使用
SpiderFoot 会向目标系统域名或主机发送 DNS 查询、网页抓取、连接证书端口等请求,这些行为在未授权情况下可能被视为扫描行为。所有 OSINT 收集工作必须在明确授权和合规前提下进行,企业内部使用时也应优先选择自有域名和已授权范围的资产。如果用于渗透测试或红队项目,务必在委托合同或授权书中明确标注“包含被动与主动信息收集”。
10.2 数据源与 API Key 管理
生产环境建议成立一个专门的数据源账号池,而不是各人私用个人邮箱注册的 Shodan、VirusTotal Key。这样做的好处是:
- 密钥集中管理,方便吊销和审计;
- 各数据源配额统一调度,避免相互影响;
- 项目结束后可以整体移交,不会因为某成员离职导致扫描中断。
API Key 不要明文提交到 Git 仓库。如果使用源码部署,建议通过环境变量或配置文件读取,并对配置文件设置最小权限。
10.3 扫描任务分层规划
不要一次把数百个模块全部打开去扫描大量资产,容易把 API 配额耗尽,还会产生大量噪声。推荐的资产调研流程是:
- 先用基础模块快速获取域名、IP、whois 信息,形成资产底表;
- 再针对高价值资产(核心域名、对外服务、管理后台)启用威胁情报模块;
- 最后把结果导出,结合人工分析确认误报和关联性。
这种分层方式保证每一次扫描的投入产出比最大化。
10.4 结果证据保留
OSINT 收集的结果很可能在未来作为应急响应或追踪溯源的重要依据。扫描完成后,建议把 JSON 导出文件按任务名称和日期归档,同时保存原始日志。报告中如果想引用某个数据源结论,应保留模块运行时间和 API Key 归属信息,方便事后复核。
10.5 与威胁情报平台联动
SpiderFoot 不是终点,而是情报收集链路的起点。实际工作中,可以把它产出的高价值实体(子域名、IP、邮箱、泄露记录)导入企业内部的威胁情报平台或 SIEM,形成持续监控。例如定期对核心域名跑一次轻量级扫描,把新增子域名、新增解析 IP 作为预警信号,纳入安全运营流程。
11. 总结与后续学习方向
这篇内容围绕 SpiderFoot 完成了从部署、Web 界面扫描、命令行自动化到结果解读的完整流程。它不只是一个“信息收集工具”,而是一个能把域名、IP、邮箱、用户名等不同种子自动关联成情报网络的框架,关键在于理解模块机制和数据流。
对想继续深入的人来说,有两条明确的进阶路径。一条是挖掘自有数据源的价值,尝试为 SpiderFoot 编写自定义模块,熟悉它的事件模型和模块接口,把它变成贴合自身业务的专属情报引擎。另一条是把扫描结果接入 Elasticsearch、Neo4j 或威胁情报平台,构建持续运行的资产监控体系,让 SpiderFoot 从单次工具变成常态化安全运营的一环。
建议你先用测试域名跑通全流程,再逐步引入自己的业务场景。不要一开始就追求模块数量,先把默认扫描做透,把事件关联图读懂,再根据实际需求扩展数据源和 API 配置。把这套流程沉淀为团队的标准操作手册,它会成为你日常安全工作中非常趁手的利器。