客户端文件直传对象存储的便捷与安全性探究

Posted by     "Pu Ming" on Thursday, March 28, 2024

概述

本文主要探讨企业租赁云服务商的对象存储服务后,客户端直传文件至对象存储的便捷性及安全问题。首先,本文介绍了文件“直传”与“服务端代理上传”的区别,并解释了如何实现文件“直传”。其次,文中探讨了文件“直传”可能存在的安全风险。例如凭证泄露可能导致的对象存储数据泄露和云资源滥用等问题,并对云服务商提供的安全机制进行了分析。最后,笔者提出了一些延伸思考。希望能为读者提供有益建议。

一. 为什么选择客户端直传文件至对象存储

典型C/S架构下,文件“直传”和“服务端代理上传”方式的上传流程如图1,2所示:

img
图1. 服务端代理上传文件至对象存储流程
img
图2. 客户端直传文件至对象存储流程
以上流程不难看出,服务端代理上传的方式有以下弊端:

  • 网络资源浪费。同一份文件需要上传两次;
  • 服务端带宽消耗大。在云服务器上部署服务端时,考虑到高昂的带宽成本,通常会限制带宽。如果有大量用户上传文件到服务端,可能会迅速耗尽带宽资源,导致请求阻塞,从而影响业务的正常运行。
  • 用户需自行实现文件上传业务;
  • 客户端到服务端通信的安全性无法保障。由于不同企业的安全能力不同,缺乏统一的鉴权模式,客户端到服务端的通信可能存在风险。

对比服务端代理上传,我们再看看“直传”方式具备哪些优势:

  • 由于同一份文件只需上传一次,不会造成额外的网络资源浪费。此外,带宽消耗取决于客户端的带宽大小,因此服务端的压力显著减少;
  • 用户无需自行实现文件上传业务,可将具体操作交由云服务提供商处理(如果上传业务逻辑不复杂,云服务商提供的上传方式基本可以作为参考模板)。例如,阿里云的OSS对象存储服务提供多种上传方式[1],如图3所示:

img
图3. 阿里云OSS对象存储文件上传方式

  • 安全性高,云服务商会提供统一的授权模式,如STS令牌、第三方签名URL等,具体内容可见下文分析。

二. 如何实现客户端直传文件至对象存储

通常情况下,我们使用Web端或小程序作为客户端。由于浏览器实施同源策略的跨域限制,因此无法直接将文件上传至对象存储。要实现“直传”,首先需要解决跨域问题。我们可参考云服务提供商提供的跨域设置,以阿里云的OSS为例,可以针对特定的存储桶进行相应的配置,如图4所置:

img
图4. 阿里云OSS对象存储跨域配置

解决跨域问题后,将文件上传至对象存储需要获得云服务商的授权。通常情况下,我们可以通过云服务商向用户颁发的AK/SK凭证来获取授权。然而,由于“直传”方式可能会将AK/SK暴露在Web端页面,存在凭证泄漏的风险,因此这种方式并不安全。为降低风险,云服务商提供了多种授权方式,例如阿里云的OSS服务提供STS令牌、第三方服务签名URL、表单上传等方式。

三. 客户端直传文件至对象存储的风险分析

3.1 云凭证泄漏导致对象存储数据泄漏风险

文件“直传”过程中,如果用户在客户端Web的HTML页面中硬编码云凭证信息,可能会导致云凭证泄漏风险。攻击者可以利用泄漏的云凭证访问对象存储并窃取数据。云服务商通常提供两种凭证类型:云用户的AK/SK和STS(Security Token Service)临时访问凭证。对于AK/SK类凭证,云服务商通常不强制其过期时间,一旦泄漏且未定期更换,攻击者可持续窃取数据。对于STS临时访问凭证,用户可限制访问权限和有效期,避免长期暴露AK/SK的风险。尽管STS一定上程度上减少了风险,但若用户不遵循最小权限原则或设置过长有效期,仍可能导致数据泄露风险。以阿里云的STS为例,STS凭证只能通过RAM角色获取,用户可设置有效期,最长为12小时。如图5所示:

