最佳分布式暴力破解对策是什么?

158

首先,一些背景信息:众所周知,我正在为CodeIgniter实现一个身份验证+授权系统,到目前为止我算是成功了(可以这样说)。但是我遇到了一个非常棘手的问题(大多数身份验证库都没有完全处理过,但我坚持正确地处理它):如何智能地处理大规模、分布式、变量用户名的暴力攻击

我知道所有常规的技巧:

  1. 限制每个IP/主机的失败尝试次数并拒绝攻击者访问(例如Fail2Ban) - 这已经不再起作用了因为僵尸网络变得更加聪明
  2. 结合上述方法使用已知的“坏”IP/主机的黑名单(例如DenyHosts)- 这依赖于僵尸网络对第一种方法的反应,他们越来越不会这样做
  3. IP/主机白名单与传统的身份验证结合使用(遗憾的是对于动态IP用户和大多数网站上的高换手率它毫无用处)
  4. 在一定的N分钟/小时内设置一个站点范围的限制,并在此之后将所有登录尝试进行节流(暂停)一定数量的分钟/小时(这会使DoS攻击变得更加容易)
  5. 强制要求所有用户使用数字签名(公钥证书)或RSA硬件令牌,并且不提供登录/密码选项(毫无疑问是一个坚如磐石的解决方案,但只适用于关闭、专用的服务)
  6. 实施超强密码方案(例如>25个无意义字符与符号 - 再次,对于普通用户来说太不实用了)
  • 最后,CAPTCHA(虽然在大多数情况下有效,但对用户很烦人,而且几乎毫无用处来对抗一个有决心、有资源的攻击者
  • 这些只是理论上可行的想法。还有很多垃圾想法可以轻松地打开网站(例如略微DoS攻击)。我想要的是更好的东西。所谓更好就是:

    • 它必须安全(+),不会引入新漏洞,以防止稍微狡猾的机器人持续潜伏。

    • 它必须自动化。如果需要人工操作员来验证每个登录或监视可疑活动,则在实际应用环境中无法工作。

    • 它必须适用于主流web应用程序(即高承载量、高流量和可以由非程序员执行的开放注册)。

    • 不能妨碍用户体验,以至于普通用户会感到恼怒或沮丧(并可能放弃该网站)。

    • 不能涉及小猫,除非它们是真的很安全的小猫。

    (+) 通过“安全”,我指的是至少与偏执用户保持密码机密性的能力一样安全。

    所以 - 让我们听听吧!你会如何做?你是否知道我没有提到的最佳实践(哦,请说你有)?我承认我有自己的想法(结合第3和第4个想法),但在让真正的专家发言之前,我会尴尬的;-)

    16个回答

    1

    我最强烈的建议是确保您通知用户有关其帐户的错误登录尝试--如果向他们展示有人实际上正在尝试进入他们的帐户,用户可能会更加认真地考虑其密码的强度。

    我曾经抓到一个黑客入侵我兄弟的MySpace账户,因为他们试图进入我为他设置的Gmail账户并使用“通过电子邮件重置我的密码”功能...该邮件发送到了我的收件箱。


    0
    通常在问这个问题时,我听到的第一个答案是更改端口,但是忘记它,只需禁用IPv4。如果您仅允许来自IPv6网络的客户端,则不再易受简单网络扫描和攻击者将诉诸DNS查找。不要在与您的Apache(AAAA)/ Sendmail(MX-> AAAA)/您向所有人提供的内容(AAAA)相同的地址上运行。确保您的区域无法被转移,等待一下,您允许任何人下载您的区域?
    如果机器人发现您的服务器设置了新的主机名,请在主机名前添加一些无意义的字符,并更改您的地址。保留旧名称,甚至为机器人网络设置蜜罐名称以超时。
    测试您的反向(PTR)记录(在ip6.arpa下),以查看它们是否可以用于零散/ 4的记录与不记录的记录。即通常情况下,ip6.arpa在地址中会有约32个“。”,但是尝试省略最后几个可能会逃避具有记录与不具有记录的网络块。如果您进一步进行,就可以跳过大部分地址空间。

    在最糟糕的情况下,用户将不得不设置IPv6隧道,这并不像他们必须走到VPN进入DMZ那么远...虽然人们想知道为什么这不是第一个选项。

    此外,Kerberos很酷,但我认为LDAP不行(NISPlus有什么技术上的问题?我读过Sun决定用户想要LDAP,因此他们放弃了NIS+)。 Kerberos可以在没有LDAP或NIS的情况下正常工作,只需逐个主机管理用户即可。使用Kerberos可以轻松使用PKI,尽管不是自动化的。


    0

    您还可以根据用户密码的强度进行节流。

    当用户注册或更改密码时,您可以为其密码计算一个强度评分,例如1到10之间。

    例如,“password”得分为1,而“c6eqapRepe7et*Awr@ch”可能得分为9或10,评分越高,节流启动所需时间就越长。


    3
    我理解这个想法,但这样做会间接地泄露关于密码的信息,让攻击者知道一个密码是否值得去破解。这可能听起来有些理论化,但很多用户会重复使用相同的密码。所以如果我想要进入Strong_Throttling_Website.com,我可以随意攻击(特权)账户,直到找到一个名为“Freddy”的用户,他的密码较弱(即早期限制),然后去Less_Secure_Website.edu并在那里对Freddy的账户进行简单的字典攻击。虽然需要一些操作,但在实践中肯定可行。 - Jens Roland

    0

    我相信没有完美的答案,但如果检测到攻击,我的倾向是试图使机器人感到困扰。

    从我现在能想到的方案:

    切换到备用登录界面。它有多个用户名和密码空格,看起来确实存在,但只有一个是正确的。这些字段名是随机的——会将会话密钥与登录屏幕一起发送,服务器可以找出哪些字段是什么。无论成功还是失败,然后都会被丢弃,因此您无法尝试重放攻击——如果拒绝密码,则会得到新的会话ID。

    任何在错误字段中提交数据的表单都被认为是来自机器人——登录失败,而且该IP受到限制。确保随机字段名称永远不与合法字段名称匹配,以便使用记住密码的工具的人不会被误导。

    接下来,如何使用不同类型的验证码:您将获得一系列问题,这些问题对于人类不会造成问题。但是,它们不是随机的。当攻击开始时,每个人都会获得问题#1。一个小时后,问题#1被丢弃,永远不会再次使用,然后每个人都会得到问题#2,依此类推。

    由于问题的一次性特性,攻击者无法探测下载数据库并放入他的机器人。他必须在一小时内向他的僵尸网络发送新的指令,才能有任何能力执行任何操作。


    备用登录界面听起来比机器更容易让人混淆。当然,我们假设攻击者事先已经检查过我们的安全措施。他可以轻松地调整他的爬虫程序以找到正确放置的字段。 - Jens Roland
    人工审核问题以前已经做过了,而且效果不是很好。在攻击期间,一个人类机器人网络操作员每小时回答一个问题(之后新的答案将传播到机器人)是相当可行的。 - Jens Roland
    你没有理解重点。攻击者无法提前检查,因为只有在攻击出现时才会显示额外的防御措施。 - Loren Pechtel
    当然,人类可以看到问题是什么 - 但他必须将其传达给所有的机器人。这是一条通信路径,使得更容易摧毁僵尸网络。 - Loren Pechtel
    我不认为我误解了重点。我的意思不是他之前会发动攻击来检查我们的安全措施,而是他会阅读这个帖子并检查(公开的)源代码以寻找漏洞 :) - Jens Roland

    0

    有点晚了,但我在想,假设攻击者使用大量随机IP、随机用户名和从最流行的10000个密码列表中选择的随机密码等硬核手段。

    如果系统似乎正在遭受攻击,尤其是如果系统上有很多错误密码尝试,特别是如果密码熵值较低,您可以采取一些措施,比如问一个次要问题,例如“你父母的名字是什么”。如果攻击者尝试使用“password1”这样的密码来攻击一百万个帐户,他们很可能会成功攻击很多帐户,但他们也需要正确回答次要问题,这将大大降低他们的成功率。


    0

    由于一些人将CAPTCHA作为备用的人类机制,我正在添加一个早期的StackOverflow问题和关于CAPTCHA有效性的讨论线程。

    reCaptcha是否已经被破解/黑客攻击/OCR/击败/破坏?

    使用CAPTCHA并不限制您进行限流和其他建议的改进,但我认为包括CAPTCHA作为备选方案的答案数量应该考虑到那些试图突破安全性的人类方法。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接