更新 2024年7月5日
S3 团队正在修复问题:
https://twitter.com/jeffbarr/status/1785386554372042890
想象一下,你在你选择的一个区域内创建了一个空的私有AWS S3桶。第二天早上你的AWS账单会是多少?
几周前,我开始为客户开发一个文档索引系统的PoC。我在 eu-west-1 区域创建了一个S3桶,并上传了一些文件进行测试。两天后,我检查了我的AWS计费页面,主要是为了确保我所做的一切都在免费套餐的限制范围内。显然,情况并非如此。我的账单超过了1300美元,计费控制台显示在短短一天内执行了近1亿次S3 PUT请求!
我每天每个区域的 S3 使用费用
这些请求是从哪里来的?默认情况下,AWS 不会记录针对您的 S3 存储桶执行的请求。但是,可以通过 AWS CloudTrail 或 S3 服务器访问日志记录启用此类日志。启用 CloudTrail 日志后,我立即观察到有数千个写入请求来自多个账户或完全在 AWS 之外。
但是为什么有些第三方会用未经授权的请求轰炸我的S3桶呢?这是针对我的账户的某种类似DDoS的攻击吗?还是针对AWS的?事实证明,一个流行的开源工具默认配置是将备份存储在S3中。而作为存储桶名称的占位符,他们使用了……我用来命名我的存储桶的同一个名称。这意味着每次使用默认配置值部署此工具时,都会尝试将备份存储在我的S3存储桶中!
注意:我不能透露我所指的工具的名称,因为这会使受影响的公司面临数据泄露的风险(如进一步解释的那样)。
所以,一堆配置错误的系统正试图将数据存储在我的私有 S3 桶中。但为什么我要为这个错误买单呢?原因如下:
S3 对未经授权的 incoming 请求收费这在我与AWS支持团队的交流中得到了确认。他们写道:
是的,S3 也会对未授权的请求(4xx)收费[1]。这是预期的行为。
所以,如果我现在打开终端并输入:
aws s3 cp ./file.txt s3://your-bucket-name/random_key
我会收到一个 AccessDenied 错误,但你却要为这个请求付费。而且我甚至不需要一个 AWS 账户就能做到这一点。
另一个问题困扰着我:为什么我的账单有一半以上来自 us-east-1 区域?我那里根本没有桶!答案是,没有指定区域的 S3 请求默认会指向 us-east-1,并根据需要进行重定向。而桶的所有者需要为这些被重定向的请求支付额外费用。
安全方面现在我明白了为什么我的S3桶遭到了数百万次请求的轰炸,以及为什么我会收到一张巨大的S3账单。在那个时候,我还有一个想法想要尝试。如果所有那些配置错误的系统都在尝试将数据备份到我的S3桶中,为什么不干脆让它们这样做呢?我将我的桶设置为公开写入,并在不到30秒的时间内收集了超过10GB的数据。当然,我不能透露这是谁的数据。但这让我惊叹于一个简单的配置失误竟然会导致如此危险的数据泄露!
我从这一切中学到了什么? 第1课:任何知道你S3桶名称的人都可以随意增加你的AWS账单。除了删除该存储桶之外,你无法采取其他措施来防止这种情况。当存储桶通过 S3 API 直接访问时,你无法使用 CloudFront 或 WAF 等服务来保护它。标准的 S3 PUT 请求的定价为每 1,000 次请求仅 $0.005,但单台机器每秒可以轻松执行数千次这样的请求。
第2课:给桶名称添加随机后缀可以增强安全性。这种方法减少了因系统配置错误或故意攻击而造成的脆弱性。至少避免使用简短和常见的名称为您的S3桶。
第3课:当执行大量S3请求时,确保显式指定AWS区域。这样你可以避免 S3 API 重定向带来的额外费用。
发生后果:- 我将我的发现报告给了该开源工具的维护者。他们迅速修复了默认配置,尽管他们无法修复现有的部署。
- 我通知了AWS安全团队。我建议他们限制不幸的S3桶名称,以保护客户免受意外费用,并保护受影响的公司免受数据泄露。但他们不愿意解决第三方产品的配置问题。
- 我将问题报告给了两家我在我的桶中发现其数据的公司。他们没有回复我的邮件,可能认为这些邮件是垃圾邮件。
- AWS很慷慨地取消了我的S3账单。然而,他们强调这是特例处理。
感谢您花时间阅读我的帖子。希望它能帮助您避免意外的AWS费用!
共同学习,写下你的评论
评论加载中...
作者其他优质文章