安全与合规
IM PaaS 的安全边界由四件事构成:AppSecret 不出服务端、请求签名防重放、回调验签与幂等、数据最小化与可删除。本页给出当前实现的安全能力、开发红线与上线检查项。
鉴权与签名
| 链路 | 凭据 | 算法 / 窗口 | 红线 |
|---|---|---|---|
| Open API | App-Key + App-Secret | sha1(appSecret + nonce + timestamp);Timestamp ±300000ms;Nonce 8–64 字符且 5 分钟不可重放 | AppSecret 只能存在于业务服务端;禁止下发客户端 |
| 客户端连接 | 用户 JWT(user.token.issue 签发) | 有效期 7 天;封禁/注销用户签发返回 1016 | Token 泄露可吊销/重新签发;不要在多用户间复用 |
| Admin API | X-Admin-Secret | 控制台/运营后台专用 | 仅内网或受控网络暴露;禁止进前端产物 |
| 回调 | secret + HMAC-SHA256 | hex(hmac_sha256(secret, timestamp + '.' + nonce + '.' + rawBody)) 小写 | 必须验签 + 时间戳窗口 + eventId 幂等 |
三条常见安全事故
把 AppSecret 打进 Web/移动端包:任何人都能冒充你的服务端发消息、读用户。
回调不验签:攻击者可直接伪造 message.publish.before 放行或注入事件。
日志里打印完整 Token/Secret:日志系统往往比数据库更容易被导出。
传输与部署
| 项 | 要求 |
|---|---|
| 生产传输 | 对外域名必须 HTTPS/WSS;回调 URL 生产环境强制 https |
| 证书 | 使用受信任 CA;需要固定根证书时参考 根证书与网络安全 |
| 密钥存储 | AppSecret/Admin-Secret/回调 secret 放密钥管理或环境变量;回调 secret 服务端加密存储、读取脱敏(只回末四位) |
| 网络边界 | Admin API 与运维接口不对公网开放;客户端只需 API 域名 + WS 域名 |
| 时间同步 | 服务器 NTP 同步;签名时间戳窗口仅 ±300 秒 |
数据最小化与隐私
| 数据 | 建议 | 依据 |
|---|---|---|
| 消息正文 | 按业务必要保留;敏感字段(身份证、银行卡)不要进消息体 | 消息会落库并可被审计视图查询 |
| 用户资料 | IM 只存 name/avatarUrl 等最小字段;详细资料留在业务库 | 用户信息托管 |
| 设备 token | 只存推送所需 token;注销/换绑及时清理 | 每用户活跃 20 个,软删除保留历史 |
| 日志 | 脱敏手机号/邮箱/Token;限制保留期 | 审计与排障需要,但不能成为泄露源 |
| 删除请求 | 用注销/删除接口 + 业务侧数据清理,双轨执行 | IM 与业务库是两个数据面 |
内容安全
- 敏感词 + 发送前同步回调 + 异步审核任务组成三道闸门,详见 内容审核拦截教程。
- 审核拒绝会标记消息
moderation=blocked并发送message.blocked系统通知;不会从历史中物理删除,合规删除请用message.history.clean/message.history.delete。 - 图片/语音/文件不参与文本敏感词,需要业务侧或同步回调自行审核。
上线安全检查清单
- AppSecret / Admin-Secret 只存在于服务端,已在打包产物、前端源码、日志中检索确认无泄露。
- 所有 Open API 调用使用签名;Nonce 每次随机;服务器时间已同步。
- 回调已启用验签 + 时间戳窗口 + eventId 去重;接收端 5 秒内 ACK。
- 生产回调与 API 全部 HTTPS;证书链正确;必要时配置根证书。
- 管理后台/Admin API 不对公网开放,或经过强制鉴权与 IP 白名单。
- 敏感词、审核回调、封禁/注销流程已演练。
- 日志脱敏规则已生效;数据保留与删除流程有负责人。
- 限频与配额已配置;压测覆盖连接数与消息峰值。