令人惊讶的AWS法案传遍了世界各地

2020-07-26 22:20:56

这是一个晴朗的星期六早上,2020年7月4日。我刚给麦克斯安排了早餐和卡通(如果你好奇的话,可以说是“麦克风”)。我每天放假,朱莉都像往常一样睡懒觉。我是个早起的人,这是我们共同养育孩子的宝贵部分。这给了我和麦克斯建立联系的时间(当他不是在看卡通片的时候填满了他的脸和笑的时候)。我坐下来,拿着我的笔记本电脑,费力地读了一周的私人电子邮件。

“哦,看,AWS法案,我应该笑一笑,”我自言自语道。直到最近,对于一些非常轻微的SES使用来说,每月都是几分钱。今年2月,我离开了谷歌云,回到了AWS。主要的动机是Google将GSuite和GCP IAM纠缠在一起,以至于变得过于混乱。

随之而来的是这个网站的CDN(cdn.chrisShort.net)。我指的是Cloudflare正面的S3桶,当我说CDN时,它持有的资产被认为对GIT来说太大了。它甚至不是chrisShort.net本身,因为它托管在Netlify的CDN和我拥有或管理的所有其他静态站点上。我已经使用Cloudflare很长时间了。CDN不到300个文件,在各种云上已经存在了5年以上。将其从GCP搬回AWS,将AWS的账单推高至平均每月23美元。考虑到网站的流量,这还不算太糟。

不是在这个周六早上,不是。2020年6月的AWS法案令人心悸,造成2657.68美元(PDF)。我听到了喘息的声音,“把你的狗屎放在一起。”我心里想。麦克斯靠在我身上喝他的牛奶。我知道他看着笔记本电脑的屏幕就能看出来不对劲。我只是猜想当他看到字母和数字时,他会想,“成人的东西…。这些卡通和这个肉桂吐司嘎吱作响。“2020年是这样的一年,我的军史是这样的,我被诊断出患有恐慌症(除了创伤后应激障碍和身体伤害之外)。

我立刻开始惊慌失措。当我采取精神上的步骤来缓解恐慌症发作时,我开始形成一个作战计划。是的,我可以切换回紧急模式,就像过去一样,当某事发生爆炸或爆炸时,我会朝它跑去(相信我,总体上这是没有帮助的)。

首先,麦克斯:马斯洛的需求层次?检查一下。接下来是我:仿佛这是命中注定的,我对晨间用药的警觉消失了。

“爸爸得去拿他的药了,伙计。”本能地,麦克斯靠在我身上(哇,…。好的,…。他习惯了在那之后不久就听到这样的提醒和声明;我的大脑现在超负荷运转了)。我接受了我所需要的一切来征服它,同时仍然能够在认知上发挥作用。我重新倒了杯咖啡,拿了一个笔记本电脑充电器。

我登录到AWS控制台,希望这个月能得到一些独一无二的输出。更奇怪的事情已经发生了(比如S3崩溃)。这项法案不可能比以往任何时候都更不寻常。这张AWS账单比我们的抵押贷款多几百美元!我访问了AWS帐单页面,对我看到的情况深感悲痛:

它就在那儿。2657.68美元,盯着我看。“这不可能是合法的。”再往下看,它看起来确实是来自us-East-2的cdn.chrisShort.net s3桶的合法流量。总共有超过30.6 TB的流量从该S3存储桶中移出。什么时候?!?这是刚刚发生的吗?不是的。

30.6 TB?!?!这怎么可能?2020年6月23日1011.59美元。2020年6月24日1639.07美元。

我立即在AWS支持下开具了一张罚单,疯狂地想知道是什么出了问题?这怎么可能呢?有人绕过云焰了吗?见鬼的Cloudflare在说什么?

哦,酷,Cloudflare让这2700个请求完全不加缓存地通过了吗?该异常怎么不会被检测为DDoS?为什么只缓存了很少一部分流量(稍后将详细介绍)?

哦,第二天又有4,400个请求…。甜蜜的,宝贝耶稣。哦,但是你提供了9 GB的缓存。谢谢,云焰。

显然,当你在推特上发一些疯狂的东西,比如一张2700美元的AWS账单,在一个安静的假日早晨,它会得到很多关注。25万人看到了这条推文,其中三分之一的人与之互动。我的朋友、云计算经济学家科里·奎因(Corey Quinn)说,AWS Support Twitter账户之前受到了足够的关注。

哦,不!😰很抱歉听到这个令人不快的星期六早上的惊喜,克里斯。请创建支持案例,以便我们的工程师可以帮助查明此问题的真相:https://t.co/weTUnSYLRU.。🕵️‍♀️^HG。

-AWS支持(@AWSSupport)2020年7月4日

赞扬Twitter至少有能力将注意力吸引到一些事情上。我不确定如果没有它,这件事会不会有那么好的结局。

在西海岸时间黎明前看到账单后,我几乎立刻就把它转发给了科里。我永远感谢科里的分析。当他准备好后,科里给我发了一张他需要做分析的东西的清单(相反,我给他创建了一个有适当烫发😉的定期iam账户,是的,之后我清理了头发)。

