TITeee/heretix-management
GitHub: TITeee/heretix-management
基于Next.js的软件资产漏洞管理控制台,支持CVE追踪、EPSS/KEV enrichment和告警生命周期管理。
Stars: 0 | Forks: 0
# heretix-management
一个漏洞管理控制台,用于导入由 [heretix-cli](../heretix-cli) 收集的服务器软件包信息,并利用 heretix-api 检测、跟踪和管理漏洞。
[日本語版 README](./README.ja.md)
## 技术栈
| 角色 | 技术 |
|---|---|
| 框架 | Next.js 16 (App Router) |
| 语言 | TypeScript |
| UI | Tailwind CSS + shadcn/ui (base-ui) |
| 图表 | Recharts |
| 表格 | TanStack Table |
| 认证 | Auth.js v5 (NextAuth) — Credentials Provider |
| ORM | Prisma 7 |
| 数据库 | PostgreSQL |
| 包管理器 | pnpm |
## 功能特性
- **仪表盘** — 双标签页布局:概览 / 标签
- **概览** — 资产与警报总数、严重等级摘要、标签严重等级甜甜圈图(生产环境 / 开发环境 / 预发布环境及颜色指示器)、8周警报趋势、Top 10 漏洞资产与软件包、KEV (Known Exploited Vulnerabilities) 高亮
- **标签** — 与标签关联的软件包和资产卡片,按严重等级进行颜色编码。严重软件包卡片(点击跳转至警报列表),生产环境 / 开发环境 / 预发布环境资产卡片(带有 Host / Docker Image 图标,点击跳转至警报列表)
- **资产管理** — 导入 `inventory.json`(增量更新)、资产列表及详情视图、编辑与删除
- **手动资产注册** — 通过 GUI 直接注册网络设备和防火墙
- **手动软件包管理** — 添加、编辑和删除在包管理器之外安装的软件。Advisory 标签页支持通过下拉菜单选择 Fortinet 和 Palo Alto Networks 的产品
- **软件包变更历史** — 在导入时查看每个资产的软件包新增/更新/移除历史
- **漏洞扫描** — 通过 heretix-api 批量搜索检测漏洞并记录警报(仅创建新警报;不更新或自动解决现有警报)
- **警报管理** — 状态跟踪(Open / In Progress / Resolved / Ignored)、筛选器(资产 / 状态 / 严重等级,多值)、通过复选框选择进行批量状态更新
- **自动解决警报** — 当软件包在导入期间升级时,自动将旧版本的警报标记为 Resolved
- **警报元数据刷新** — 从 heretix-api 重新获取所有 Open/In Progress 警报的最新 CVSS 分数、严重等级、EPSS 和 KEV 数据(不创建新警报)
- **刷新运行日志** — 仅在发生更改时记录执行历史。通过警报页面上的 **View History** 按钮查看运行时间戳、更新计数及前后详情
- **警报详情面板** — 点击行可打开侧滑面板,包含概览(基本信息、备注、解决原因)、NVD 标签页(CVSS 详情、CWE、CISA KEV、参考链接)、OSV 标签页(描述、受影响版本、参考资料)和时间线标签页(响应历史)
- **警报时间线** — 自动在时间线标签页中记录检测、状态变更、备注保存、CVSS 分数变更、严重等级变更及 KEV 新增
- **漏洞搜索** — 直接通过软件包名称、版本和 ecosystem 进行搜索
- **用户管理** — 添加、编辑和删除用户(仅限管理员角色)
- **设置** — 配置 heretix-api URL 和 API token,连接测试
- **定时任务** — 服务器启动时,node-cron 注册每日任务:刷新元数据(默认 12:00 UTC)→ 为所有资产运行扫描(默认 13:00 UTC)。可通过 `CRON_REFRESH` / `CRON_SCAN` 环境变量覆盖
- **结构化日志** — 扫描进度(开始、完成、失败)和认证事件(登录成功/失败)以 JSON 格式记录到 stdout。在 Docker 部署中使用 `docker logs` 收集
## 设置
### 前置条件
- Node.js 20+
- pnpm
- PostgreSQL(已创建 `heretix_management` 数据库)
- [heretix-api](../heretix-api) 正在运行(默认:`http://localhost:5000`)
### 环境变量
创建 `.env.local`:
```
DATABASE_URL="postgresql://postgres:password@localhost:5432/heretix_management?schema=public"
AUTH_SECRET="your-secret-key"
AUTH_URL="http://localhost:3000"
# heretix-api URL 和 token 也可以通过 UI 中的 Settings 页面进行配置
HERETIX_API_URL="http://localhost:5000"
HERETIX_API_KEY="your-api-token"
# Scheduled job 时间(cron 语法,UTC)。默认值:refresh 12:00,scan 13:00
CRON_REFRESH="0 12 * * *"
CRON_SCAN="0 13 * * *"
```
### 安装与运行
```
# 安装 dependencies
pnpm install
# 生成 Prisma client
pnpm exec prisma generate
# 应用 DB schema
pnpm exec prisma db push
# 创建 admin 用户(仅限首次)
pnpm seed
# 默认值:admin@example.com / changeme
# 自定义:SEED_EMAIL=you@example.com SEED_PASSWORD=yourpass pnpm seed
# 启动开发服务器
pnpm dev
```
打开 `http://localhost:3000` 并登录。
## Docker 部署
### 前置条件
- Docker
- Docker Compose
### 设置
在项目根目录创建 `.env`:
```
# 必需
AUTH_SECRET="your-secret-key" # Generate with: openssl rand -base64 32
AUTH_URL="http://your-server-ip:3000" # Set to the actual server IP/domain
POSTGRES_PASSWORD="changeme"
# 可选(也可以通过 Settings 页面设置)
HERETIX_API_URL="http://localhost:5000"
HERETIX_API_KEY=""
# Scheduled jobs(cron 语法,UTC)。默认值:refresh 12:00,scan 13:00
CRON_REFRESH="0 12 * * *"
CRON_SCAN="0 13 * * *"
```
### 构建并运行
```
docker compose build
docker compose up -d
docker compose logs -f app
```
数据库迁移将在容器启动时自动应用。
### 初始设置(仅限首次)
```
# 创建 admin 用户
docker compose exec app node_modules/.bin/tsx prisma/seed.ts
# 默认值:admin@example.com / changeme
# 自定义:SEED_EMAIL=you@example.com SEED_PASSWORD=yourpass docker compose exec app node_modules/.bin/tsx prisma/seed.ts
```
### 常用命令
```
# 停止
docker compose down
# 停止并删除 database volume(完全重置)
docker compose down -v
# 查看日志
docker compose logs -f app
```
## 使用说明
### 1. 注册资产
**服务器与虚拟机(通过 heretix-cli):**
1. 在侧边栏前往 **Assets** → **Import inventory.json**
2. 上传由 heretix-cli 生成的 `inventory.json`
3. 软件包以增量方式导入(重新导入时仅处理新增、更新和移除)
4. 重新导入时会保留手动添加的软件包
**网络设备与防火墙(手动注册):**
1. 在侧边栏前往 **Assets** → **Add Manually**
2. 输入名称、主机名和类型,然后点击 **Create Asset**
3. 在资产详情页面,点击 **Add Package** → **Advisory tab**
- 从下拉菜单中选择供应商(Fortinet / Palo Alto Networks)和产品,然后输入版本
4. 点击 **Run Scan** 检测漏洞(使用 heretix-api Vendor Advisory 数据)
5. 固件升级后,点击软件包上的 **Edit** 更改版本并重新扫描
### 2. 添加手动软件包
1. 在资产详情页面的软件包表右上角点击 **Add Package**
2. 选择一个标签页并填写详情:
- **General** — 软件包名称、版本和 ecosystem(Linux, npm, PyPI 等)
- **Advisory** — 从下拉菜单中选择供应商(Fortinet / Palo Alto Networks)和产品,输入版本(用于网络设备和防火墙)
- **CPE** — 直接输入 CPE 2.3 字符串
3. 带有 `manual` 标记的软件包可以编辑或删除
4. 点击警报列中的标记可跳转至该软件包的警报列表
### 3. 漏洞扫描
1. 打开资产详情页面
2. 点击 **Run Scan**
3. heretix-api 检查所有软件包(包括手动添加的)并生成警报
### 4. 管理警报
1. 在侧边栏的 **Alerts** 下查看警报列表
2. 使用 **filters**(资产 / 状态 / 严重等级)缩小结果范围(支持多值)
3. 通过复选框选择多个警报 → 可进行批量状态更新
4. 点击警报行以打开详情面板:
- **Overview** 标签页 — 基本信息、状态变更、备注、自动解决原因
- **NVD** 标签页 — CVSS 详细分数、CWE、CISA KEV 信息、参考链接
- **OSV** 标签页 — 描述、受影响版本、参考链接
5. 通过更改状态跟踪进度:`Open` → `In Progress` → `Resolved` / `Ignored`
6. 点击 **Refresh Metadata** 从 heretix-api 同步最新数据
### 5. 漏洞搜索
使用侧边栏中的 **Search** 直接通过软件包名称、版本和 ecosystem 进行搜索。
## 目录结构
```
heretix-management/
├── app/
│ ├── (console)/ # Authenticated console screens
│ │ ├── layout.tsx # Sidebar + topbar
│ │ ├── page.tsx # Dashboard (Overview / Tags tabs)
│ │ ├── assets/ # Asset list, detail, import, manual registration
│ │ ├── alerts/ # Alert list
│ │ ├── users/ # User management (admin only)
│ │ ├── search/ # Vulnerability search
│ │ └── settings/ # Settings
│ ├── api/ # API routes
│ │ ├── assets/
│ │ ├── alerts/
│ │ ├── users/
│ │ ├── search/
│ │ └── settings/
│ └── login/ # Login page
├── components/
│ ├── ui/ # shadcn/ui components (including severity-badge)
│ ├── layout/ # Sidebar & topbar
│ ├── data-table/ # Shared DataTable & facet filters
│ ├── dashboard/ # Dashboard chart components (critical-packages-card, production-assets-card, etc.)
│ └── assets/ # Asset column definitions
├── instrumentation.ts # Initializes scheduler on server start
├── lib/
│ ├── auth.ts # Auth.js configuration
│ ├── db.ts # Prisma client
│ ├── severity.ts # Severity & status color constants and helpers
│ ├── heretix-api.ts # heretix-api client
│ ├── logger.ts # Structured JSON log utility
│ ├── scan.ts # Scan logic (shared by route handler & scheduler)
│ ├── refresh.ts # Metadata refresh logic (shared)
│ └── scheduler.ts # node-cron schedule definitions
├── prisma/
│ ├── schema.prisma
│ └── seed.ts
└── middleware.ts # Auth guard
```
## API 端点
| 方法 | 路径 | 描述 |
|---|---|---|
| GET | `/api/assets` | 列出资产 |
| POST | `/api/assets` | 创建/更新资产 (inventory.json 增量导入) |
| GET | `/api/assets/[id]` | 资产详情 |
| PATCH | `/api/assets/[id]` | 更新资产信息 (name / hostname / osName / osVersionId) |
| DELETE | `/api/assets/[id]` | 删除资产 |
| POST | `/api/assets/[id]/scan` | 运行漏洞扫描 |
| POST | `/api/assets/[id]/packages` | 添加手动软件包 |
| PATCH | `/api/assets/[id]/packages/[pkgId]` | 编辑手动软件包 |
| DELETE | `/api/assets/[id]/packages/[pkgId]` | 删除手动软件包 |
| GET | `/api/alerts` | 列出警报 |
| PATCH | `/api/alerts/[id]` | 更新警报状态 / 备注 |
| GET | `/api/alerts/[id]/events` | 列出警报事件历史 |
| POST | `/api/alerts/refresh` | 从 heretix-api 批量刷新警报元数据 |
| GET | `/api/alerts/refresh-log` | 列出刷新元数据运行历史 |
| GET | `/api/search` | 漏洞搜索 (heretix-api 代理) |
| GET | `/api/settings` | 获取设置 |
| PATCH | `/api/settings` | 更新设置 |
| POST | `/api/settings/test` | 测试 heretix-api 连接性 |
| GET | `/api/users` | 列出用户(仅限管理员) |
| POST | `/api/users` | 创建用户(仅限管理员) |
| PATCH | `/api/users/[id]` | 更新用户(仅限管理员) |
| DELETE | `/api/users/[id]` | 删除用户(仅限管理员) |
标签:CISA项目, CVE追踪, EPSS评分, GPT, IT资产管理, KEV已知被利用漏洞, NVD集成, OSV数据库, PostgreSQL, Prisma, SBOM, SecOps, shadcn/ui, Tailwind CSS, TypeScript, Web报告查看器, 云安全架构, 安全仪表盘, 安全合规, 安全插件, 安全运营, 扫描框架, 无线安全, 测试用例, 漏洞管理, 硬件无关, 网络代理, 网络安全, 网络安全审计, 网络设备管理, 自动化攻击, 请求拦截, 资产安全管理, 跌倒检测, 软件物料清单, 防火墙管理, 隐私保护