# 资产管理

[English](../en-US/asset-management.md)

资产管理用于将手工录入、网络空间测绘搜索、HTTP API 和 Agent 任务中发现的域名、IP、端口与服务统一归档，形成可持续维护的资产基线。它关注三个问题：当前拥有哪些资产、哪些资产已经检查、风险集中在哪里。

> 资产管理面向安全测试和攻击面治理，不替代完整的企业 CMDB。仅可录入和扫描自有系统或已获得明确授权的目标。

## 功能概览

资产管理包含三个主要入口：

- **资产概览**：统计资产总量、IP、域名、端口、近期变化、扫描覆盖率和协议分布。
- **资产库**：维护资产身份、服务信息、来源、标签、项目归属、责任与业务属性、扫描记录和风险状态。
- **信息收集**：查询 FOFA、ZoomEye、Quake 或 Shodan，并将确认归属的结果单条或批量写入资产库。

资产可以进一步发起单目标分析或批量扫描。Agent 保存漏洞并完成扫描回写后，资产列表会同步展示相关漏洞数量、风险等级和最近扫描时间。

概览支持切换最近 7、30 或 90 天，展示新增/停用资产趋势、漏洞发现趋势（含严重和高危）、扫描覆盖率、30 天内覆盖率、从未扫描与过期资产数量，以及协议 Top 8 分布。所有统计均受当前用户的资产访问范围约束。

## 资产字段

每条资产可记录：

- Host、IP、域名、端口和协议；
- 页面标题、服务或产品指纹；
- 国家/地区、省份/州和城市；
- 负责人、部门、业务系统、环境和重要性；
- 来源、来源查询条件和标签；
- 活跃或停用状态；
- 所属项目和所有者；
- 首次发现、最近发现、创建和更新时间；
- 最近扫描时间及关联的对话、任务队列和子任务；
- 相关漏洞数量和当前风险等级。

至少需要提供 `host`、`ip` 或 `domain` 中的一项。

## 建立资产基线

### 手工新增

进入 **资产管理 → 资产库**，点击 **新增资产**。常见目标格式包括：

```text
https://example.com:8443
example.com
192.0.2.10:443
[2001:db8::1]:443
```

系统会尽量识别 URL、域名、IP、端口和协议。保存前可继续补充项目、标签、标题、服务指纹、地理位置、负责人、部门、业务系统、环境、重要性和状态。

### 从表格批量导入

进入 **资产管理 → 资产库**，点击 **批量导入**：

1. 下载 XLSX（推荐）或 CSV 模板。
2. 在 `Assets` 工作表中填写资产；不要修改表头。
3. 上传文件，或将文件拖入上传区域。
4. 查看逐行校验结果。文件内重复、格式错误和无权访问的项目会标为错误。
5. 点击 **导入有效数据**。错误行不会提交，预览超过 100 行时只展示前 100 行，但提交会处理全部有效行。
6. 根据提示核对新增、更新和跳过数量。

模板字段：

| 字段 | 必填 | 说明 |
| --- | --- | --- |
| `target` | 条件必填 | URL、域名、IPv4、IPv6 或带端口目标；当 `host`、`ip`、`domain` 均为空时必填 |
| `project` | 否 | 已有项目的精确名称或项目 ID；留空表示不绑定 |
| `tags` | 否 | 逗号、中文逗号、分号或竖线分隔；最多 30 个，单个最多 64 个字符 |
| `host` | 条件必填 | 完整 URL 或 Host；可与 `target` 配合补充 |
| `ip` | 条件必填 | 合法 IPv4 或 IPv6 |
| `domain` | 条件必填 | 合法域名，国际化域名会规范化 |
| `port` | 否 | `0-65535`；留空时可从 `target` 推断 |
| `protocol` | 否 | 如 `http`、`https`、`ssh`；留空时可从 URL 或常用端口推断 |
| `title` | 否 | 页面标题，最多 500 个字符 |
| `server` | 否 | 服务或产品指纹 |
| `country` / `province` / `city` | 否 | 地理归属信息 |
| `responsible_person` | 否 | 负责人，最多 255 个字符 |
| `department` | 否 | 责任部门，最多 255 个字符 |
| `business_system` | 否 | 所属业务系统，最多 255 个字符 |
| `environment` | 否 | `production`、`staging`、`testing`、`development` 或 `other` |
| `criticality` | 否 | `critical`、`high`、`medium` 或 `low` |
| `status` | 否 | `active` 或 `inactive`，也接受“活跃”“停用”；默认 `active` |