img
图5. 阿里云RAM角色设置STS有效时长

即使STS的有效时长被设置为最大值,给予了攻击者更多时间,但若RAM角色仅被授予有限权限,攻击者仍只能在特定权限范围内窃取数据。若权限设置过大,将扩大攻击范围,导致更多云资源数据被窃取,为此我们可以对RAM角色进行授权设置,确保权限范围受控。图6,7展示了如何为RAM角色新增权限以及STS临时凭证所支持的云服务。

img
图6. 阿里云RAM角色新增授权

img
图7. 支持STS的云服务

3.2 云凭证泄漏导致其他云资源被滥用风险

AK/SK和STS云凭证泄漏也会带来其他云资源被滥用的风险。攻击者可以使用泄漏的云凭证和云服务商提供的SDK操作其他云资源,导致资源被滥用。例如,攻击者可以利用云凭证创建Serverless函数并进行滥用。云服务商提供的Serverless函数通常具有免费试用、低部署成本以及可信的访问域名和非唯一的IP等特征,攻击者可将其作为跳板隐藏攻击资产,如图8所示:

img
图8.Serverless滥用风险

四. 客户端直传文件至对象存储授权机制分析

客户端直传文件需要对象存储的授权,云服务商提供了多种授权机制以满足用户需求。需注意的是云凭证不应存储在前端,而应由服务端生成签名或临时访问凭证。我们依然以阿里云的OSS举例说明,其提供了三种授权机制:

  • STS临时访问凭证机制: 服务端生成临时凭证(可设置有效期),返回给客户端。客户端使用OSS SDK和临时凭证上传文件。该凭证可重复使用,适用于文件分片传输或断点续传场景;
  • 表单上传机制: 服务端生成签名(可设置有效期),主要用于限制客户端上传文件的属性信息,如文件大小、格式、上传路径等。客户端使用签名信息,无需依赖OSS SDK,以Form表单形式上传文件。适用于需要限制上传文件属性的场景;
  • 第三方生成签名URL: 服务端生成签名URL(可设置有效期),返回给客户端。客户端通过调用签名URL上传文件。适用于简单上传场景。

4.1 STS临时访问凭证机制分析

由于客户端调用OSS SDK上传文件时需携带服务端生成的STS临时凭证,因此存在STS临时凭证泄漏到前端页面的风险,如下图所示:

img
图9. 客户端调用OSS SDK实现文件上传

通过对STS临时凭证设置最小权限和最短有效期,可将泄漏风险降至最低。最小权限可仅限制为对对象存储的读或写权限,而最短有效期可在后端或控制台中进行设置。 笔者验证了STS临时凭证的最短有效期为15分钟,如图10所示:

img
图10. STS临时凭证最小有效期限

4.2 表单上传机制分析

为了避免前端泄漏临时凭证信息,一种可行的方法是使用服务端生成签名的方式。这样,前端就无法通过签名获取具体的令牌信息了。以阿里云OSS的服务端生成PostObject签名和Post Policy为例,服务端生成签名所需的参数输入包括:

  • PostPolicy上传策略:用于限制文件属性
  • 策略过期时间:PostPolicy策略的过期时间,防止被重复使用
  • SK凭证:云凭证信息

img
图11. 签名函数参数输入

img
图12. 签名函数

PostPolicy文件上传策略是授权机制的核心,通常包含两部分内容:expiration(签名有效期)和conditions(约束条件)。如下图所示:

img
图13. PostPolicy样例

expiration限制了签名的有效时长,通过HMACSHA256哈希算法生成的加密字符串使SK凭证泄漏风险达到相对可控。

img
图14. PostPolicy签名

