我目前正在强化我的网络应用程序的安全层,我对登录暴力保护的实施有一些疑问:
我应该使用什么存储来存储每个用户/ IP登录失败的计数器?如果一个简单的APC / Memcache条目足够,或者它是否需要更稳定和持久的存储方法,还意味着每次登录时都要额外的SQL查询或文件写入?甚至将它们存储在会话条目中(我的会话由Memcache处理,所以它完全相同)。
关于系统范围计数器的相同问题(为了在分布式暴力破解尝试的情况下触发登录锁定或限制......)?我认为这里的持久性更为关键,但它也意味着每次登录时都会查询/写入。
对于检测到的登录强力尝试,适当的返回响应是什么?如果我返回404错误,503服务不可用?甚至通过DROPing进一步深入甚至通过IPTables / Netfilter攻击攻击者IP?我说的是一个真正检测到的蛮力尝试,而不是用户因某些登录而失败,因为他无法回想起他的通行证。
我原本以为缓存存储(APC / Memcache)足以存储计数器,但我担心缓存可能因为什么原因而失败,使得这个防御层无效。
对于其他所有注意事项,我已经阅读了一些不错的帖子,例如What-is-the-best-distributed-brute-force-countermeasure和Number-of-attempts-to-brute-force-an-average-password,但随时可以提出任何建议,我们将不胜感激。
答案 0 :(得分:0)
首先,您必须确定正确的数据范围,然后会受到速度和优化的困扰。
正如您所说,缓存存储可能会失败。这清楚地表明您的数据范围比缓存更广。因此,您不应该将它们存储在那里。数据库是一个很好的选择。
现在,如果你担心速度(你应该这么做),现在是时候优化这个过程了。您已经有一个缓存层,因此使用它来缓存这个额外的读取查询。另一方面,您不应该对额外的更新查询感到困扰,因为这是一个不影响整体用户体验的特殊情况。
关于你的第三个问题,对检测到的强力企图的响应类型无关紧要。重要的是时间:例如,延迟20秒响应。这应该足以在这一生中使暴力成为不可能。