文件存储的安全性问题

野火IM的消息加密是非常安全,但文件是属于消息系统之外的而且文件可能更敏感更私密,所以文件的安全性也成了客户担忧的重点。本文将分析一下野火IM试用文件服务的细节及安全防护。

1. 野火IM与文件系统的协同工作

野火IM与文件系统是分开的,互相协助才能发送媒体消息(包括图片/语音/视频/文件及自定义媒体消息)。流程是这样的:

  1. 客户端应用调用协议栈发送媒体消息。
  2. 协议栈检查媒体消息,如果remoteUrl不存在则认为需要上传,准备把localPath中的文件上传到对象存储服务器;如果存在则跳到第7步。
  3. 协议栈调用野火IM服务请求上传令牌。
  4. 野火IM服务收到请求后,根据配置文件中的媒体配置信息调用对应对象存储服务的sdk生成上传令牌并和上传地址返回给客户端协议栈。
  5. 客户端协议栈收到令牌和上传地址后,把文件上传到对象存储服务,并得到一个媒体文件的url。
  6. 协议栈更新消息的remoteUrl,值为上传得到的url。
  7. 协议栈把消息内容打包发送。
  8. 对端收到消息后,使用remoteUrl打开文件。

2. 野火IM支持的媒体方式

  1. 内置测试对象存储服务:这个仅限于开发测试使用,不建议用在生产环境,后面不用考虑此对象存储服务的安全性。
  2. 七牛对象存储服务:社区版客户建议用这个,事实上七牛对象存储服务应该是国内最大的对象存储服务提供商。
  3. 阿里云对象存储服务:仅专业版支持,使用上基本跟七牛一样。
  4. 野火IM私有存储:仅专业版支持,基于Minio二次开发,2/3都是公有云的,使用minio可以做到全部私有部署。

3. 安全问题

3.0.1. 上传加密问题

由于mars不支持标准tls,所以无法用https上传。而七牛/阿里云又都是公有云,所以不支持自定义加密上传。所以七牛/阿里云都是使用http上传的,严格说来存在一定的安全隐患。野火IM私有存储是自己加密数据,不存在安全问题。解决方法是,使用野火IM私有存储或者不使用协议栈上传,自己在应用层使用https上传。

3.0.2. 下载的安全问题。

目前媒体消息的阅读是没有加上鉴权的,所以就要求所有的bucket都是公开的,也就是说上传需要认证,下载是不需要认证的。但也不是那么不安全,首先所有文件名都经过复杂地编码,是不可能被穷举的,这样黑客无法穷举您的文件,只有拿到确切文件名才可以访问。七牛/阿里云/野火IM私有存储都可以使用https下载的,这样可以排除掉网络抓包获取到文件名的可能性。所以对于一般情况下,对象存储服务加上https下载就足够安全 了。

如果还需要进一步加强安全性,可以设置bucket为私有(头像由于被频繁使用,且机密程度比较低,建议不设置),然后客户端打开媒体文件前,先去应用服务获取访问鉴权信息,然后把URL拼接上鉴权信息后去访问文件。我们认为这么做的意义不大,除非您要做访问控制,访问统计一类的功能。

4. 总结

内置测试服务不要生产使用;一般情况下对象存储服务加上https下载就足够安全了;可以设置bucekt为私有,需要额外的开发量,但意义不大。

2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2020-10-21 21:01:25

results matching ""

    No results matching ""