conditions用于限制文件上传属性,防止攻击者利用签名对对象存储进行恶意操作。为了更清晰的探讨此场景,笔者仍以阿里云OSS举例说明,假设有以下用户需求:

  1. 文件上传至对象存储Test Bucket的“test1/”路径下;

  2. 文件格式为jpg或jpeg的图片,大小不超过1MB;

  3. 文件上传请求的Header中需包含x-oss-meta-prop的header key,值为“ssssss”;

  4. 同一文件不能重复上传;

  5. 签名有效期为1小时;

用户尝试编写的策略如下所示:

policy = {

​    \# 有效期。"expiration": generate_expiration("3600"),

​    \# 约束条件,参考:https://help.aliyun.com/zh/oss/developer-reference/postobject。"conditions": [

​      {"bucket": "test" },

​      ["eq", "$success_action_status", "200"],

​      ["starts-with", "$key", "test1/"],

​      ["content-length-range", 1, 1000000],

​      ["in", "$content-type", ["image/jpg", "image/png","image/jpeg"]],

​      ["eq","$x-oss-forbid-overwrite","true"],

​      ["starts-with", "$x-oss-meta-prop", "ssssss"],

​    ]

}

用户编写的策略应包含上述限制。服务端签名后,将Policy信息与SK凭证、签名过期时间传递至客户端。客户端通过Form表单上传文件。如下图所示:

img
图15. 客户端表单上传

若同一文件上传两次,OSS会验证策略匹配,并返回403无权限。如下图所示:

img
图16. PostPolicy策略匹配错误提示

由于有PostPolicy限制,该签名调用实际上是一次性的,即使攻击者拿到签名也只能在有限时间内执行一次操作,无法对其他文件做任何操作。即便用户未设置文件覆盖上传,攻击者对OSS发起DoS攻击,从云服务商责任划分原则上来看,用户自身通常不会承担安全风险,云服务商应具备抵御DoS攻击的能力。因此笔者认为该方法可以有效控制临时凭证的泄漏风险,并同时保护了对象存储系统的安全性。

4.3 第三方生成签名URL机制分析

第三方生成签名URL机制可通过服务端生成一段具有有效期限的URL实现,客户端通过服务端返回的URL发起PUT请求来上传文件。签名URL的输入包括:

  • 上传对象名(Object)
  • 指定Headers(用于限制文件属性,如Content-Type限制文件类型)
  • 签名过期时间(expire_time)

img
图17. 签名URL输入参数

经过服务端签名后的URL格式为:

https://xxxx.oss-cn-xxxx.aliyuncs.com/test1/xxxx.png?OSSAccessKeyId=xxxx&Expires=xxxx&Signature=xxxx

由于URL中的Signature值经过加密,客户端可以在不透露AK/SK访问凭证的情况下,授予第三方在特定有效期内对OSS资源的访问权限。此外,客户端无需依赖OSS SDK即可实现文件上传。

五. 延伸思考

5.1 对象存储的文件上传流量几乎是免费的,而文件下载流量和存储大小是付费的

除非使用传输加速功能[3],对象存储的文件上传流量通常是免费的。用户在限制文件大小和上传路径的前提下,如果攻击者获取了用户的云凭证并持续上传文件至对象存储,用户是无需为上传文件的流量付费的,但云服务商需要对攻击流量进行有效防御。

从便捷性和成本效益的角度考虑,用户可尽量避免使用公网流量下载文件,而应该利用云内网通道在同一Region内进行文件下载。例如用户购买的对象存储服务和云服务器位于同一Region,则可通过内网通道免费将对象存储中的数据下载至云服务器上,进行具体业务处理,最后再上传至对象存储。需注意的是, 同一Region的云服务器和对象存储之间内网互通,不同Region则不能。

此外,云提供商通常提供对象存储挂载云服务器的功能,如阿里云的OSS Bucket可以以目录的方式挂载至ECS实例[4]。