Corey鼓励我应用存储桶策略,只允许Cloudflare IP地址访问存储桶中的任何内容。这里的理论是有人可能以某种方式绕过了云焰。但是,值得庆幸的是,Cloudflare发布了它们的IP块,而且它们并不经常更改。Cloudflare支持文章“配置Amazon Web服务静态站点以使用Cloudflare”为您提供了一个示例存储桶策略来执行此操作。这应该成为人们的标准做法。但是,在这种情况下这并不重要;稍后会详细介绍。

科里·奎恩(Corey Quinn)关于这个话题的帖子很好地报道了AWS方面发生的事情:

“…。这几乎完全归功于US-EAST-2数据从…传出。“。

“克里斯·肖特不是某个随机的傻瓜…”(这可能是科里对任何与他没有亲属关系的人说过的最好听的话)。

“‘出乎意料的混蛋,你的房贷不是你这个月最贵的账单,我猜你应该启用账单报警器的!’烂透了,坏了,根本解决不了问题!“。

我有云焰(1918916)和aws(7153956931)的入场券。考虑到当时的情况,CloudFlare是我能想象到的最没有帮助的服务。一位长期用户和断断续续的客户认为他们被攻击了两天,而你却连一根手指都不提?如果我没有足够的理由离开云焰,我现在就有。这将是稍后的博客文章的更新。但是,如果你在一家CDN公司工作,而且启动和运行起来相对容易,我很有兴趣听到你的消息。

在经历了一个非常混乱的早晨后,我听从了科里的建议,断开了联系,享受了这个假日周末。

7月8日,一位精明的AWS员工开始四处挖掘,并找到了我。因为他们对此的看法和我和科里一样令人费解。为什么这么少的请求会如此迅速地产生如此多的流量,然后它一出现就又消失了呢?这看起来也不像是故意恶意的,因为Cloudflare和AWS让它直接通过了。

事后看来,我做出了一个糟糕的决定,以qcot2文件的形式分发试用的Windows 2019 SQL Server虚拟机映像(完全修补了所有必要的驱动程序和VM扩展)。有人意识到此VM映像的存在。然后,他们使用互联网可访问的URL竖立了数百份,甚至可能是数千份该虚拟机的副本。从理论上讲,这是可能的,像Kubernetes和Kubevirt这样的公司。假设磁盘映像成为相应VM Pod中的卷装载。旋转足够多的VM副本,单个YAML文件就可以创建无限个VM副本。如果YAML定义直接引用Cloudflare或S3URL,而不是本地缓存的副本,那么您可以快速地累积下拉图像的次数。在本例中,qcot2映像是13.7 GB。但这比这要棘手得多。

把这个放在“我应该知道但没有知道的事情”项下。您知道吗?“Cloudflare的CDN缓存的最大文件大小为512MB,适用于免费、专业和商务客户,而适用于企业客户,最大文件大小为5 GB。”没错,Cloudflare每次都会看到13.7 GB文件的请求,并将它们直接发送到原始位置。唉哟!。

我在7月4日立即怀疑这些文件,并暂时将它们移到内部工作的GDrive。如果你需要这些图片,让我知道,如果你要的话,你也是嫌疑犯,请注意。

如果你正坐在家里计算,可能有些事情不太对劲。带宽成本很低,当然,六月份确实有一些合法的流量流入桶中,但是,正如勇敢的AWS员工发现的那样,3655部分访问对象实际上可能是作为完整的文件请求提供的,Cloudflare可能曾经对它们做过任何事情。是的,这是一个漏洞,人们正在调查它。我还建议对象大小限制是一个可调的S3存储桶策略。这样一开始,我甚至无法将文件上传到存储桶中。

正如我提到的,在我收到账单的那天(7月4日),我已经从存储桶中删除了多个千兆字节的文件。科里在这里指出了这一点。这可能阻碍了AWS方面的调查。我以后不会这么快删除的。不过,我会把文件锁起来的。但是,让我们面对现实吧。现在我知道了Cloudflare的512MB文件限制,现在我正在将该存储桶中的其他更大的文件移到Archive.org(并将它们添加到我支持的原因中)。

从长远来看,我不想将文件存储在多个地方。我不认为Archive.org应该成为我的网站的垃圾场,因为如果它流行起来,它可以盈利。Archive.org暂时是两个文件的权宜之计。但是,现在我已经启用了适当的日志记录(哦,还有AWS预算警报),我可以对该存储桶进行一些清理。我还将研究Cloudflare的用户友好的替代品,即使这需要我每个月花几块钱。我也再也不会把工作和个人文件共享混为一谈了。

最终,AWS确实退还了2657.68美元原始账单中除约40美元以外的所有款项。我想知道我是否与其他提供商(包括CDN)合作过,如果我得到了退款。我怀疑规模较小的供应商不会这么宽容,特别是在全球经济环境下。