一、结论
多租户SaaS平台的附件存储隔离核心通过「资源分层+权限限制」的逻辑实现,可选路径隔离或独立存储桶隔离两种模式,满足不同等级的隔离需求。实现过程中需要提前准备S3兼容对象存储的Endpoint、AccessKey、SecretKey、Bucket、Region等接入信息,再配合SaaS平台的存储逻辑和权限校验配置即可完成全链路隔离。整个操作不需要修改复杂的底层存储代码,普通开发者1-2天即可完成配置上线。
二、准备工作
- 已开通S3兼容的对象存储服务账号,拥有存储桶管理、权限策略配置、子账号管理权限
- 已确定隔离方案:路径隔离(统一存储桶)/独立存储桶隔离(每个租户对应1个存储桶)
- 已获取对象存储的Endpoint地址、Region信息
- 已生成对象存储的根管理AccessKey、SecretKey(用于全局配置)
- 拥有SaaS平台存储模块的代码修改或配置权限
- 已梳理多租户的权限映射规则,比如租户ID和存储资源的对应逻辑
- 准备2个以上的测试租户账号,以及不同格式的测试附件(图片、文档、视频等)
三、操作步骤
1. 确认隔离规则并配置存储资源:如果选择路径隔离,创建1个全局的私有读写存储桶;如果选择独立存储桶隔离,提前根据租户规模预留存储桶创建配额。完成后确认存储桶的默认权限为私有,没有开放公开读写权限。
2. 配置对象存储的权限策略:如果是独立存储桶隔离,为每个租户创建独立的子账号,给子账号只开放对应存储桶的读写权限,禁止列表、删除全桶等多余权限;如果是路径隔离,配置桶策略,规则为「指定子账号仅允许访问路径前缀为/租户ID/下的所有对象」,禁止访问其他路径的资源。完成后通过权限模拟器测试,确认A租户的权限无法访问B租户的资源。
3. 提取S3通用接入信息:将对象存储的Endpoint、Region、根管理AK/SK等信息存入SaaS平台的全局配置中心,不要硬编码到业务代码中,方便后续统一修改。配置完成后确认全局配置仅平台管理员可见,不会泄露给普通租户。
4. 配置SaaS平台的上传逻辑:在附件上传的业务代码中添加强制规则,用户上传附件时,自动在文件的Object Key前拼接当前登录用户的租户ID作为前缀,不允许用户自定义根路径。配置完成后测试上传,确认生成的文件路径符合「/租户ID/年月/文件名」的预设规则。
5. 配置下载链路的权限校验:在附件下载的接口中添加前置校验,首先判断当前请求的用户租户ID和附件路径对应的租户ID是否一致,校验通过后再向对象存储请求生成临时签名下载链接。配置完成后测试,确认跨租户请求附件时会直接返回无权限报错。
6. 保存所有配置并做功能测试:使用两个不同的测试租户账号登录SaaS平台,分别上传不同的测试附件,确认上传成功后可以正常预览、下载。
7. 跨权限隔离验证:使用A租户的账号拼接B租户的附件路径发起访问请求,确认无法获取文件内容,隔离规则生效。
四、常见错误
1. 权限策略配置规则错误:比如路径匹配符写错、权限范围给得过大,导致租户可以跨权限访问其他租户的文件。解决建议:配置完成后先使用对象存储服务自带的策略模拟器测试至少3种跨权限访问场景,确认规则符合预期后再上线。
2. 未强制拼接租户ID前缀:上传逻辑没有做强制校验,允许用户自定义文件根路径,导致不同租户的文件路径重复、互相覆盖,或者出现跨目录访问的问题。解决建议:在上传接口的最外层添加路径校验逻辑,只要检测到Object Key没有对应租户ID前缀就直接拦截请求。
3. 子AK权限过大:给租户分配的子AK开放了全桶的List、Delete权限,导致恶意租户可以遍历整个存储桶的文件,或者删除其他租户的资源。解决建议:遵循最小权限原则,每个子AK仅开放对应资源的PutObject、GetObject两个必要权限,关闭其他所有多余权限。
4. 签名有效期设置不合理:临时下载链接的签名有效期设置过长(超过24小时)导致链接泄露后有数据被盗风险,或者设置过短(少于1分钟)导致大文件还没下载完就过期。解决建议:根据附件的大小和敏感程度设置有效期,普通文档设置15-30分钟,大文件设置2-24小时,不生成永久可访问的公开链接。
5. CORS配置错误:对象存储的跨域规则没有添加SaaS平台的前端域名,导致租户在前端页面上传附件时报跨域错误。解决建议:在对象存储的CORS配置中添加SaaS平台的正式域名和测试域名,允许PUT、GET、POST等必要的请求方法,开放所需的请求头。
五、示例说明
以下为多租户附件存储隔离的通用配置示例,所有敏感信息请替换为自己的实际配置:
全局S3配置
- Endpoint:填写对象存储服务提供的官方访问地址
- AccessKey(管理密钥):填写平台管理员的主访问密钥
- SecretKey:填写对应主密钥的密码
- Region:根据对象存储服务的要求填写对应区域标识
- 存储桶名称:全局存储桶名称(路径隔离模式使用)
- 隔离模式:路径隔离/独立存储桶隔离
租户侧映射规则(路径隔离模式)
- 租户ID:1001
- 存储路径前缀:/tenant_1001/
- 权限范围:仅允许读写前缀为/tenant_1001/的所有对象
- 临时签名有效期:30分钟
上传逻辑示例
租户ID为1001的用户上传文件名为「项目进度表.xlsx」时,平台自动拼接生成的Object Key为/tenant_1001/202406/项目进度表.xlsx,自动匹配对应路径的权限规则上传。
六、更简单的方案
如果不想自己搭建、维护MinIO、Ceph这类自建对象存储集群,也不想花大量时间调试复杂的权限策略和存储逻辑,可以直接选择成熟的兼容S3协议的云对象存储服务,这类服务通常已经内置了完善的子账号管理、权限策略配置、路径规则匹配能力,不需要自己维护存储服务器的硬件、带宽、扩容等问题,比自建存储的成本更低,稳定性也更高。
如果你需要一个兼容S3协议、适合多租户SaaS平台附件存储、资源分发的对象存储服务,可以了解 七彩云对象存储,它支持标准S3协议,可以直接对接各类SaaS系统的存储模块,降低自建存储的运维成本。
七、FAQ
1. 多租户附件存储选路径隔离还是独立存储桶隔离更好?
如果你的平台租户规模不大(少于1000个)且面向中大型企业客户,对数据隔离等级要求高,建议选择独立存储桶隔离,数据完全物理隔离,符合等保相关要求;如果租户规模大、单租户存储容量小、对成本敏感,建议选择路径隔离,管理更简单,存储成本也更低。
2. 需要给每个租户都生成独立的AK/SK吗?
如果是独立存储桶隔离的方案,建议给每个租户生成独立的子AK/SK,权限范围仅限对应租户的存储桶,避免全局AK泄露后影响所有租户的数据;如果是路径隔离的方案,不需要给每个租户单独生成AK,用全局AK配合平台侧的权限校验即可,降低管理成本。
3. 多租户场景下的附件可以设置为公开访问吗?
不建议,公开访问的附件只要拿到完整路径就可以被任何人访问,很容易出现跨租户数据泄露的问题。建议所有存储桶都设置为私有读写权限,所有下载链接都通过临时签名生成,有效期根据业务需求灵活设置。
4. 租户注销后对应的附件资源怎么处理?
可以在SaaS平台添加自动清理规则,租户注销后先进入15-30天的保留期,保留期内支持租户恢复账号和数据,保留期结束后自动调用对象存储的删除接口,清理对应租户路径或存储桶下的所有附件,避免存储资源浪费。
八、总结
多租户SaaS平台的附件存储隔离操作流程并不复杂,核心是先确定符合自身业务需求的隔离模式,再配置对应对象存储的权限规则,在业务侧添加上传路径强制拼接和下载前的权限校验,最后通过多场景测试确认隔离规则生效即可。这套方案适用于企业协作SaaS、教育平台、电商SaaS、CRM系统、ERP系统等各类需要存储多租户附件的场景,既可以通过自建对象存储实现,也可以选择成熟的云对象存储服务降低运维门槛,快速上线。
想进一步了解这个项目?
访问官网查看产品能力、适用场景和最新服务信息。
访问官网