安全加固
安全加固(自托管)
面向运维:私有图、反代、对象存储、机审旁路。仓库完整清单见 docs/security-hardening.md 与 SECURITY.md。
威胁模型(短)
| 资产 | 典型风险 |
|---|---|
公开图 key(/i/{key}) | 枚举困难(随机 key)但不是秘密能力 |
| 私有图 | 应用校验属主;对象存储不得匿名可读 |
| 待审 / 拒审 | 非属主应得占位,勿暴露原对象 |
| 管理会话 / SMTP / 机审密钥 | 会话或 DB 失陷 |
对象存储(必做)
- 关闭匿名
GetObject、ListBucket。 - 不要让公开 CDN 在无签名情况下提供
private/*。 - 优先独立桶或 IAM:仅 imgli 进程可读私有键。
- 日志/Issue 勿粘贴完整私有预签名 URL。
应用层已有纵深:
- 对象键
public/vsprivate/前缀 - CDN 302 从不给 private 键拼公开 CDN URL
- 私有:短 TTL 预签名或经应用流式输出
应用门禁必要但不充分——桶世界可读时仍会泄露。
探测
./scripts/probe-private-object-anon.sh 'https://your-bucket-or-cdn/private/.../object.ext'
期望非 2xx。
Checklist
-
桶私有;
private/无公共 ACL -
无开放
ListBucket - CDN 仅卸公开流量(或签名 CDN)
-
CDN 源站不能匿名吐
private/* - 部署后跑 probe 脚本
- 预签名 TTL 保持短;不缓存签名 URL
- DB + 对象备份均有访问控制
反代
- TLS 终止在反代
IMGLI_TRUST_PROXY=true仅当反代可信(限速与审计 IP 依赖)- OCR / NSFW 旁路:IP 白名单 + Bearer(见
deploy/ocr-paddle/)
内容安全
- fail-open vs fail-closed 是策略选择
- 待审图不可被游客热链(应用门禁);对象层仍要锁死
漏洞报告
请用 GitHub private security advisory,不要开公开 Issue。