原文:A Deep Dive Into DNS Packet Sizes: Why Smaller Packet Sizes Keep The Internet Safe
译者:杰微刊兼职翻译汪建
昨天我们写了一篇关于我们网络遭受到每秒400G流量的攻击的文章,其中一种攻击网站的方式是通过不断重复执行DNS查询操作进行DDoS攻击,由于DNS查询请求只是一个很小的包,而响应包很大,所以攻击者可以通过伪造DNS请求包中的请求IP,从而将响应包发往受攻击的服务器上,这种模式就是所谓的反射攻击。
域名有DNS安全扩展机制,因为DNS请求响应的包的大小不同,这通常被滥用于这种类型的流量攻击,许多DNS服务提供商挣扎着跟基于DNS安全扩展机制的DDoS攻击作斗争。就在上个月,Akamai发布了一份关于使用DNS请求.gov域名去DDos攻击其他域名的报告,他们说从十一月份以来,他们已经看到了400起这类的攻击。
为了防止CloudFlare上的域名免遭受这种类型的DNS放大攻击,我们采取了预防措施去确保大多数DNS的响应都被我们装到512字节的UDP数据包中,即使当某域使用了DNS安全扩展协议。我们不得不对我们的DNS安全扩展采取创新实现,我们使用了DNS安全扩展协议中很少使用的一个签名算法,甚至可以在请求访问期间让DNS记录类型过期。
椭圆曲线:确保破解难度
荷兰著名数学家Arjen Lenstra从能量的角度讨论了密码学,在我们之前的博客我们也曾经提及过他。他将破解密码需要花费的精力与这些精力能烧沸腾多少水进行形象比较,破解一个228位的RSA密钥需要的能力等同于煮沸一茶匙的水,而另一方面,要想破解一个228位的椭圆曲线密钥则需要的能力等同于将地球上所有的水都煮沸。
使用椭圆曲线密码学中的ECDSA签名算法,我们可以用更小的密钥达到同样的安全级别,而对于同等安全级别RSA密钥则需要更大。我们的椭圆曲线密钥长度为256位,实力相当于3100位长度的RSA密钥(大多数RSA密钥只有1024位或2048位)。你可以比较下面的签名后的DNSKEY集,其中一个是RSA密钥而另外一个是ECDSA密钥,我们的密钥大小仅仅是RSA密钥和签名长度的四分之一。
还有一个好处是,ECDSA快如闪电,并且实际上我们的工程师Vlad Krasnov对其进行优化帮助其跑得更快,通过汇编程序实现本地方式的ECDSA,他使签名速度增加了21%。他的优化现在作为1.6版本Go语言的标准加密库。现在仅仅需要一瞬间就能完成加密,只需0.0001秒,就能对一个DNS响应记录进行签名。
拒绝ANY查询类型:一个DNS记录类型的死亡
在Akamai的安全报告中,作者得出结论:DNS安全扩展是造成DDoS攻击的唯一原因,因为他有一个很大的响应包,但是另外一个关于大响应包的原因是,攻击者使用ANY类型请求去最大限度地放大这个因素。ANY类型查询都是一个内置的调试工具,意思就是说DNS服务器将返回每个对应域名的DNS记录。不幸的是,他们经常被用于发动大规模的DDoS攻击。
九月份,我们停止了对ANY类型请求的响应以及发布了一个关于反对ANY类型作为互联网标准的互联网草案,我们小心翼翼地进行着这项工作,并与剩下不多的还在使用ANY类型请求的软件厂商密切合作,确保不会影响他们的生产系统。
一个DNS安全扩展的ANY类型的查询,cloudflare.com会返回231字节的响应,而与Akamai's的报告中的域名长度相比,同样是ANY类型它几乎要返回一个18倍大的包,多达4016字节。
椭圆曲线+拒绝ANY类型
通过保证我们的数据包足够小并放进512字节的UDP数据包,我们就已经保证了我们域名的安全而免遭受放大因素的DDoS攻击。如果你对在CloudFlare上使用DNS安全扩展感兴趣,这里有一些简单的步骤让你设置。如果你对技术性挑战感兴趣,我们欢迎听到你的消息。