如何防止恶意带宽 - 吸血鬼请求滥用Azure CDN带宽?

时间:2016-02-18 17:47:54

标签: azure azure-cdn

只是为了让大家知道,我确实按照一些人的建议略微编辑了帖子,问题已经发布在Azure CDN论坛here上。我在StackOverflow上发布它的原因是尝试吸引更多的受众,希望处理相同/类似问题的人可以提供有价值的解决方案/反馈。据我所知,目前还没有解决这个问题的办法,但这会影响任何使用CDN传递内容的企业。我愿意进一步编辑这个问题,但我要问的是,人们不会简单地对这个问题进行投票,因为这听起来像是一个咆哮"它不是,我可以向你保证,它会影响到成千上万的企业,无论他们是否意识到这一点,每年都要花费数千美元。

所以情况就是这样。让我们说我正在建立一个图片库网站,我想使用Azure CDN为我提供我的内容。在后端,Azure CDN将从Azure存储帐户中提取内容。 CDN速度快,功能强大,但看起来虽然在防止有人能够大量提取内容并因此给用户留下巨大的带宽费用方面有点不安全。让我证明一下我的意思。

所以昨晚我决定写一个简单的控制台应用程序,从我未来下载一个简单的图像到图片库网站,在for {}循环中,代码如下:

namespace RefererSpoofer
{
    class Program
    {
        static void Main(string[] args)
        {
            HttpWebRequest myHttpWebRequest = null;
            HttpWebResponse myHttpWebResponse = null;

            for (int x = 0; x < 1000; x++)
            {
                string myUri = "http://myazurecdnendpoint.azureedge.net/mystoragecontainer/DSC00580_1536x1152.jpg";
                myHttpWebRequest = (HttpWebRequest) WebRequest.Create(myUri);
                myHttpWebRequest.Referer = "www.mywebsite.com";

                myHttpWebResponse = (HttpWebResponse) myHttpWebRequest.GetResponse();

                Stream response = myHttpWebResponse.GetResponseStream();
                StreamReader streamReader = new StreamReader(response);

                Image image = Image.FromStream(streamReader.BaseStream);

                image.Save(string.Format("D:\\Downloads\\image{0}.Jpeg", x), ImageFormat.Jpeg);

                myHttpWebResponse.Close();
            }

            Console.ReadKey();
        }
    }
}

此控制台应用程序对我的Azure CDN端点上托管的映像文件发出1000次超快速连续请求,并将其保存到“D:\ Downloads&#39;我的电脑上的文件夹,每个文件名对应于for {}循环迭代,即image1.jpeg,image2.jpeg等。

刚刚发生了什么?在大约1分钟的时间里,我花了140MB的带宽。这是一款高级CDN,售价0.17美元/ GB,让我们一起做数学:0.14GB * 60分钟* 24小时* 30天* 0.17cents / GB = 1028.16美元的带宽成本,如果某人(例如竞争对手)我希望在一个月的时间内对单个图片提出单一请求,以破坏我的网站。我想你们可以看到我要去哪里...我的网站将有数千张图片,高分辨率,顺便说一下,我在这个例子中使用的图像只有140KB大小。这些类型的请求可以来自匿名代理等。

所以我的问题是:有什么能阻止某人滥用公开暴露的CDN端点?显然,由于恶意请求导致的带宽不能支付5,000美元,20,000美元。

现在Azure Premium CDN有一个高级规则引擎,它可以根据Referer过滤掉请求,并在Referer与您的网站不匹配时回复403错误。但是,Referer可以伪造,就像我在上面的代码示例中所做的那样,并且CDN仍然允许请求被提供(我使用Referer欺骗测试)。这很糟糕,很多人使用参考防止&#39; hotlinking&#39;,但在这种带宽滥用的情况下,如果Referer可以伪造一行代码,那有什么关系呢?

我在防止此类滥用和巨额带宽成本方面提出了一些想法:

*两种解决方案都需要CDN采取行动:

  1. 当请求内容到CDN时,CDN可以调用客户端服务器传入a)用户的IP地址b)CDN Uri请求的IP地址。然后客户端服务器将检查从该特定IP请​​求Uri的次数,并且如果客户端逻辑看到它被请求,则在过去一分钟内说100次,那么显然这将表示滥用,因为浏览器缓存图像,而恶意请求不是。所以客户端机器只会回复“假”。为此特定请求提供内容。这不是一个完美的解决方案,因为对客户端基础设施的额外回调会导致一个小的延迟,但它肯定比可能卡在一个看起来像你已经存入银行的金额的账单更好#39;储蓄账户。

  2. 更好的解决方案。根据每个IP在特定时间范围内通过CDN提供文件的次数限制。例如,在上面的图像文件的示例中,如果可以将CDN配置为不超过10分钟时间范围内的50个图像请求/ IP /。如果检测到滥用,那么CDN可以在客户定义的时间内a)为特定的滥用uri服务403。或b)如果请求来自滥用者IP,则所有用户的服务器403。所有时间/选项都应保留给客户。这肯定会有所帮助。这里没有回调可以节省时间。缺点是CDN必须跟踪Uri / IP地址/命中数。

  3. 哪些解决方案不起作用:

    1. 签名网址无法正常工作,因为签名查询字符串参数每次都会有所不同,浏览器会不断提出数据请求,有效地擦除了浏览器缓存中的图片。

    2. 拥有azure blob的SAS访问签名也不会起作用,因为a)Uri每次都不同b)一旦授予SAS,您可以请求blob的次数没有限制。因此滥用情况仍然存在。

    3. 检查您的日志并简单地通过IP禁止。我昨天通过匿名代理测试了这种类型的滥用行为,它就像一个魅力。在几秒钟内切换IP并继续滥用(我自己的内容)用于测试目的。所以这也是好的,除非有一个保姆来监控日志。

    4. 可行但但不可行的解决方案:

      1. 在您的网络服务器上过滤请求。当然,这将是控制问题和跟踪请求/ IP数量的最佳方式,并且在检测到滥用时不会提供内容。但是,您放弃了不通过超快速,接近客户端优化的CDN提供内容的巨大好处。此外,通过提供大字节内容(如图像),您的服务器将会大大减慢。

      2. 只需咬紧牙关而不用担心。那么......那么你就知道把你的轮子拿出来的坑洼就在路上,所以不,这个选择不舒服。

      3. 综上所述,Azure提供的带有自定义规则引擎的Premium CDN可能会在那里提供一个解决方案,但由于文档很差且缺少示例,因此只需要猜测如何正确保护自己,这就是我写这篇文章的原因。有人曾经解决过这样的问题吗?怎么解决呢?

        任何建议都表示赞赏,我对这个问题非常开放。

        感谢您的阅读。

1 个答案:

答案 0 :(得分:-1)

这是理论上的,因为我们不提供我们的“应用程序”,但可能很快就会面临这个问题:

难道您不能直接在您的网站上发布一个过期很快(10 秒!?)的 cookie 并使用 Azure standard rules engine 进行检查。

然后,在您的“主站点”上,您可以进行自定义检查,如果 IP 超过“合理”的请求量,则该检查会阻止 IP(或分别不发出 cookie)。 一些先决条件:

  • 与通过 CDN 相比,您可能需要对发布 cookie 的“主站点”拥有更多控制权。不知道,是否可以将这些请求直接“引导”到“客户端服务器”。
  • cookie 必须是 HttpOnly 才能不被客户端伪造。

...我错过了什么吗?

相关问题