6.7 KiB
IM 文件安全第三方接入记录
更新时间:2026-08-23
1. 接入范围
本次记录三条文件与安全链路:
- 阿里云 OSS:用于文件对象存储和签名下载,media handler 标识为
oss。 - 阿里云内容安全增强版:用于文件内容审核,当前 provider 标识为
aliyun_green,任务类型为content。 - 阿里云云安全中心恶意文件检测:用于病毒、木马、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。
对象路径规则:
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 配置 |
OSS endpoint 填写 https://oss-cn-shenzhen.aliyuncs.com。IM Server 初始化 OSS handler 时也会给裸域名补 HTTPS,并将阿里云 OSS 的显式 HTTP endpoint 改为 HTTPS。修改后台 im_third_party.oss_endpoint 后需重启 IM Server;发布后用真实文件上传验证 POST /v0/file/u/,确认 Pod 到 OSS 走 443 端口且不再出现 TCP 写超时。若 HTTPS 仍超时,继续检查 Pod 到 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=malwareprovider=aliyun_sasstatus=pending
后续还需要补云安全中心恶意文件检测 SDK/HTTP client,并实现 worker 提交、轮询和结果映射。
建议映射:
| 三方结果 | 内部状态 |
|---|---|
| 未完成 / 排队中 | running |
| 无风险 | clean |
| 命中恶意类型 | risky |
| 调用失败且可重试 | pending,更新 attempts/next_retry_at |
| 调用失败且不可重试 | failed |
7. 本地库变更
已在本地 tinode 业务库创建并更新 im_file_review_tasks 表。
后续新库或已有库启动时,会通过 MySQL adapter 的 ensure 流程自动补表。
8. 后续待办
- 实现文件安全 worker:批量领取
pending任务、提交第三方、轮询结果、回写状态。 - 接入阿里云云安全中心恶意文件检测 client。
- 增加审核策略:是否阻断下载、是否只告警、是否对高风险文件自动下架。
- 在文件下载授权处读取审核结果,按策略限制
risky/failed/running文件访问。 - 增加后台查询与人工处置接口,用于查看任务、重试、放行、下架。