文件存储的安全性问题
野火IM的消息加密是非常安全,但文件是属于消息系统之外的而且文件可能更敏感更私密,所以文件的安全性也成了客户担忧的重点。本文将分析一下野火IM试用文件服务的细节及安全防护。
1. 野火IM与文件系统的协同工作
野火IM与文件系统是分开的,互相协助才能发送媒体消息(包括图片/语音/视频/文件及自定义媒体消息)。流程是这样的:
- 客户端应用调用协议栈发送媒体消息。
- 协议栈检查媒体消息,如果remoteUrl不存在则认为需要上传,准备把localPath中的文件上传到对象存储服务器;如果存在则跳到第7步。
- 协议栈调用野火IM服务请求上传令牌。
- 野火IM服务收到请求后,根据配置文件中的媒体配置信息调用对应对象存储服务的sdk生成上传令牌并和上传地址返回给客户端协议栈。
- 客户端协议栈收到令牌和上传地址后,把文件上传到对象存储服务,并得到一个媒体文件的url。
- 协议栈更新消息的remoteUrl,值为上传得到的url。
- 协议栈把消息内容(只包含媒体文件url,不包含媒体内容)打包发送。
- 对端收到消息后,使用remoteUrl打开文件。
2. 野火IM支持的媒体方式
- 内置测试对象存储服务:这个仅限于开发测试使用,不建议用在生产环境,后面不用考虑此对象存储服务的安全性。
- 七牛对象存储服务:社区版客户建议用这个,七牛对象存储服务应该是国内最大的对象存储服务提供商。
- 其他云对象存储服务:仅专业版支持,包括阿里云/腾讯云/华为云/亚马逊S3,使用上基本跟七牛一样。
- 野火IM私有存储:仅专业版支持,基于Minio二次开发,2和3都是公有云的,使用minio可以做到全部私有部署。
- 野火对象存储网关+客户自有对象存储服务:仅专业版支持,需要实现网关中与客户自有对象存储服务对接功能。
3. 安全问题
3.0.1. 上传加密问题
由于mars不支持标准tls,所以无法用https上传。而云存储又都是公有云,所以不支持自定义加密上传。所以云存储都是使用http上传的,严格说来存在一定的安全隐患。野火IM私有存储和野火对象存储网关是自己加密数据,不存在安全问题。解决方法是,使用野火IM私有存储或者野火对象存储网关或者不使用协议栈上传在应用层使用https上传。
3.0.2. 下载的安全问题。
目前媒体消息的阅读是没有加上鉴权的,所以就要求所有的bucket都是公开的,也就是说上传需要认证,下载是不需要认证的。但也不是那么不安全,首先所有文件名都经过复杂地编码,是不可能被穷举的,这样黑客无法穷举您的文件,只有拿到确切文件名才可以访问。七牛/阿里云/野火IM私有存储都可以使用https下载的,这样可以排除掉网络抓包获取到文件名的可能性。所以对于一般情况下,对象存储服务加上https下载就足够安全 了。
如果还需要进一步加强安全性,可以设置bucket为私有(头像由于被频繁使用,且机密程度比较低,建议头像的bucket设置为公开,其他bucket设置为私有),然后客户端打开媒体文件前,先去调用SDK中的getAuthorizedMediaUrl
方法获取到授权后的地址去访问,或者去客户自己的服务来申请鉴权信息。
可能有些客户还有更进一步的要求,比如文件密级,文件归属等。这时就需要扩展文件消息,注意以json的方式扩展文件消息,不要改变原有消息的定义,扩展出文件的密级和部门信息等,然后客户端去打开文件时去对应的业务服务校验权限等级等,校验通过后再返回签名后的地址。
4. 总结
内置测试服务不要生产使用;一般情况下对象存储服务加上https下载就足够安全了;可以设置bucekt为私有,需要额外的开发量,但意义不大。