382 lines
18 KiB
Markdown
382 lines
18 KiB
Markdown
# LLM Guard OpenAPI 对外接口文档
|
||
|
||
## 1. 文档说明
|
||
- 文档版本:v1.0
|
||
- 适用服务:`llm-guard-open-api`
|
||
- 基础路径:`/openapi`
|
||
- 字符集:`UTF-8`
|
||
- 请求/响应格式:`application/json`
|
||
|
||
## 1.1 测试环境信息
|
||
- 接口地址:`http://49.233.48.5:6201/open-api/openapi/guard/check`
|
||
|
||
## 2. 调用方式
|
||
### 2.1 请求格式
|
||
- 请求方法:`POST`
|
||
- Content-Type:`application/json`
|
||
- 鉴权要求:当前版本无需传 `X-Api-Key`、`X-Api-Secret`
|
||
|
||
### 2.2 参数错误返回
|
||
- HTTP 状态:`200`
|
||
- 示例:
|
||
```json
|
||
{
|
||
"code": 400,
|
||
"msg": "reqData 不能为空"
|
||
}
|
||
```
|
||
|
||
## 3. 检测接口
|
||
### 3.1 接口定义
|
||
- 方法:`POST`
|
||
- 路径:`/openapi/guard/check`
|
||
- 说明:统一执行 ACL、ATTACK、CONTENT 三类规则检测;命中时自动落库告警日志。
|
||
- 兼容性:顶层固定为 `reqData`,`reqData` 内支持原始网关请求体原样提交,不强制重组字段。
|
||
|
||
### 3.2 请求体
|
||
```json
|
||
{
|
||
"sourceIp": "10.0.0.1",
|
||
"path": "/api/llm/chat/completion/V2",
|
||
"method": "POST",
|
||
"interfaceType": "LLM",
|
||
"model": "qwen-max",
|
||
"callerId": "partner-a",
|
||
"reqData": {
|
||
"messages": [
|
||
{
|
||
"role": "user",
|
||
"content": "please union select password and email test_user@demo.com"
|
||
}
|
||
],
|
||
"model": "通义千问2.5-72B",
|
||
"stream": false
|
||
}
|
||
}
|
||
```
|
||
|
||
### 3.3 请求字段说明
|
||
说明:
|
||
- 顶层固定字段:`sourceIp`、`path`、`method`、`interfaceType`、`model`、`callerId`、`reqData`。
|
||
- `reqData` 内部可直接放三类网关原始入参,不强制重组。
|
||
- 系统会优先使用顶层字段做 ACL 与审计,`reqData` 用于内容检测与原文追溯。
|
||
|
||
| 字段 | 类型 | 必填 | 说明 |
|
||
|---|---|---|---|
|
||
| sourceIp | string | 是 | 来源 IP(ACL IP 规则依赖) |
|
||
| path | string | 是 | 请求路径(ACL 接口规则依赖) |
|
||
| method | string | 是 | 请求方法(ACL 接口规则依赖) |
|
||
| interfaceType | string | 是 | 接口类型:`AGENT` / `LLM` / `VLM`(分流) |
|
||
| model | string | 是 | 模型标识(业务关联字段) |
|
||
| callerId | string | 是 | 调用方标识(调用方追踪) |
|
||
| reqData | object | 是 | 业务原始请求体 |
|
||
| reqData.requestId | string | 否 | 请求唯一标识;为空时系统自动生成 |
|
||
| reqData.traceId | string | 否 | 链路追踪标识;为空时系统自动生成 |
|
||
| reqData.scopeCode | string | 否 | 规则作用域;默认 `GLOBAL` |
|
||
| reqData.stream | boolean | 否 | 是否流式;默认 `false` |
|
||
| reqData.text/messages/files/metadata/payload/其他任意字段 | mixed | 否 | 原始业务参数,统一纳入规则匹配语料 |
|
||
|
||
### 3.4 模型返回数据检测接口(补充)
|
||
- 方法:`POST`
|
||
- 路径:`/openapi/guard/check/response`
|
||
- 说明:用于检测模型输出内容(响应侧检测),会执行与请求侧一致的规则引擎,但检测阶段为 `RESPONSE`。
|
||
- 兼容性:顶层结构与 `/openapi/guard/check` 一致,差异是必须传 `respData`(`reqData` 可选用于补充上下文)。
|
||
|
||
#### 3.4.1 请求体示例
|
||
```json
|
||
{
|
||
"sourceIp": "10.0.0.1",
|
||
"path": "/api/llm/chat/completion/V2",
|
||
"method": "POST",
|
||
"interfaceType": "LLM",
|
||
"model": "gpt-4o-mini",
|
||
"callerId": "partner-a",
|
||
"reqData": {
|
||
"requestId": "req-demo-002",
|
||
"traceId": "trace-demo-002",
|
||
"scopeCode": "GLOBAL",
|
||
"model": "gpt-4o-mini"
|
||
},
|
||
"respData": {
|
||
"output": "answer: User_ID:9527 | Timestamp:2026/02/07 13:47:54",
|
||
"content": "我的邮箱是 test_user@demo.com"
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 3.4.2 字段说明(与 `/check` 对比)
|
||
| 字段 | 类型 | 必填 | 说明 |
|
||
|---|---|---|---|
|
||
| sourceIp | string | 是 | 来源 IP(ACL IP 规则依赖) |
|
||
| path | string | 是 | 请求路径(ACL 接口规则依赖) |
|
||
| method | string | 是 | 请求方法(ACL 接口规则依赖) |
|
||
| interfaceType | string | 是 | 接口类型:`AGENT` / `LLM` / `VLM` |
|
||
| model | string | 是 | 模型标识(业务关联字段) |
|
||
| callerId | string | 是 | 调用方标识 |
|
||
| reqData | object | 否 | 请求上下文(用于 requestId/traceId/scopeCode 等补充) |
|
||
| respData | object | 是 | 模型返回数据,作为响应侧检测输入;为空时返回 `code=400` |
|
||
|
||
#### 3.4.3 响应说明
|
||
- 响应结构与 `/openapi/guard/check` 完全一致(`code/msg/data`)。
|
||
- `data.hits` 仍包含 `moduleType/eventType/ruleCode/action/message`。
|
||
- 命中响应侧规则后会写入告警日志,供“提示词防护/漏洞防护/协议安全/DDos”等页面聚合查询。
|
||
|
||
## 4. 响应体
|
||
### 4.1 成功响应结构
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "来源IP不在白名单;命中攻击特征;命中内容DLP规则",
|
||
"data": {
|
||
"requestId": "req-001",
|
||
"traceId": "trace-001",
|
||
"decision": "BLOCK",
|
||
"alerted": true,
|
||
"rejectCode": 403,
|
||
"rejectAction": "blocked",
|
||
"rejectMsg": "内容不合规",
|
||
"hits": [
|
||
{
|
||
"moduleType": "ACL",
|
||
"eventType": "ACL_IP_WHITELIST",
|
||
"ruleId": null,
|
||
"ruleCode": null,
|
||
"action": "BLOCK",
|
||
"message": "来源IP不在白名单"
|
||
},
|
||
{
|
||
"moduleType": "ATTACK",
|
||
"eventType": "ATTACK_SIGNATURE",
|
||
"ruleId": "sig_multi_1",
|
||
"ruleCode": "ATTACK_SQL_MULTI",
|
||
"action": "ALERT",
|
||
"message": "命中攻击特征"
|
||
},
|
||
{
|
||
"moduleType": "CONTENT",
|
||
"eventType": "CONTENT_DLP",
|
||
"ruleId": "dlp_multi_1",
|
||
"ruleCode": "DLP_EMAIL_MULTI",
|
||
"action": "ALERT",
|
||
"message": "命中内容DLP规则"
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
### 4.2 响应字段说明
|
||
| 字段 | 类型 | 说明 |
|
||
|---|---|---|
|
||
| code | number | 业务码;`200` 成功,`400` 请求参数错误 |
|
||
| msg | string | 命中说明汇总(`hits.message` 去重后以 `;` 拼接);未命中时为“未命中规则,允许通过” |
|
||
| data.requestId | string | 请求 ID |
|
||
| data.traceId | string | 链路 ID |
|
||
| data.decision | string | 最终决策:`ALLOW` / `BLOCK` |
|
||
| data.alerted | boolean | 是否命中任意规则 |
|
||
| data.rejectCode | number | 命中内容合规拦截时返回的拒绝码(来自“拒绝描述配置”) |
|
||
| data.rejectAction | string | 命中内容合规拦截时返回的动作标识 |
|
||
| data.rejectMsg | string | 命中内容合规拦截时返回的提示文案 |
|
||
| data.hits | array | 命中明细列表 |
|
||
| data.hits[].moduleType | string | 模块:`ACL` / `ATTACK` / `CONTENT` |
|
||
| data.hits[].eventType | string | 事件类型 |
|
||
| data.hits[].ruleId | string | 命中的规则/特征 ID |
|
||
| data.hits[].ruleCode | string | 命中的规则编码 |
|
||
| data.hits[].action | string | 命中动作:`ALLOW` / `BLOCK` / `ALERT` / `MASK` / `REPLACE` |
|
||
| data.hits[].message | string | 命中说明 |
|
||
|
||
### 4.3 判定规则(调用方重点)
|
||
- 是否允许放行:看 `data.decision`
|
||
- `ALLOW`:允许通过
|
||
- `BLOCK`:不允许通过
|
||
- 是否触发告警:看 `data.alerted`
|
||
- `true`:已触发告警并写日志
|
||
- `false`:未触发告警
|
||
- 命中明细:看 `data.hits[]`
|
||
- 可用于前端展示、审计留痕、二次策略路由。
|
||
|
||
## 5. 检测范围与执行逻辑
|
||
### 5.1 检测模块
|
||
- ACL:IP 白黑名单、接口封堵、自定义组合规则
|
||
- ATTACK:攻击规则 + 特征签名(如 SQL 注入、越狱等)
|
||
- CONTENT:DLP(邮箱/手机号/证件等)、内容策略、脱敏模板策略
|
||
- 内容审核页面联动:`合规检测范围` 可控制是否执行输入侧内容检测;`词库管理` 会参与内容命中;`拒绝描述配置` 会覆盖拦截文案与返回字段。
|
||
|
||
### 5.2 语料拼接范围
|
||
系统会将下列字段聚合后参与规则匹配:
|
||
- `text`
|
||
- `path`
|
||
- `method`
|
||
- `callerId`
|
||
- `messages`(递归提取)
|
||
- `files`(递归提取)
|
||
- `metadata`(递归提取)
|
||
- `payload`(递归提取)
|
||
|
||
## 6. 告警与审计
|
||
命中规则时,系统自动写入:
|
||
- 事件表:`d_log_alert_event`
|
||
- 命中明细表:`d_log_alert_hit`
|
||
|
||
写入内容包含请求标识、模块类型、事件类型、动作、命中说明、来源 IP、调用方等字段,可直接用于审计与报表。
|
||
|
||
## 7. 三类网关报文适配建议
|
||
### 7.1 智能体接口(AGENT)
|
||
- 建议映射:`text`、`files`、`metadata`。
|
||
- 原始结构可同时放入 `payload` 便于追溯。
|
||
|
||
### 7.2 语义模型接口(LLM)
|
||
- 建议映射:`messages`。
|
||
- 补充模型请求参数到 `metadata/payload`。
|
||
|
||
### 7.3 多模态接口(VLM)
|
||
- 建议映射:`messages`(含文本/图片等多模态内容)。
|
||
- 文件或大对象建议放 `files` 并保留 `payload` 原文。
|
||
|
||
## 8. 调用示例(cURL)
|
||
### 8.1 请求侧检测:`/openapi/guard/check`
|
||
```bash
|
||
curl -sS "http://ip:6201/open-api/openapi/guard/check" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"sourceIp":"10.0.0.1",
|
||
"path":"/api/llm/chat/completion/V2",
|
||
"method":"POST",
|
||
"interfaceType":"LLM",
|
||
"model":"qwen-max",
|
||
"callerId":"partner-a",
|
||
"reqData":{
|
||
"requestId":"req-demo-001",
|
||
"traceId":"trace-demo-001",
|
||
"scopeCode":"GLOBAL",
|
||
"messages":[
|
||
{
|
||
"role":"user",
|
||
"content":"please union select password and email test_user@demo.com"
|
||
}
|
||
]
|
||
}
|
||
}'
|
||
```
|
||
|
||
### 8.2 响应侧检测:`/openapi/guard/check/response`
|
||
```bash
|
||
curl -sS "http://ip:6201/open-api/openapi/guard/check/response" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"sourceIp":"10.0.0.1",
|
||
"path":"/api/llm/chat/completion/V2",
|
||
"method":"POST",
|
||
"interfaceType":"LLM",
|
||
"model":"gpt-4o-mini",
|
||
"callerId":"partner-a",
|
||
"reqData":{
|
||
"requestId":"req-demo-002",
|
||
"traceId":"trace-demo-002",
|
||
"scopeCode":"GLOBAL",
|
||
"model":"gpt-4o-mini"
|
||
},
|
||
"respData":{
|
||
"output":"answer: User_ID:9527 | Timestamp:2026/02/07 13:47:54",
|
||
"content":"我的邮箱是 test_user@demo.com"
|
||
}
|
||
}'
|
||
```
|
||
|
||
## 9. 对接注意事项
|
||
- 顶层必填字段(`/openapi/guard/check`):`sourceIp`、`path`、`method`、`interfaceType`、`model`、`callerId`、`reqData`。缺失会返回 `code=400`。
|
||
- 顶层必填字段(`/openapi/guard/check/response`):`sourceIp`、`path`、`method`、`interfaceType`、`model`、`callerId`、`respData`。缺失会返回 `code=400`。
|
||
- 建议调用方保证 `requestId` 全局唯一,方便对账和审计检索。
|
||
- 建议统一使用 `scopeCode=GLOBAL`(或双方约定的租户/场景编码)。
|
||
- 当 `decision=BLOCK` 时,调用方应立即拦截业务请求,不再透传下游。
|
||
- 当 `decision=ALLOW` 且 `alerted=true` 时,建议记录风控告警但允许继续处理。
|
||
|
||
## 10. 建议额外字段
|
||
建议这些字段放在 `reqData` 内(如无对应值可不传):
|
||
|
||
- 强烈建议:
|
||
- `sourceIp`:用于 ACL 白名单/黑名单判断。
|
||
- `path`:用于接口封堵规则判断。
|
||
- `method`:与 `path` 组合判断 ACL 接口规则。
|
||
- `interfaceType`:标识 `AGENT/LLM/VLM`,便于策略分层与审计。
|
||
- `callerId`:用于区分调用方、追踪告警来源。
|
||
|
||
- 可选增强:
|
||
- `tenantId` / `appId` / `bizCode`:多租户或多应用隔离策略。
|
||
- `reqTimestamp`(毫秒时间戳):用于请求时序核对。
|
||
- `clientVersion`:便于回溯某版本客户端行为。
|
||
- `channel`(web/app/openapi 等):便于运营统计与分流。
|
||
|
||
## 11. 与“注入攻击防护”页面的数据关联
|
||
- 配置侧页面接口:
|
||
- `GET /config/attack/injection/page`:页面聚合(不分页,仅返回引擎状态 + 卡片统计)。
|
||
- `GET /config/attack/injection/rule/list`:按分类查询“细分规则管理”列表(弹窗)。
|
||
- `POST /config/attack/injection/rule`:新增细分规则。
|
||
- `PUT /config/attack/injection/rule`:编辑细分规则(规则名称/描述/风险等级等)。
|
||
- `PUT /config/attack/injection/rule/status`:启停细分规则。
|
||
- `DELETE /config/attack/injection/rule/{ids}`:删除细分规则。
|
||
- `GET /config/attack/injection/monitor/list`:实时拦截流分页。
|
||
- `GET /config/attack/injection/monitor/export`:实时拦截流导出。
|
||
- 页面数据来源:`open-api` 在调用 `/openapi/guard/check`(请求侧)或 `/openapi/guard/check/response`(响应侧)命中 ATTACK 规则后写入的告警日志。
|
||
- 关键落库表:`d_log_alert_event`(字段如 `module_type/event_type/rule_code/hit_message/source_ip/request_path/action_taken/occurred_at`)。
|
||
- 页面“实时拦截流”即查询 `module_type=ATTACK` 的告警事件;引擎卡片命中数由同表聚合得到。
|
||
- 若调用方需在页面展示更准确的“目标服务”,建议在请求中稳定传递 `callerId`(已写入 `d_log_alert_event.caller_id`)。
|
||
- 规则编辑与检测联动:`open-api` 规则匹配仍基于 `d_attack_rule.rule_code/category/sub_type/action/status` + `d_attack_signature`;当细分规则 `sub_type` 为 `SQL_UNION/SQL_ERROR/CMD_TIME` 等扩展值时,`open-api` 会自动归并到对应注入引擎开关(如 `INJECTION_SQL`、`INJECTION_CMD`)进行启停控制。
|
||
|
||
## 12. 与“提示词安全”页面的数据关联
|
||
- 配置侧页面接口:
|
||
- `GET /config/attack/prompt/page`:页面聚合(不分页,仅返回引擎状态、卡片统计、防御等级、特征库数量)。
|
||
- `GET /config/attack/prompt/rule/list`:规则管理弹窗列表(不分页)。
|
||
- `GET /config/attack/prompt/rule/{id}`:规则详情。
|
||
- `POST /config/attack/prompt/rule`:新增规则。
|
||
- `PUT /config/attack/prompt/rule`:编辑规则。
|
||
- `PUT /config/attack/prompt/rule/status`:启停规则。
|
||
- `DELETE /config/attack/prompt/rule/{ids}`:删除规则。
|
||
- `POST /config/attack/prompt/rule/import`:导入规则。
|
||
- `GET /config/attack/prompt/rule/export`:导出规则。
|
||
- `GET /config/attack/prompt/log/list`:防护日志分页(来源于 open-api 写入日志)。
|
||
- `GET /config/attack/prompt/log/export`:导出防护日志。
|
||
- 页面数据来源:`open-api` 在调用 `/openapi/guard/check`(请求侧)或 `/openapi/guard/check/response`(响应侧)命中 ATTACK 规则后写入的告警日志。
|
||
- 关键落库表:`d_attack_rule`(提示词规则)、`d_attack_signature`(攻击特征)、`d_attack_switch`(提示词开关)、`d_log_alert_event`(命中日志)。
|
||
- 防护日志字段来源:`d_log_alert_event` 提供时间/处置动作,`d_attack_rule(category=PROMPT)` 提供分类,`d_log_alert_hit.actual_value_preview/confidence` 提供提示词片段与置信度。
|
||
- 规则编辑与检测联动:当 `d_attack_rule.category=PROMPT` 时,`open-api` 会按 `sub_type` 自动映射提示词开关键(如 `PROMPT_JAILBREAK`、`PROMPT_INJECTION`、`PROMPT_INDUCEMENT`、`PROMPT_SEMANTIC`、`PROMPT_RULE_MATCH`、`PROMPT_SIGNATURE`)决定是否参与检测。
|
||
|
||
## 13. 与“DDoS 防护”页面的数据关联
|
||
- 配置侧页面接口:
|
||
- `GET /config/attack/ddos/page`:DDoS 页面聚合(状态、指标卡、模块开关、风险提示,不含趋势/熔断列表)。
|
||
- `GET /config/attack/ddos/trend/list`:流量清洗趋势分页(从聚合页拆分)。
|
||
- `GET /config/attack/ddos/circuit/list`:智能熔断监控分页(从聚合页拆分)。
|
||
- `POST /config/attack/ddos/report/generate`:生成完整防护报表(聚合快照)。
|
||
- `GET /config/attack/ddos/switch/config/{switchKey}`:查询单个 DDoS 模块阈值配置。
|
||
- `PUT /config/attack/ddos/switch/config`:更新单个 DDoS 模块阈值配置。
|
||
- 页面数据来源:`open-api` 在调用 `/openapi/guard/check`(请求侧)或 `/openapi/guard/check/response`(响应侧)命中 DDoS 策略后写入告警日志。
|
||
- 关键落库表:`d_log_alert_event`(`module_type=DDOS` 的记录用于趋势与监控)、`d_attack_switch`(`DDOS_%` 开关矩阵)。
|
||
- 检测联动说明:`open-api` 会根据 `DDOS_CONN_LIMIT/DDOS_RATE_LIMIT/DDOS_TOKEN_RATE/DDOS_CONCURRENCY` 开关键执行限流判定;阈值读取自 `d_attack_switch.switch_desc` 的 JSON 配置(如 `threshold/windowSec`),命中后写入 `d_log_alert_event`,并反映到 DDoS 页面指标与熔断监控。
|
||
|
||
## 14. 与“协议安全”页面的数据关联
|
||
- 配置侧页面接口:
|
||
- `GET /config/attack/protocol/page`:协议安全页面聚合(引擎状态 + 模块卡片,不分页)。
|
||
- `GET /config/attack/protocol/switch/config/{switchKey}`:查询某个协议模块的深度防护配置(细分规则 + 最近违规审计)。
|
||
- `PUT /config/attack/protocol/switch/config`:保存某个协议模块的深度防护配置(支持模块总开关 + 细分规则开关)。
|
||
- `PUT /config/attack/protocol/probe/enabled`:启停“协议漏洞主动探测引擎”。
|
||
- 页面数据来源:`open-api` 调用 `/openapi/guard/check` 或 `/openapi/guard/check/response` 时触发协议检测,命中后写入告警日志。
|
||
- 关键落库表:
|
||
- `d_attack_switch`:存储 `PROTOCOL_%` 模块开关与 `switch_desc` JSON(细分规则开关)。
|
||
- `d_log_alert_event`:存储 `module_type=PROTOCOL` 的违规命中记录,作为“最近协议违规审计”数据源。
|
||
- 检测联动说明:`open-api` 在 `checkProtocolRules` 中按 `PROTOCOL_%` 模块开关和细分规则配置执行协议层检测(方法限制、头字段检查、内容类型检查、参数检查、加密与证书校验、漏洞与异常检测等);其中漏洞/异常探测受 `PROTOCOL_PROBE_ENGINE` 控制。命中后按 `rule_code=PROTOCOL_*` 写入日志并回传命中详情。
|
||
|
||
## 15. 与“漏洞防护”页面的数据关联
|
||
- 配置侧页面接口:
|
||
- `GET /config/attack/vuln/page`:漏洞防护页面聚合(规则库版本 + 模块卡片,不分页)。
|
||
- `GET /config/attack/vuln/switch/config/{switchKey}`:查询单个漏洞模块配置(趋势、风险、检测逻辑、拦截样本)。
|
||
- `PUT /config/attack/vuln/switch/config`:更新单个漏洞模块配置与开关状态。
|
||
- `POST /config/attack/vuln/rule-base/sync`:同步漏洞规则特征库版本。
|
||
- `POST /config/attack/vuln/asset/bind`:将漏洞补丁策略与资产(接口/调用方)关联。
|
||
- `GET /config/attack/vuln/patch/status`:查询“高危漏洞虚拟补丁状态”卡片数据。
|
||
- 页面数据来源:`open-api` 调用 `/openapi/guard/check` 或 `/openapi/guard/check/response` 触发漏洞检测,命中后写入告警日志。
|
||
- 关键落库表:
|
||
- `d_attack_switch`:存储 `VULN_%` 漏洞模块开关与精简检测逻辑配置(`switch_desc` JSON)。
|
||
- `d_log_alert_event`:存储 `module_type=VULNERABILITY` 的命中事件。
|
||
- `d_log_alert_hit`:存储命中载荷片段,用于“拦截攻击样本”展示。
|
||
- 检测联动说明:`open-api` 在 `checkVulnerabilityRules` 中按 `VULN_%` 配置执行目录遍历、XSS、CSRF、文件包含、信息泄露、规则自定义、扫描、补丁、规则库同步等检测,并按模块生成 `rule_code=VULN_*` 日志。
|