背景
随着阿里云、腾讯云等云服务平台的兴起,现代应用系统越来越依赖云服务进行构建,其中图片等文件存储也有云服务商提供产品,如阿里云的OSS。基于这些产品实现系统的文件等资源存储访问特别方便,但方便的同时,我们如果保护自己的文件安全呢?
这里的安全,我们不讨论云服务厂商私用我们文件资源的情况,因为我们使用这些云厂商产品,就是选择相信他们,而信任也是云厂商生存的根本,不会有人自绝其根。
我们主要讨论的是,在我们暴露这些资源给外部访问时,如何保护资源不会被其他人爬取而泄露关键数据如用户隐私,对我们产品造成严重影响。
常见对象存储产品访问方式
云厂商对象存储产品通常会提供“私传公访”、“私传私访”这样两种文件资源上传和访问方式。
“私传”即需要用户名和密码,验明身份才能上传文件,这个没啥问题。
“公访”即获得文件url后,直接浏览器打开就可以访问,不需要再验明身份。
“私访”即和上传一样,提供用户名和密码验明身份后才能访问文件。
存在的问题
“私传公访”这种形式,访问简单,程序上传完存储文件名就不用管了。
好多程序员偷懒可能采用这种方式,但它可能导致系统资源泄露。比如文件名采用时间戳格式生成,有人拿到一个“公访”的文件地址,推断出地址的生成方式,然后遍历所有可能文件地址,就会爬取到所有的文件。
解决方案
方案一,还是采用“私传公访”方式,但文件名要不可推断。
比如文件采用uuid生成。这种方案能一定程度上防止资源被爬取,但不能保证100%安全,所以只有在确实不能采用“方案二”情况下才有限使用。
方案二,采用“私传私访”方式,提供专门的地址或服务来给外部系统访问文件资源。
这种方案可以确保资源不被推测文件名方式爬取,而且是自己实现的接口,可以检测异常,增加更多访问控制。