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

标签 azure azure-cdn

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

8 个月前关闭。




Improve this question




为了让大家知道,我确实按照一些人的建议稍微编辑了帖子,问题已发布在 Azure CDN 论坛 here .我也在 StackOverflow 上发布它的原因是尝试接触更多的受众,希望处理过相同/类似问题的人们可以提供有值(value)的解决方案/反馈。据我所知,目前没有解决此问题的方法,但它会影响任何使用 CDN 交付内容的企业。我愿意进一步编辑这个问题,但我想问的是,人们不要简单地拒绝这个问题,因为它听起来像是“咆哮”,事实并非如此,我可以向你保证它会影响成千上万的企业无论人们是否意识到这一点,每年都要花费数千美元。

所以这里的情况。假设我正在构建一个图片库网站,并且我想使用 Azure CDN 为我提供我的内容。在后端,Azure CDN 将从 Azure 存储帐户中提取内容。 CDN 快速且功能强大,但它似乎在防止某人能够大量提取内容从而给用户留下巨额带宽账单方面可能有点不安全。让我证明我的意思。

所以昨晚我决定编写一个简单的控制台应用程序,它将从我 future 的图片库网站下载一个简单的图像,在一个 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 次超快速连续请求,并将它们保存到我 PC 上的“D:\Downloads”文件夹中,每个文件名对应于 for{} 循环迭代,即 image1.jpeg、image2.jpeg 等。

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

所以我的问题是:如何防止有人滥用公开暴露的 CDN 端点?显然,人们不能因为恶意请求而为带宽支付 5,000 美元、20,000 美元。

现在 Azure Premium CDN 具有高级规则引擎,可以根据 Referer 过滤请求,并在 Referer 与您的网站不匹配时以 403 错误响应。但是,Referer 可以伪造,就像我在上面的代码示例中所做的那样,并且 CDN 仍然允许提供请求(我使用 Referer 欺骗进行了测试)。这很糟糕,很多人使用 Referer 来防止“盗链”,但在这种带宽滥用的情况下,如果只用一行代码就可以伪造 Referer 又有什么关系呢?

关于防止这种滥用和巨大的带宽成本,我有几个想法:

*这两种解决方案都需要 CDN 的操作:
  • 当内容请求到达 CDN 时,CDN 可以调用客户端服务器,传入 a) 用户的 IP 地址 b) 请求的 CDN Uri。然后客户端服务器会检查从这个特定 IP 请求 Uri 的次数,如果客户端逻辑看到它在过去一分钟内被请求了 100 次,那么显然这会发出滥用信号,因为浏览器缓存图像,而恶意请求则不然。因此,客户端机器将简单地回复“false”来为该特定请求提供内容。这不是一个完美的解决方案,因为对客户端基础设施的额外回调会导致一个小的延迟,但它绝对比可能被卡在看起来像你在银行储蓄账户中存入的金额的账单要好。
  • 更好的解决方案。为每个 IP 在特定时间范围内通过 CDN 提供文件的次数限制。例如,在上面的图像文件示例中,如果可以将 CDN 配置为在 10 分钟的时间范围内提供不超过 50 个图像请求/IP/。如果检测到滥用,则 CDN 可以在客户定义的时间 a) 为特定的滥用 uri 提供 403。或 b) 如果请求来自滥用者 IP,则所有 uri 的服务器 403。所有时间/选项都应留给客户配置。这肯定会有所帮助。这里没有回调,可以节省时间。缺点是 CDN 必须跟踪 Uri/IP 地址/命中数。

  • 哪些解决方案不起作用:
  • 签名的 URL 将不起作用,因为签名查询字符串参数每次都会不同,浏览器会不断请求数据,有效地清除浏览器缓存的图像。
  • 为 azure blob 设置 SAS 访问签名也不起作用,因为 a) Uri 每次都不同 b) 授予 SAS 后,您可以请求 blob 的次数没有限制。所以滥用场景仍然是可能的。
  • 检查您的日志并简单地通过 IP 禁止。昨天我正在通过匿名代理测试这种滥用行为,它的作用就像一个魅力。在几秒钟内切换 IP 并继续滥用(我自己的内容)以进行测试。所以这也是出局了,除非有一个保姆来监控日志。

  • 可行但不可行的解决方案:
  • 过滤 Web 服务器上的请求。当然,这将是控制问题和跟踪请求/IP 数量的最佳方法,并且在检测到滥用时根本不提供内容。但是,您失去了不通过超快速、接近客户端优化的 CDN 交付内容的巨大优势。此外,由于提供大字节内容(例如图像),您的服务器速度会大大降低这一事实。
  • 只需咬紧牙关,不用担心。嗯...然后你知道将你的车轮取出来的坑洞就在路上,所以不,选择这个选项并不是一种舒适的感觉。

  • 综上所述,Azure 提供的带有自定义规则引擎的高级 CDN 产品可能会在某处提供解决方案,但是由于文档非常差且缺乏示例,人们只能猜测如何正确保护自己,所以这就是我为什么要写这篇文章。有没有人解决过这样的问题?以及如何解决它?

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

    感谢您的阅读。

    最佳答案

    这是理论上的,因为我们不提供我们的“应用程序”,但可能很快就会面临这个问题:
    难道您不能在您的网站上发布一个很快过期(10 秒!?)的 cookie 并使用 Azure standard rules engine 来检查它是否存在。 .
    然后,在您的“主站点”上,您可以进行自定义检查,如果 IP 超过“合理”的请求量,则该检查会阻止 IP(或分别不发出 cookie)。
    一些先决条件:

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

  • ... 我错过了什么?

    关于azure - 如何防止恶意带宽吸血鬼请求滥用 Azure CDN 带宽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35488753/

    相关文章:

    azure - 如何跟踪Azure网站备份进度?

    azure - 在 Azure 应用服务部署任务中设置 XML 转换环境

    azure - Azure 容器实例运算符(operator)可以担任哪些角色

    php - 未找到 CreateBlobOptions 类

    azure - 从 Staging 切换到 Prod 后 CDN 的工作原理

    bool 应用程序属性上的 Azure IoT 中心消息路由

    azure - Terraform Incapsula 提供程序无法创建自定义证书资源

    Azure 云服务 CDN 字体 CORS 错误

    azure-storage - 如何为 Azure 存储 blob 静态网站启用 Azure CDN?

    azure - 还有其他方法可以改善 Azure CDN 延迟吗?