# Kylin AuditLog - 法律合规文档

## 一、适用法律法规

### 1.1 《中华人民共和国网络安全法》(2017.6.1)

| 条款 | 要求 | 合规要点 |
|------|------|----------|
| 第二十一条 | 采取监测、记录网络运行状态、网络安全事件的技术措施，并按照规定留存相关的网络日志不少于六个月 | 审计日志保留期 >= 180 天，clean 命令强制最小保留 180 天 |
| 第四十二条 | 网络运营者不得泄露、篡改、毁损其收集的个人信息 | 审计日志中不得记录个人敏感信息明文 |

### 1.2 《中华人民共和国个人信息保护法》(2021.11.1)

| 条款 | 要求 | 合规要点 |
|------|------|----------|
| 第六条 | 收集个人信息应当限于实现处理目的的最小范围 | 审计日志仅记录操作行为，不记录无关个人信息 |
| 第二十八条 | 敏感个人信息需单独同意，采取严格保护措施 | 审计日志中禁止记录身份证号、银行卡号、生物识别信息等敏感字段明文 |
| 第四十七条 | 处理目的已实现或保存期限届满时应删除 | 日志清理命令需能彻底删除到期数据 |

### 1.3 《中华人民共和国数据安全法》(2021.9.1)

| 条款 | 要求 | 合规要点 |
|------|------|----------|
| 第二十一条 | 建立数据分类分级保护制度 | 审计日志数据应标记为"一般数据"或"重要数据" |
| 第二十七条 | 开展数据处理活动应加强风险监测 | 审计日志系统需具备异常检测能力 |

### 1.4 等保 2.0 (GB/T 22239-2019)

| 控制点 | 要求 | 合规要点 |
|------|------|----------|
| 安全审计 (8.1.4.6) | 应启用安全审计功能，审计覆盖到每个用户，对重要的用户行为和重要安全事件进行审计 | 审计日志需覆盖所有 CRUD 操作、登录登出、权限变更、配置修改 |
| 审计记录保护 (8.1.4.6) | 应对审计记录进行保护，定期备份，避免受到未预期的删除、修改或覆盖 | 审计日志表设置不可篡改，禁止 updating/deleting 事件 |
| 审计记录留存 (8.1.4.6) | 审计记录应至少保存 6 个月 | 默认保留期 >= 180 天 |

### 1.5 《信息安全技术 个人信息安全规范》(GB/T 35273-2020)

| 条款 | 要求 | 合规要点 |
|------|------|----------|
| 7.2 | 个人信息访问控制 | 审计日志查看权限需基于 RBAC 角色控制 |
| 7.5 | 个人信息安全审计 | 审计日志本身的操作（查看、导出）也需被审计记录 |

### 1.6 《网络数据安全管理条例》(2025.1.1)

| 条款 | 要求 | 合规要点 |
|------|------|----------|
| 第十二条 | 网络数据处理者应当建立数据安全审计制度 | 审计日志需记录数据访问、修改、删除等操作 |
| 第二十一条 | 重要数据的处理者应当每年开展数据安全风险评估 | 审计日志需支持风险评估报告导出 |

---

## 二、行业规范

### 2.1 通用软件行业

- 依据 **《软件产品管理办法》**，软件开发需具备完整的操作日志功能
- 审计日志应覆盖：CRUD 操作、登录登出、权限变更、配置修改
- 审计日志应记录：操作人、操作时间、操作类型、操作对象、变更内容、IP 地址、User-Agent

### 2.2 企业级 SaaS 产品

- 依据 **《云计算服务安全评估办法》**（2019），云服务商需提供安全审计能力
- 多租户场景下，审计日志需严格隔离，不可跨租户访问
- 审计日志需支持按租户、时间范围、操作类型、操作人等维度查询

### 2.3 金融行业补充规范

- 依据 **《金融数据安全 数据安全分级指南》(JR/T 0197-2020)**，审计日志属于"重要数据"
- 审计日志需保留至少 3 年（金融行业要求高于等保）
- 审计日志需定期备份，备份数据需加密存储

---

## 三、合规检查清单

### 3.1 日志保留期

- [x] 默认日志保留时长 >= 180 天（6 个月，配置 `keep_days = 365`）
- [x] 提供可配置的保留期选项（`keep_days`）
- [x] 清理命令强制最小保留 180 天，不可低于法律要求（`CleanAuditLogCommand`）
- [x] 清理命令支持 `--force` 生产环境确认

### 3.2 敏感信息防护

