Danube-Labs/javv-poc

GitHub: Danube-Labs/javv-poc

JAVV 是一款 Kubernetes 运行时原生的容器漏洞分诊工具,使用 Trivy 和 Grype 并行扫描集群中实际运行的镜像,提供带有完整审计轨迹的分诊生命周期管理和可视化仪表板。

Stars: 2 | Forks: 0

javv: Just Another Vulnerability Viewer

Release CI License: BSL 1.1 Python 3.12 Vue 3

Kubernetes 运行时原生容器漏洞分诊。
发现集群中实际运行的内容,使用 Trivy 和 Grype 进行并行扫描, 并为每个漏洞提供其自身完全可审计的分诊生命周期: 谁在何时更改了什么的不可变记录。此外,还提供丰富的仪表板、全应用时间旅行以及 一键导出 CSV。而没有完整 ASPM 平台的沉重负担。

仓库地图 · 运行技术栈 · API · 配置 · 架构

JAVV walkthrough: the cluster fleet, a cluster's findings, one CVE with its per-scanner evidence and audit trail, the approval queue, and the audit log

机群 · 单个集群的发现结果 · 单个 CVE、其各扫描器证据及其自身的审计轨迹 · 风险接受队列 · 日志。来自双集群开发环境的真实数据。

## 为什么 漏洞工具分为两个世界:具有死板报告的**分诊工具**(DefectDojo、Dependency-Track),以及没有审计发现概念的**日志分析仪表板**。JAVV 填补了这一缝隙:*兼具*真实的分诊生命周期和探索性仪表板,直接针对您集群中运行的内容。它的三个不同之处: - **扫描正在运行的,而不是注册表。** JAVV 会发现集群中实际部署的镜像并对其进行扫描:也就是您现在所暴露的漏洞,而不是一个目录。 - **两个扫描器,绝不混合。** Trivy 和 Grype 按镜像逐个运行,并排保留。JAVV 绝不会在不同的扫描器中对 CVE 进行去重。相反,它会**标记它们存在分歧的地方**,让您看到单扫描器工具所隐藏的盲区。 - **每个漏洞都是可审计的。** 每个发现都带有其自身不可变的历史记录:一个六状态的分诊生命周期(外加 VEX 和风险接受),每个决策都记录了操作者、内容和时间,此外还有可将每个屏幕回溯到过去任何时间点的**全应用时间旅行**。大多数工具没有审计单个发现的概念;而在这里它是核心。 ## 功能 - **运行时发现**:扫描集群中按 namespace/workload 实时运行的镜像。 - **按扫描器划分,并行对比**:Trivy + Grype 独立保留;分歧会被呈现,绝不被合并抹除。 - **按发现的审计轨迹**:每个漏洞都保留其自身不可变的历史记录,每个分诊操作、决策和注释都记录了操作者、内容和时间,并按因果修订顺序重播。 - **分诊生命周期**:一个六状态机(五个可由操作者设置;`stale` 由过期扫描设置),支持 VEX 导入、风险接受,以及跨扫描器应用的决策。 - **全应用时间旅行**:一个全局选择器可将*每个*屏幕回溯到 ≤ 现在的任何时间点,通过追加日志进行重建。 - **仅追加的审计日志**:不可变,按发现和按用户记录,可导出为 CSV。 - **多租户 + RBAC**:通过不可变的 `cluster_id` 隔离;基于能力的角色,本地认证 + 引导管理员。 - **一切皆在服务端**:每个计数和页面都来自 OpenSearch 聚合,绝不在客户端计算。 - **仪表板和导出**:概览、运行中镜像清单、扫描器状态、贡献者、审批、SLA 跟踪、一键 CSV。 - **数据检查器 + 修复操作**:一个只读的 OpenSearch 控制台和一组经过批准并记录的维护任务。 - **无外部 broker**:协调由 OpenSearch 完成;任务是 Kubernetes CronJobs。没有 Redis/Kafka/RabbitMQ。 ## 架构 ``` Python scanner module (Trivy + Grype adapters, one JAVV-built image per scanner, run as CronJobs) │ push scan envelopes over token-authenticated ingest │ (per-cluster bearer token, scope-bound: a token cannot push another cluster's data) ▼ FastAPI async backend ──► OpenSearch (single store: findings, append logs, audit, config) │ server-side aggregations ▼ Vue 3 frontend (PrimeVue · Pinia · ECharts) ``` 部署目标是 **Helm → k3s**(进行中,M10)。关于各层、数据流和索引模型的完整细节位于 [`docs/engineering/ARCHITECTURE.md`](docs/engineering/ARCHITECTURE.md) 和 [`docs/engineering/INDEX-MAP.md`](docs/engineering/INDEX-MAP.md) 中。 ## 运行它 请按照 **[`development/RUNNING-THE-STACK.md`](development/RUNNING-THE-STACK.md)** (路径 A / B / F)手动启动技术栈(后端 + UI 对接本地 OpenSearch,或者包含真实 Trivy/Grype 扫描实时 k3d 集群的完整端到端路径)。在全新的 Ubuntu 主机上,`bash development/setup/setup-dev.sh` 会首先安装所有先决条件(幂等操作;使用 `preflight.sh` 验证就绪状态)。 ## 文档 **权威工程文档集 ([`docs/engineering/`](docs/engineering/)):** | 文档 | 内容 | |---|---| | [PLAN.md](docs/engineering/PLAN.md) | 决策 (D1–D45)、数据模型、里程碑 (M0–M10) | | [SPEC.md](docs/engineering/SPEC.md) | 功能与非功能需求 (FR/NFR) | | [ARCHITECTURE.md](docs/engineering/ARCHITECTURE.md) | 架构层、数据流、图表 (Mermaid) | | [INDEX-MAP.md](docs/engineering/INDEX-MAP.md) | 每个 OpenSearch 索引及其映射的事实来源 | | [FLOW-EXAMPLE.md](docs/engineering/FLOW-EXAMPLE.md) | 摄取 / 查询 / 时间旅行的操作示例 | | [AUDIT-RESPONSE.md](docs/engineering/AUDIT-RESPONSE.md) | 外部审计发现 → 解决方案 (第 1–4 轮) | **辅助文档:** | 路径 | 内容 | |---|---| | [REPO-MAP.md](REPO-MAP.md) | **仓库地图**:每个文件夹的作用 + 阅读顺序 | | [CONTRIBUTING.md](CONTRIBUTING.md) | 设置、内部约定、PR 必须通过的关卡 | | [SECURITY.md](SECURITY.md) | 如何(私下)报告 JAVV 的漏洞,以及哪些属于范围内 | | [docs/API.md](docs/API.md) | 随产品发布的 HTTP 接口概览(认证机制、能力) | | [docs/CONFIGURATION.md](docs/CONFIGURATION.md) | 每个配置项:默认值、层级、UI 可控性 | | [development/RUNNING-THE-STACK.md](development/RUNNING-THE-STACK.md) | 手动启动技术栈(后端 / 全栈 / 前端) | | [docs/research/](docs/research/) | 技术栈最佳实践、工具/MCP、支持 v4 的审计 | | [design/](design/) | 品牌记录来源(Logo、Token、规范) | ## 技术栈与工具链 Python 3.12 · FastAPI (async) · AsyncOpenSearch · Pydantic v2 · Vue 3 (`