进一步的优化方式可以通过部署Serverless函数实现免费文件下载,这种方式的优势在于Serverless函数通常具有免费调用额度,并且具备较好的并发能力,可支持多租户上传。

5.2 云租户持续的犯错将导致大量数据泄漏事件的发生

过去一年期间,云安全领域涌现了一系列重大事件,例如:

  • 2023年1月,Wiz发现了Azure Active Directory(AAD)中的一个新攻击向量,影响Microsoft的Bing服务。该攻击向量基于常见的AAD配置错误,使得配置错误的应用程序允许未授权的访问[6];

  • 2023年2月21日,美国在线新闻网站TechCrunch报道称,美国国防部的一个服务器泄露了约3TB美国军方内部电子邮件数据。该服务器托管在微软为国防部提供的Azure政务云上,理论上该政务云与其他网络是物理隔离的,很可能是由于错误配置导致邮件服务暴露在了互联网中并且允许匿名访问[7];

  • 2023年5月12日,Toyota Connected Corporation(以下简称TC)宣布,丰田汽车公司外包给TC公司的部分数据因云环境设置不正确而遭到泄露。此次数据泄露事件影响约215万订阅丰田服务T-Connect、G-Link、G-Link Lite和G-BOOK的用户,泄露的信息包含车辆的位置信息、车辆在上述位置的时间以及车载终端ID和车辆识别号VIN,甚至包含2016年11月14日至2023年4月4日期间行车记录仪拍到的录像视频[8];

  • 2023年11月15日,Cabernets披露英国MPD FM(之前称为Manpower Direct)使用的亚马逊S3 (Simple Storage Service) 对象存储由于错误配置泄露了16,000 多份包含员工护照、签证、身份证、驾驶执照等敏感数据文件[9]。

以上事件我们可以看出云租户会持续犯错,或是因为云服务访问错误配置,或是因为云凭证被误泄露在了公网上,这些均会导致安全事件的发生。绿盟科技在云上风险发现领域已有多年研究积累,研究发现泄漏数据对象的类型较多,典型的如源代码仓库、容器镜像仓库、云数据库、对象存储等。绿盟科技近期发布了《2023年公有云安全风险分析报告》[5],报告针对公有云服务配置错误、云服务自身脆弱性配置或漏洞以及云服务的第三方供应链软件三方面进行了总结分析。此外,绿盟在能力侧也独家发现了全国多个系统源代码暴露情况 — 超四百万公民个人隐私信息存在泄露风险,这些安全事件均已上报至相关监管机构,从而真正做到了先于攻击者发现云上风险。

六. 总结

本文分析了客户端直传文件至对象存储的便捷性及其面临的安全风险,并探讨了云服务商提供的文件“直传”安全机制的利弊。最后,提出了一些延伸思考,欢迎各位读者批评指正。

七. 参考文献

[1] https://help.aliyun.com/zh/oss/user-guide/upload-objects-to-oss/?spm=a2c4g.11186623.0.0.6b5e6075UQumb8

[2] https://help.aliyun.com/zh/ram/developer-reference/api-sts-2015-04-01-assumerole?spm=a2c4g.11186623.0.i155#main-107864

[3] https://help.aliyun.com/zh/oss/user-guide/enable-transfer-acceleration

[4] https://help.aliyun.com/zh/oss/user-guide/methods-to-attach-an-oss-directory-to-an-ecs-instance?spm=5176.22414175.sslink.1.303c4e90pjaRdq

[5] https://www.nsfocus.com.cn/html/2024/92_0313/212.html

[6] https://www.wiz.io/blog/bingbang

[7] https://techcrunch.com/2023/02/21/sensitive-united-states-military-emails-spill-online/

[8] https://company.toyotaconnected.co.jp/news/press/2023/0512/

[9] https://cybernews.com/security/mpd-fm-passport-data-leak/

[10] https://www.zhihu.com/question/461803154/answer/3178042223

「真诚赞赏,手留余香」

Ming Blog

真诚赞赏,手留余香