- [x] 日志属性中不记录密码、身份证号、银行卡号等敏感字段明文
- [x] 提供敏感字段过滤/脱敏机制（`sensitive_fields` 配置 20+ 字段）
- [x] 自动脱敏在写入前执行，确保数据不入库（`Auditable` trait 写入前调用 `redactSensitiveFields()`）
- [x] 日志描述（description）中不包含个人敏感信息

### 3.3 防篡改机制

- [x] 审计日志表启用不可篡改保护（`immutable` 配置，默认 true）
- [x] 审计日志记录不可被普通用户更新或删除（`booted()` 拦截 updating/deleting）
- [x] 清理操作需特权权限，且使用 `forceDelete()` 绕过防篡改（`AuditLogService::clean()`）

### 3.4 访问控制

- [x] 审计日志查看需基于 RBAC 权限（`AuditLogPolicy` 继承 `CrudPolicy`）
- [x] 审计日志查看行为本身需被记录（`AuditLogViewAudit` Trait）
- [x] 审计日志导出需权限控制（`AuditLogController` 附加 `authorize()`）

### 3.5 数据隔离

- [x] 多租户场景下审计日志需按租户隔离（`multi_tenant` 配置）
- [x] 审计日志查询需限制在当前租户范围内（`AuditLogService::list()` 自动过滤）
- [x] 迁移文件需包含 `tenant_id` 字段

### 3.6 审计覆盖范围

- [x] 覆盖模型创建（create）操作（`Auditable` trait）
- [x] 覆盖模型更新（update）操作，记录变更前后值（`Auditable` trait）
- [x] 覆盖模型删除（delete）操作（`Auditable` trait）
- [x] 支持排除特定事件类型（`exclude_events` 配置）
- [x] 支持排除特定模型（`exclude_models` 配置）

---

## 四、代码检测报告

### 4.1 检测结果

| 检测项 | 状态 | 说明 |
|------|------|------|
| 默认保留期 >= 180天 | ✅ 已通过 | 配置 `keep_days = 365` |
| 敏感字段过滤 | ✅ 已通过 | 配置 `sensitive_fields` 含 20+ 敏感字段，`AuditLog::redactSensitiveFields()` 实现脱敏 |
| 日志防篡改 | ✅ 已通过 | `immutable = true`，`booted()` 拦截 updating/deleting |
| 审计覆盖范围 | ✅ 已通过 | `Auditable` trait 检查 `exclude_events` 和 `exclude_models` 配置 |
| 敏感字段自动脱敏 | ✅ 已通过 | `Auditable` trait 写入前调用 `redactSensitiveFields()` |
| 日志清理合规 | ✅ 已通过 | `AuditLogService::clean()` 强制最小 180 天保留，使用 `forceDelete()` |
| 多租户隔离 | ✅ 已通过 | 迁移文件含 `tenant_id` 字段 + 索引，`AuditLogService` 查询时自动隔离 |
| 清理 Artisan 命令 | ✅ 已修复 | 新增 `audit:clean` 命令 |
| 日志查看权限 | ✅ 已修复 | `AuditLogPolicy` 继承 `CrudPolicy`，`AuditLogController` 各方法已添加 `$this->authorize()` |
| 日志查看审计 | ✅ 已修复 | `AuditLogViewAudit` Trait 提供日志查看审计能力，`AuditLogController` 查看/清理操作均写入审计日志 |

### 4.2 修复明细

1. **config/kylin-audit-log.php** — 配置已包含 `keep_days`、`sensitive_fields`、`immutable`、`multi_tenant` 等合规配置项
2. **Models/AuditLog.php** — 已实现 `booted()` 防篡改事件、`redactSensitiveFields()` 敏感信息脱敏
3. **Traits/Auditable.php** — 修复：写入前调用 `redactSensitiveFields()` 脱敏、检查 `exclude_events` 和 `exclude_models` 配置
4. **Services/AuditLogService.php** — 修复：`clean()` 强制最小保留 180 天，使用 `forceDelete()` 绕过防篡改
5. **database/migrations/** — 修复：迁移文件添加 `tenant_id` 字段

---

## 五、免责声明

本扩展包在代码层面实现了审计日志的合规基础能力，但不构成法律建议。使用方应：

1. 根据自身行业要求调整日志保留期（金融行业建议 >= 3 年）
2. 定期备份审计日志数据，备份数据需加密存储
3. 在业务层实现 RBAC 权限控制，确保审计日志仅授权人员可查看
4. 咨询专业法律顾问，确保系统整体合规