来自 网络 2021-07-15 09:59 的文章

服务器防ddos_网游之持盾萌狼txt云盘_超高防御

服务器防ddos_网游之持盾萌狼txt云盘_超高防御

在运行一系列对amazonwebservices(AWS)进行API调用的单元测试时,我注意到了一个奇怪的现象:测试无法预料地失败。有时所有的测试都会通过,ddos防御在哪层,然后在下一次运行中,有几个测试会失败,而之后的一段时间,另一组测试将失败。我犯的错误似乎毫无意义:Aws::EC2::Errors::AuthFailure:Aws无法验证提供的访问凭据Aws::RDS::Errors::SignatureDoesNotMatch:我们计算的请求签名与您提供的签名不匹配。请检查您的AWS密钥访问密钥和签名方法。请参阅维修文档细节。Aws::Lambda::Errors::InvalidSignatureException:我们计算的请求签名与您提供的签名不匹配。请检查您的AWS密钥访问密钥和签名方法。有关详细信息,请参阅维修文档。这些异常似乎表明测试使用的凭据不正确,但我知道这不是真的。我以前用过很多次这些证书,每次都有用。此外,这些不可预测的单元测试中的每一个都至少通过了一次,因此凭证必须是有效的。那么,为什么我会犯这些错误呢?这些测试确实提出了大量的请求。会不会是速率限制(带有明显无用的错误消息)?这似乎是一个合理的原因,但我无法重现这个问题,即使请求量比测试的数量更大。也许证书有时候真的是无效的。作为健全性检查,我修改了测试以打印出用于每个API调用的凭据。这仅仅是一个错误的、不可预测的代码的例子吗?不。运气不好。这些证件每次都是有效的。当然,除了那个测试无效凭证的单元测试。等等。失败的测试总是在测试无效凭据的测试之后运行。如果我禁用这个测试会怎么样?其余的测试都可靠地通过了。这是怎么回事?我正在玩awsrubysdk,试图重现这个问题,这时我发现了一些有趣的东西。我可以通过发送大量具有无效凭据的请求,cc防御服务,然后立即发送一个具有有效凭据的请求来重现此问题:红宝石#美国焊接学会_测试.rb需要"aws sdk"访问_KEY=""秘钥=""def make_请求(密钥)Aws::EC2::客户端.new(地区:"us-east-1",access_key_id:访问密钥,密钥访问密钥:密钥密钥).描述_实例"成功"救援标准错误=>e"错误:{e。类名称}"结束(30).times{发出请求("无效的密钥")}放入"使用有效凭据:"放置发出请求(密钥)$ruby aws公司_测试.rb使用有效凭据:错误:Aws::EC2::Errors::AuthFailure嗯,这个问题的确是真的。我注意到了一个有趣的现象,对AWS的第一个API调用通常需要半秒钟的时间,但是随后的调用要快得多。但是,如果我等大约5秒钟,美国高防服务器cdn加速,下一个请求将再次(相对)缓慢。这似乎表明了某种缓存问题。我研究了awsrubysdk的代码,但是没有找到任何与响应缓存相关的内容。请求速度的差异是由连接池造成的,awsrubysdk默认情况下保持HTTP连接5秒。禁用连接池并没有解决这个问题,我甚至编写了一个脚本来手动构建HTTP请求并发送它们。不过,问题依然存在。当我把这件事告诉我们的首席技术官时,他对发生的事情有了一个直接的假设:AWS正在拖累我。为了防止暴力攻击,在身份验证尝试失败过多的情况下,服务故意拒绝甚至是有效的凭证。这符合我们所看到的事实模式,也是我们能想出的最简单的解释。解决方案?一种简单的指数退避重试算法。但这并不是一个理想的解决方案。因为无法区分对具有无效凭据的请求的响应与对被阻止请求的响应,因此必须对这两种情况都应用重试,这意味着合法无效的凭据将在身份验证时造成相当大的延迟:我们如何知道凭据是否实际无效?也许我们只是被延迟了,所以别无选择,只能等待超过最大重试次数。真正能做的就是根据API调用的时间和地点修改重试算法。对于在后台运行的任务,通常可以进行大量重试和长时间延迟。但是,当处理来自用户的请求时,您必须使用很少的重试次数,并且用户可能会看到关于无效凭据的错误,并且必须重试。我应该在我的服务中实施这种延迟服务吗?不。这不是正确的方法™ 去做一些事情,而现在不是追随亚马逊的脚步的时候。无法区分合法的无效凭证与速率限制或tarpitting是一个严重的可用性问题。以下是AWS在防止暴力攻击的同时解决此问题的一些方法:当身份验证尝试过多时,百度ddos防御,返回不同的错误消息。当进行了太多身份验证尝试时,会引入网络延迟。要求调用者使用密钥派生函数处理请求签名(尽管这会降低所有请求的速度并增加CPU使用率)。使用密钥的时间足够长,以便暴力强制在计算上是困难的,并且没有任何延迟或延迟(只是正常的速率限制,以减少服务器负载)。请记住,这些密钥是自动生成的,用户不可能选择弱密码。或者,最好的解决方案:不要使用hmac进行身份验证!如果您使用HMACs进行身份验证,那么您就必须以明文形式存储密钥。到目前为止,我们还没有意识到存储明文密码是个坏主意吗?相反,sdkddos节点防御,生成一个非对称密钥对,将私钥授予用户,并仅将公钥存储在服务器上。假设您使用安全参数来生成密钥(您没有使用3的指数,是吗?)如果你使用一个安全的签名方案(我们可以避免教科书中的RSA),用户可以用这个密钥安全地签署请求,同时保证伪造签名在计算上是困难的(至少在我们拥有量子计算机之前……)。标题照片由Betsy Weber提供,flickr,CC by 2.0