首先,一些背景信息:众所周知,我正在为CodeIgniter实现一个身份验证+授权系统,到目前为止我算是成功了(可以这样说)。但是我遇到了一个非常棘手的问题(大多数身份验证库都没有完全处理过,但我坚持正确地处理它):如何智能地处理大规模、分布式、变量用户名的暴力攻击。
我知道所有常规的技巧:
- 限制每个IP/主机的失败尝试次数并拒绝攻击者访问(例如Fail2Ban) - 这已经不再起作用了因为僵尸网络变得更加聪明
- 结合上述方法使用已知的“坏”IP/主机的黑名单(例如DenyHosts)- 这依赖于僵尸网络对第一种方法的反应,他们越来越不会这样做
- IP/主机白名单与传统的身份验证结合使用(遗憾的是对于动态IP用户和大多数网站上的高换手率它毫无用处)
- 在一定的N分钟/小时内设置一个站点范围的限制,并在此之后将所有登录尝试进行节流(暂停)一定数量的分钟/小时(这会使DoS攻击变得更加容易)
- 强制要求所有用户使用数字签名(公钥证书)或RSA硬件令牌,并且不提供登录/密码选项(毫无疑问是一个坚如磐石的解决方案,但只适用于关闭、专用的服务)
- 实施超强密码方案(例如>25个无意义字符与符号 - 再次,对于普通用户来说太不实用了)
这些只是理论上可行的想法。还有很多垃圾想法可以轻松地打开网站(例如略微DoS攻击)。我想要的是更好的东西。所谓更好就是:
它必须安全(+),不会引入新漏洞,以防止稍微狡猾的机器人持续潜伏。
它必须自动化。如果需要人工操作员来验证每个登录或监视可疑活动,则在实际应用环境中无法工作。
它必须适用于主流web应用程序(即高承载量、高流量和可以由非程序员执行的开放注册)。
不能妨碍用户体验,以至于普通用户会感到恼怒或沮丧(并可能放弃该网站)。
不能涉及小猫,除非它们是真的很安全的小猫。
(+) 通过“安全”,我指的是至少与偏执用户保持密码机密性的能力一样安全。
所以 - 让我们听听吧!你会如何做?你是否知道我没有提到的最佳实践(哦,请说你有)?我承认我有自己的想法(结合第3和第4个想法),但在让真正的专家发言之前,我会尴尬的;-)