提交一个入口 URL,自动完成资产发现、证据归纳和报告生成。
garden-ctl.com · 架构说明 · 部署文档
Garden 是一个面向已授权目标的被动资产扫描与报告系统。用户不需要手动串联登录、inventory、checks 或 report 命令;Web、HTTP API 和 CLI 都调用同一个核心应用服务。
URL
→ 输入与网络校验
→ 同源目标发现
→ 资产与证据收集
→ 结果标准化
→ 被动分析
→ Markdown 报告
macOS、Linux 或 WSL(Python 3.10+)可直接在仓库根目录安装用户级 CLI;不需要 sudo,也不需要手动激活虚拟环境:
./install.sh
garden --version
garden scan http://127.0.0.1:13000/首次运行会自动启动或复用仅监听本机回环地址的 Web UI,并输出首页和本次扫描详情地址;默认前台显示进度,但不会自动打开浏览器。用户数据默认保存于 ~/.garden,可用 GARDEN_HOME 覆盖。若安装后找不到命令,请按安装器输出将 ~/.local/bin 加入 PATH。
安装器会自动寻找满足 3.10+ 的解释器;若通用 python3 是 3.10/3.11,但系统已有版本化的 Python 3.12/3.13,则优先使用较新的版本化解释器,否则继续兼容通用解释器。安装器也会识别常见 Homebrew 版本化安装路径。需要固定解释器时可设置 GARDEN_PYTHON=/path/to/python3,显式指定始终优先。正式命令使用 runtime 内随环境一起替换的隔离入口加载已安装包,即使从 Garden 仓库目录执行,也不会被当前源码覆盖。
garden scan http://127.0.0.1:13000/ --detach # 仅提交,立即返回
garden stop # 中断活动扫描并停止本机 UIgardenctl 是兼容别名,既有命令组和 gardenctl scan --url URL 均继续可用。
环境要求:Python 3.10+。
git clone https://github.com/Moxxkidd/Garden.git
cd Garden
python3 -m venv .venv
source .venv/bin/activate
make install
cp .env.example .env
make dev打开 http://127.0.0.1:8000,输入一个已授权的 HTTP/HTTPS URL,然后点击 Start scan。
页面会自动展示:
- 当前阶段和真实进度
- 已发现的资产、证据和关注项数量
- 重试、部分失败和未覆盖原因
- 最终报告的在线阅读与下载入口
使用 Docker:
cp .env.example .env
docker compose up --build访问 http://127.0.0.1:8000/,只需填写 URL。后续流程由系统自动执行。
garden scan http://127.0.0.1:13000/
gardenctl scan --url http://127.0.0.1:13000/ # 兼容写法可以用边界参数控制扫描规模:
garden scan http://127.0.0.1:13000/ \
--max-pages 50 \
--max-resources 200 \
--max-depth 2 \
--request-timeout 5 \
--overall-timeout 90 \
--retries 1--overall-timeout bounds target network collection. When it expires, Garden stops new requests, marks coverage incomplete, and finishes local normalization, analysis, and report generation for evidence already collected.
curl -X POST http://127.0.0.1:8000/api/scans \
-H 'content-type: application/json' \
-d '{"url":"http://127.0.0.1:13000/"}'相关接口:
POST /api/scans:提交 URLGET /api/scans/{id}:读取进度、阶段和失败信息POST /api/scans/{id}/cancel:中断尚未结束的扫描并保留已写入结果GET /api/scans/{id}/report:阅读或下载报告
报告由持久化的结构化数据生成,不解析或拼接 CLI 日志,包含:
- 执行摘要与扫描范围
- 发现的资产及关键属性
page、stylesheet、script、image、document分类资产- 来源明确且默认脱敏的证据;静态资源使用大小、SHA-256、带可信上下文的版本线索和安全信号摘要
- 已观察到的正向安全控制,例如 HSTS 和 X-Frame-Options
- 风险或关注项
- 阶段完成情况和扫描覆盖范围
- 分开列示的覆盖告警与请求失败;覆盖告警包含候选数、已请求数、未覆盖分类、命中限制和代表样本
- 报告生成时间
默认输出目录:
exports/scan-reports/scan-<id>.md
Garden 只应用于已获得授权的目标,并采用以下有界策略:
- 仅允许
http和https - 只执行有界、同源的被动
GET请求 - 每次连接和重定向都会重新校验目标地址
- 默认允许已授权的公网目标和本机回环目标
- 如需恢复仅本机模式,可显式设置
GARDEN_ALLOW_NON_LOCAL_TARGETS=false - RFC1918/ULA 内网目标还需要设置
GARDEN_ALLOW_PRIVATE_TARGETS=true - link-local、云元数据常用地址、组播和未指定地址始终拒绝
- 请求超时、整体超时、并发、重试、页面数、资源数和深度均有限制
- 页面与静态资源使用独立预算,默认优先采集最多 50 个 HTML 页面,再采集最多 200 个静态资源
- 非文本响应只记录类型和大小,不把二进制内容写入报告
Web / API / CLI
↓
ScanApplicationService.start_scan(url, options)
↓
Persisted ScanRun + six-stage ScanPipeline
↓
Assets / Evidence / Findings / Failures
↓
ScanReportService
CLI、路由和页面模板只是适配层,核心业务流程位于应用服务和流水线中。单个阶段或页面失败会被持久化并显示在任务和报告中,不会静默伪装成完整结果。
需要登录态、人工 triage、retest 或高级证据生命周期时,原有高级工作流仍然可用,但它们不是 URL 自动扫描的前置步骤。迁移说明见 docs/legacy-cli-migration.md。
make test
make lint端到端测试脚本:
.venv/bin/python scripts/e2e_url_scan.pyGarden 当前未声明开源许可证。复用或分发前请先联系仓库所有者。