Files
im_server/docs/third/IM-文件安全第三方接入记录.md
T

162 lines
6.3 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.
# IM 文件安全第三方接入记录
更新时间:2026-08-23
## 1. 接入范围
本次记录三条文件与安全链路:
1. 阿里云 OSS:用于文件对象存储和签名下载,media handler 标识为 `oss`。
2. 阿里云内容安全增强版:用于文件内容审核,当前 provider 标识为 `aliyun_green`,任务类型为 `content`。
3. 阿里云云安全中心恶意文件检测:用于病毒、木马、WebShell、勒索等恶意文件检测,当前 provider 标识为 `aliyun_sas`,任务类型为 `malware`。
密钥、账号、Bucket 等敏感信息不写入本文档,也不写入源码。运行环境应通过配置中心或部署环境注入。
## 2. 阿里云 OSS 接入
新增媒体 handler:`server/media/oss`。
当前支持:
- `Upload`:上传文件到 OSS Bucket,并把 OSS object key 写入 `FileDef.Location`。
- `Headers`:对 GET/HEAD 生成 OSS 签名 URL,并返回 `308 Permanent Redirect`。
- `Delete`:按 object key 批量删除 OSS 对象。
- `GetIdFromUrl`:从 Tinode 文件 URL 中解析文件 ID。
对象路径规则:
```text
tenants/{tenantID}/{yyyy}/{mm}/{fileID}
```
配置字段:
| 字段 | 说明 |
| --- | --- |
| `access_key_id` | 阿里云 AccessKey ID,部署环境注入 |
| `access_key_secret` | 阿里云 AccessKey Secret,部署环境注入 |
| `endpoint` | OSS 普通 Bucket endpoint |
| `bucket` | OSS Bucket 名称 |
| `region_id` | OSS Bucket 所属地域 |
| `serve_url` | Tinode 对外文件 URL 前缀,默认 `/v0/file/s/` |
| `presign_ttl` | 签名 URL 有效秒数,默认 `120` |
| `cache_control` | 下载缓存头 |
| `cors_origins` | CORS 允许来源 |
| `verify_bucket` | 启动时是否联网校验 Bucket 存在 |
| `use_sys_config` | 为 `true` 时从 `hotgo.hg_sys_config` 读取 OSS 配置 |
当前 `server/tinode.conf` 仍默认使用 `fs`。切换 OSS 时,将 `media.use_handler` 改为 `oss`,并在 `media.handlers.oss` 中设置 `use_sys_config=true` 后,运行时会从后台库 `hotgo.hg_sys_config` 的 `im_third_party` 分组读取 OSS 配置。
代码入口:
- Handler 实现:`server/media/oss/oss.go`
- 后台配置读取:`store.ThirdPartyConfig.Get("im_third_party", ...)`
- Handler 注册:`server/main.go`
- 单元测试:`server/media/oss/oss_tenant_test.go`
注意事项:
- 不使用 AccessPoint endpoint,当前按普通 Bucket endpoint 接入。
- 不在源码或文档中保存真实 AK/SK。
- 下载链路采用签名 URL 重定向,不由 Tinode 代理大文件内容。
## 3. 数据库状态机
新增租户业务库表:`im_file_review_tasks`。
独立租户库方案下,该表不包含 `tenant_id`。每个租户库保存本租户自己的文件审核任务。
核心字段:
| 字段 | 说明 |
| --- | --- |
| `task_id` | 服务端生成的审核任务 ID |
| `file_id` | 对应 `im_fileuploads.id` |
| `user_id` | 上传用户 |
| `task_type` | `content` 或 `malware` |
| `provider` | `aliyun_green` 或 `aliyun_sas` |
| `object_name` | OSS 对象名快照 |
| `mime_type` | 文件 MIME 快照 |
| `file_size` | 文件大小快照 |
| `provider_task_id` | 第三方返回的任务 ID |
| `status` | `pending`、`running`、`clean`、`risky`、`failed` |
| `risk_level` | 第三方风险等级 |
| `risk_labels` | 命中的风险标签 JSON |
| `result_json` | 第三方原始结果 JSON |
| `attempts` / `next_retry_at` | 重试控制 |
| `completed_at` | 审核完成时间 |
唯一约束:
- `task_id` 全局唯一。
- `file_id + task_type + provider` 唯一,避免同一文件重复创建同类任务。
## 4. 当前代码入口
文件上传完成后,在数据库事务内自动创建审核任务:
- 普通/独立库路径:`server/db/mysql/adapter.go` 的 `FileFinishUpload`
- 共享库兼容路径:`server/db/mysql/tenant_adapter.go` 的 `TenantFileFinishUpload`
- 建表逻辑:`server/db/mysql/file_review_schema.go`
- 任务插入:`server/db/mysql/file_review_tasks.go`
- 状态常量和结构:`server/store/types/safety.go`
当前策略是异步审核:上传成功后先生成 `pending` 任务,不阻塞上传响应。
## 5. 阿里云内容安全接入
新增封装包:`server/filesafety/aliyun`。
当前支持:
- `SubmitOSSFile`:提交同账号 OSS 文件审核任务。
- `PollOSSFile`:轮询文件审核结果。
- 默认服务:`document_detection`。
- 支持参数:`ossBucketName`、`ossObjectName`、`ossRegionId`、`dataId`。
文件安全配置通过 `server/filesafety.LoadConfig` 从后台库 `hotgo.hg_sys_config` 的 `im_third_party` 分组读取。内容安全启用后,`server/filesafety.NewGreenClientFromConfig` 可直接构建阿里云内容安全客户端;恶意文件检测当前先落配置和任务状态,具体云安全中心 API worker 后续补充。
结果映射:
| 阿里云风险等级 | 内部状态 |
| --- | --- |
| 空 | `running` |
| `none` / `low` | `clean` |
| 其他风险等级 | `risky` |
后续 worker 需要读取 `provider=aliyun_green,status=pending/running` 的任务,调用提交和轮询接口,并回写 `provider_task_id/status/risk_level/risk_labels/result_json`。
## 6. 阿里云恶意文件检测接入
当前已完成状态机和任务落库,上传成功会创建:
- `task_type=malware`
- `provider=aliyun_sas`
- `status=pending`
后续还需要补云安全中心恶意文件检测 SDK/HTTP client,并实现 worker 提交、轮询和结果映射。
建议映射:
| 三方结果 | 内部状态 |
| --- | --- |
| 未完成 / 排队中 | `running` |
| 无风险 | `clean` |
| 命中恶意类型 | `risky` |
| 调用失败且可重试 | `pending`,更新 `attempts/next_retry_at` |
| 调用失败且不可重试 | `failed` |
## 7. 本地库变更
已在本地 `tinode` 业务库创建并更新 `im_file_review_tasks` 表。
后续新库或已有库启动时,会通过 MySQL adapter 的 ensure 流程自动补表。
## 8. 后续待办
1. 实现文件安全 worker:批量领取 `pending` 任务、提交第三方、轮询结果、回写状态。
2. 接入阿里云云安全中心恶意文件检测 client。
3. 增加审核策略:是否阻断下载、是否只告警、是否对高风险文件自动下架。
4. 在文件下载授权处读取审核结果,按策略限制 `risky/failed/running` 文件访问。
5. 增加后台查询与人工处置接口,用于查看任务、重试、放行、下架。