表头同时识别模板中的英文字段和常用中文别名；环境和重要性也接受模板列中对应的中文值。为避免不同系统导出的列名产生歧义，自动化流程仍建议使用模板中的英文表头和枚举值。

限制与处理规则：

- 单个 XLSX/CSV 文件最多 100000 行、100 MB。
- `/api/assets/import` 单次请求最多 100000 条资产。
- 文件内相同“目标 + 端口 + 协议”的后续行会标记为重复，不会提交。
- Web 端负责文件解析、预览和即时格式提示；服务端仍会执行权限检查、字段校验、规范化、去重和事务写入。
- 已存在的资产会合并本次提供的非空字段并更新最近发现时间；不会创建重复记录。
- 批量导入需要 `asset:write` 权限。填写项目时，当前用户还必须有权访问该项目。
- 不建议取消服务端条数上限。更大规模的数据应拆分文件并在低峰期导入。

### 从网络空间测绘搜索导入

1. 在配置文件或 **系统设置 → 资产管理** 中填写对应 API Key，也可使用环境变量：`FOFA_API_KEY`、`ZOOMEYE_API_KEY`、`QUAKE_API_KEY`、`SHODAN_API_KEY`。
2. 进入 **资产管理 → 信息收集**。
3. 选择数据源：FOFA、ZoomEye、Quake 或 Shodan。
4. 输入或生成该数据源的查询语句，并确认查询范围。
5. 执行查询，选择确认归属的结果后点击 **入库所选**。
6. 根据返回的新增、更新和跳过数量检查导入结果。

外部搜索结果不等同于自有资产。建议先通过组织域名、证书、网段或产品指纹缩小范围，确认授权后再入库。

## 规范化与去重

不同入口可能使用不同形式描述同一目标。系统会执行以下处理：

- 去除字段首尾空白；
- IP、域名和协议转为小写；
- 从 URL 型 Host 提取 hostname、协议和端口；
- 为未显式指定端口的 HTTP/HTTPS 补充默认端口；
- 将国际化域名转换为 ASCII/Punycode；
- 清理并去重标签；
- 为缺失的状态和来源补充默认值。

资产以“目标 + 端口 + 协议”作为服务级去重依据。目标优先采用域名，其次为 IP，最后为 Host。因此，同一主机的 `80/http` 和 `443/https` 会被视为不同资产。

重复资产再次入库时，系统会更新本次提供的非空字段和最近发现时间，保留未提供的原有信息，不会重置首次发现时间。

## 查询、筛选与视图

Web 端的关键字搜索覆盖 Host、IP、域名、标题、服务、标签、负责人、部门和业务系统。常用筛选包括状态和项目；展开高级筛选后还可以组合：

- 风险等级和最少漏洞数；
- 协议、端口、来源和精确标签；
- 已扫描、从未扫描，以及 30/60/90 天未扫描；
- 国家/地区、省份/州、城市、负责人、部门和业务系统；
- 环境、重要性、首次发现和最近发现日期范围；
- 最近发现、最近扫描、风险、漏洞数、首次发现、目标名称或端口排序。

按最近扫描时间升序排列时，从未扫描的资产优先显示，便于识别覆盖盲区。

常用筛选组合可以保存为筛选视图。筛选视图保存在当前浏览器的 `localStorage` 中，不会同步到服务端、其他浏览器或其他用户。

HTTP API 和 `query_assets` 还支持 `max_vulnerabilities`、最近扫描时间范围，以及创建/更新时间等白名单排序字段。HTTP 列表每页最多 100 条，Agent 查询每页最多 50 条。

## 批量维护与导出

选择资产后，可以对当前页执行操作，也可以选择当前筛选条件命中的全部结果。跨页选择由服务端重新解析当前筛选条件，最多返回 10000 条；超过上限时需要进一步缩小范围。

可用操作：

- **绑定项目**：为所选资产统一替换项目归属；
- **批量编辑**：修改状态、负责人、部门、业务系统、环境和重要性，并增删标签；
- **创建扫描任务 / 发送到对话**：复用同一提示词模板处理所选资产；
- **导出 CSV / XLSX**：在浏览器中导出当前已选择的资产，包含责任属性、风险、漏洞数量和时间字段；
- **合并重复资产**：保留第一个所选资产为主资产，以其他记录的非空字段补齐主资产并合并标签；
- **批量删除**：永久删除所选资产。

