cisd/docs/plans/2026-04-09-operation-audit-log-design.md
2026-04-17 11:20:26 +08:00

377 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 管理员操作审计功能设计
## 1. 目标
统一使用 `tms_operation_audit_log` 记录所有敏感管理员操作,覆盖:
- 登录、登出
- 增删改
- 执行类操作:初始化、重置、升级、回滚、重启、密钥操作
- 非法操作:拒绝访问、权限不足、重放、签名失败等
设计原则:
- 只保留一张日志表
- 敏感操作日志写入失败时,业务直接失败
- 日志在落库前完成 `SM3` 摘要与 `SM2` 签名
- 人工审计字段不参与首签
## 2. 表结构
表名:`tms_operation_audit_log`
```sql
CREATE TABLE IF NOT EXISTS tms_operation_audit_log (
id BIGINT PRIMARY KEY,
log_id VARCHAR(64) NOT NULL COMMENT '日志唯一标识',
operator_role_code VARCHAR(64) NOT NULL COMMENT '操作角色编码',
operator_auth_level VARCHAR(32) NULL COMMENT '操作时认证等级',
module_code VARCHAR(32) NOT NULL COMMENT '业务模块',
action_type VARCHAR(32) NOT NULL COMMENT '操作动作',
remote_ip VARCHAR(64) NULL COMMENT '来源IP',
operation_result VARCHAR(16) NOT NULL COMMENT '操作结果: SUCCESS/FAILED/DENIED',
summary VARCHAR(512) NOT NULL COMMENT '操作摘要',
error_message VARCHAR(1024) NULL COMMENT '失败原因',
audit_status VARCHAR(16) NOT NULL COMMENT '审计状态: PENDING/REVIEWED',
audit_result VARCHAR(16) NULL COMMENT '审计结果: PASS/REJECT/NEED_VERIFY',
audit_comment VARCHAR(1024) NULL COMMENT '审计意见',
audited_by VARCHAR(64) NULL COMMENT '审计人',
audited_at DATETIME(3) NULL COMMENT '审计时间',
payload_hash VARCHAR(128) NOT NULL COMMENT 'SM3摘要',
sign_value TEXT NOT NULL COMMENT 'SM2签名值',
occurred_at DATETIME(3) NOT NULL COMMENT '操作发生时间',
create_time DATETIME(3) NOT NULL COMMENT '落库时间',
UNIQUE KEY uk_tms_operation_audit_log_log_id (log_id),
KEY idx_tms_operation_audit_log_role_code (operator_role_code),
KEY idx_tms_operation_audit_log_module_code (module_code),
KEY idx_tms_operation_audit_log_action_type (action_type),
KEY idx_tms_operation_audit_log_result (operation_result),
KEY idx_tms_operation_audit_log_audit_status (audit_status),
KEY idx_tms_operation_audit_log_occurred_at (occurred_at)
);
```
## 3. 枚举设计
### 3.1 `module_code`
- `AUTH`
- `INIT`
- `UPGRADE`
- `DEVICE`
- `NETWORK`
- `KEY`
- `SYSTEM`
- `SECURITY`
### 3.2 `action_type`
- `LOGIN`
- `LOGOUT`
- `CREATE`
- `UPDATE`
- `DELETE`
- `EXECUTE`
- `RESET`
- `ENABLE`
- `DISABLE`
- `BIND`
- `IMPORT`
- `EXPORT`
- `BACKUP`
- `RECOVER`
- `RESTART`
- `ACCESS`
### 3.3 `operation_result`
- `SUCCESS`
- `FAILED`
- `DENIED`
### 3.4 `audit_status`
- `PENDING`
- `REVIEWED`
### 3.5 `audit_result`
- `PASS`
- `REJECT`
- `NEED_VERIFY`
## 4. 摘要与签名
### 4.1 首签字段
入库前参与 `payload_hash``sign_value` 计算的字段:
- `log_id`
- `operator_role_code`
- `operator_auth_level`
- `module_code`
- `action_type`
- `remote_ip`
- `operation_result`
- `summary`
- `occurred_at`
### 4.2 不参与首签的字段
以下字段属于后续审计动作或补充信息,不参与首签:
- `audit_status`
- `audit_result`
- `audit_comment`
- `audited_by`
- `audited_at`
- `error_message`
### 4.3 规范化串
建议按固定字段顺序拼接:
```text
log_id=...
operator_role_code=...
operator_auth_level=...
module_code=...
action_type=...
remote_ip=...
operation_result=...
summary=...
occurred_at=...
```
规范要求:
- 字段顺序固定
- `null` 统一为空串
- 首尾空格统一裁剪
- 时间统一使用 UTC 与固定格式
### 4.4 签名流程
1. 构造 `canonical_payload`
2. 计算 `payload_hash = SM3(canonical_payload)`
3. 计算 `sign_value = SM2(privateKey, canonical_payload)`
4. 一次性写入数据库
## 5. Java 设计草案
核心对象:
- `OperationAuditLogEntity`
- `OperationAuditLogRepository`
- `OperationAuditService`
- `OperationAuditCommand`
- `OperationAuditSigner`
服务接口建议:
```java
public interface OperationAuditService {
void record(OperationAuditCommand command);
void review(String logId, AuditResult auditResult, String auditComment, String auditedBy);
}
```
`OperationAuditCommand` 建议字段:
- `operatorRoleCode`
- `operatorAuthLevel`
- `moduleCode`
- `actionType`
- `remoteIp`
- `operationResult`
- `summary`
- `errorMessage`
## 6. 日志记录流程
统一入口:`OperationAuditService.record(...)`
处理流程:
1. 业务侧提交 `OperationAuditCommand`
2. 服务补齐:
- `log_id`
- `occurred_at`
- `audit_status = PENDING`
3. 生成 `payload_hash``sign_value`
4. 插入 `tms_operation_audit_log`
5. 若插入失败:
- 对敏感操作直接抛异常,业务失败
## 7. 注解与 AOP 接入方案
### 7.1 注解定义
```java
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AuditedOperation {
String module();
String action();
String summary() default "";
boolean sensitive() default true;
}
```
### 7.2 AOP 职责
切面负责:
- 读取注解元数据
- 从请求上下文提取:
- 当前角色
- 当前认证等级
- 来源 IP
- 环绕执行目标方法
- 成功时记录 `SUCCESS`
- 捕获业务异常时记录 `FAILED`
- 捕获权限或安全拒绝时记录 `DENIED`
-`sensitive = true` 的操作,日志写入失败时重新抛错
### 7.3 设计原则
- AOP 负责公共字段、结果判定和统一落库
- 业务方法负责提供准确的 `summary`
- 不在 AOP 中自动抓取完整请求参数,避免日志带入密码、令牌、密钥材料等敏感数据
## 8. 接口清单
### 8.1 首批需要接入审计的接口
#### 认证与角色管理
- `POST /api/v1/auth/password-login`
- `POST /api/v1/auth/ukey-login`
- `POST /api/v1/auth/logout`
- `POST /api/v1/auth/change-password`
- `POST /api/v1/auth/roles/{roleCode}/enable`
- `POST /api/v1/auth/roles/{roleCode}/reset-password`
- `POST /api/v1/auth/roles/{roleCode}/ukeys/bind`
#### 初始化与重置
- `POST /api/v1/init/tasks`
- `POST /api/v1/init/tasks/{taskId}/execute`
- `POST /api/v1/init/reset/tasks`
- `POST /api/v1/init/reset/tasks/{taskId}/execute`
#### 升级管理
- `POST /api/v1/upgrades`
- `POST /api/v1/upgrades/{taskId}/execute`
- `POST /api/v1/upgrades/{taskId}/rollback`
#### 设备与网络
- `POST /api/v1/device/restart`
- 网络配置写接口
- IP 白名单增删改接口
#### 密钥与密码卡
- LMK / IK / UKey / 密钥导入导出、备份恢复、销毁相关写接口
#### 安全事件
- 认证失败
- 权限不足
- 重放拦截
- 签名校验失败
### 8.2 日志分页查询接口
- `GET /api/v1/audit-logs`
查询条件:
- `operatorRoleCode`
- `moduleCode`
- `actionType`
- `operationResult`
- `auditStatus`
- `auditResult`
- `remoteIp`
- `dateFrom`
- `dateTo`
- `keyword`
默认排序:
- `occurred_at DESC`
### 8.3 日志详情接口
- `GET /api/v1/audit-logs/{logId}`
详情建议返回:
- 基础日志字段
- 审计字段
- `payload_hash`
- `sign_value`
### 8.4 日志审计接口
- `POST /api/v1/audit-logs/{logId}/review`
请求示例:
```json
{
"auditResult": "PASS",
"auditComment": "复核通过"
}
```
更新规则:
- 仅审计管理员可操作
- 仅允许 `PENDING -> REVIEWED`
- 更新字段:
- `audit_status`
- `audit_result`
- `audit_comment`
- `audited_by`
- `audited_at`
## 9. 失败策略
敏感操作统一采用失败关闭:
- 审计日志写入失败,业务直接失败
敏感操作范围包括:
- 登录与登出
- 角色管理
- 口令变更
- UKey 管理
- 初始化与重置
- 升级与回滚
- 网络配置
- 白名单变更
- 密钥与密码卡操作
- 安全拦截事件
## 10. 推荐实现顺序
1. Flyway 建表,删除旧 `tms_auth_audit_log` / `tms_security_event`
2. 增加枚举、Entity、Repository
3. 增加 `OperationAuditSigner`SM3 / SM2
4. 增加 `OperationAuditService`
5. 增加 `@AuditedOperation` 与 AOP
6. 增加分页查询与详情接口
7. 增加审计接口
8. 在首批敏感接口上补齐注解与摘要