批量编辑、项目绑定和批量删除采用全有或全无的事务：只要其中一个资产不存在或超出调用者权限，整批操作就会失败，不会留下部分更新。

合并仅适用于具有共同域名、IP 或 Host 的记录，每次可选择 2-100 条。主资产已有值优先，标签取并集且仍受 30 个标签限制，其余记录会被删除。该操作同时需要 `asset:write` 和 `asset:delete`；合并前应确认主资产选择以及需要保留的扫描历史。

## 扫描与风险回写

### 单资产扫描

在资产列表中点击 **扫描**。系统会：

1. 创建新对话并注入资产目标和资产 ID；
2. 将对话与资产关联；
3. 引导 Agent 检查暴露服务和授权范围内的安全风险；
4. 使用 `record_vulnerability` 保存确认的问题；
5. 使用 `complete_asset_scan` 回写扫描状态。

扫描提示词支持 `{{asset_id}}`、`{{target}}`、`{{host}}`、`{{ip}}`、`{{domain}}` 和 `{{port}}` 变量。发起前应按授权范围调整测试强度、端口和验证方式。

### 批量扫描

在资产库中选择多个目标后，点击 **创建扫描任务**。系统会为每个资产创建独立子任务，并建立资产、队列和子任务之间的关联。

当前默认使用手动调度、单并发和 Eino 单 Agent 模式，以减少对目标和本机资源的瞬时压力。执行前仍需确认测试窗口、请求频率、允许的验证方式和审批要求。

### 风险计算

资产风险根据最近一次关联扫描中的未关闭漏洞动态计算：

- `critical`、`high`、`medium`、`low`、`info`：存在对应等级的未关闭漏洞；
- `normal`：已扫描且没有开放风险；
- `unassessed`：尚未完成扫描。

已修复、误报或忽略的漏洞仍保留在历史数量中，但不会继续提高当前风险等级。

## Agent 工具

系统向 Agent 提供六个内置资产工具：

- `create_asset`：新增资产或去重更新；
- `get_asset`：按 ID 获取完整详情；
- `query_assets`：分页、筛选和排序；
- `update_asset`：局部更新；
- `delete_asset`：删除资产；
- `complete_asset_scan`：扫描完成后回写状态。

`query_assets` 默认每页返回 20 条、最多 50 条摘要。需要完整信息时使用 `get_asset`，避免大量资产数据占用模型上下文。

`create_asset` 和 `update_asset` 均支持责任与业务属性；`query_assets` 也可以按这些字段筛选。Agent 写入仍经过与 HTTP API 相同的规范化、字段校验、去重和权限检查。

## 权限控制

资产权限分为：

- `asset:read`：查看资产和统计数据；
- `asset:write`：创建、导入、修改和回写扫描；
- `asset:delete`：删除资产。

服务端会同时检查资产所有者、显式资源授权、所属项目及权限 Scope（`all`、`assigned`、`own`）。当对话绑定项目后，Agent 的资产查询会被限制在该项目内，工具参数不能扩大访问范围。

资产批量接口限制：

- `POST /api/assets/import`：单次最多 100000 条；
- `GET /api/assets/selection`：最多解析 10000 条匹配资产；
- `POST /api/assets/scan-links`：单次最多 10000 条；
- `PUT /api/assets/bulk`：单次最多 10000 个资产 ID；
- `PUT /api/assets/project-binding`：单次最多 10000 个资产 ID；
- `POST /api/assets/batch-delete`：单次最多 10000 个资产 ID；
- `POST /api/assets/merge`：单次合并 2-100 个资产 ID。

## 推荐使用流程

1. 划定一组明确授权的域名、IP 或网段。
2. 手工加入少量核心目标，验证识别和去重结果。
3. 使用标签区分生产、测试、核心业务和外网范围。
4. 配置一个或多个网络空间测绘搜索引擎，从窄查询开始并确认资产归属。
5. 对单个低风险目标测试扫描和漏洞回写流程。
6. 使用“从未扫描”和“超过 30 天未扫描”筛选覆盖盲区。
7. 确认流程稳定后，再逐步创建小规模批量任务。

经过确认的小规模资产基线通常比来源混乱的全量清单更有价值。
