第一,一个小小的背景:这不是什么秘密,我实现的授权+验证系统用于笨,迄今为止我赢(说).但我遇到一个很不平凡的挑战(一个最auth库小姐完全,但我坚持要求在处理它正确地):如何处理与智能 大规模、分布变用户名的暴力攻击.

我知道所有常用的技巧:

  1. 限制性的尝试失败的每个IP/主机 并剥夺罪犯的访问(例如Fail2Ban)-其中不再起作用 由于僵尸网络具有增长更聪明
  2. 结合上述一个 黑名单上的已知的"坏"IPs/主机 (例如点对点文件传输协议)-它依赖于僵尸网络下降#1, 它们越来越不
  3. IP/主白名单 结合传统的认证(可悲的是无用动态知识产权用户和高流失率,在大多数网站)
  4. 设置一个 减的限制 上#失败的尝试,在N钟的/小时期间,以及限制(悬挂)所有登录尝试后一分钟数/小时(用的问题,DoS攻击你变成僵尸网络的儿童游戏)
  5. 强制性的 数字签名 (公共钥匙证书)或RSA的硬件标记的所有用户没有login/password选项(如果问题没有一个坚实的解决方案,但只有实际用于封闭、专用服务)
  6. 强制执行 超强的方案的密码 (例如>25废话角色与符号-再次,也不适用于休闲的用户)
  7. 和最后, 验证码 (它可以工作,在大多数情况下,但是令人讨厌的用户和 几乎毫无用处 对一个 确定的,足智多谋的攻击)

现在,这些只是理论上可行的想法。还有 很多 垃圾的想法,打击将网站的开阔(例如到微不足道DoS攻击).我想要是更好的东西。并且通过更好的,我的意思是:

  • 它必须是安全的(+)对DoS和暴力攻击,并且不会引入任何新的漏洞,可能会允许一个稍加鬼祟机器人继续经营下的雷达

  • 它必须自动化。如果它需要一个人工操作员核实每个登录或监测可疑的活动,这是不要工作,在一个真正的世界方案

  • 它有可行的主流网页使用(ie。高流失、高容量和开放注册,可以通过执行非程序员)

  • 它可以不妨碍用户体验到那里休闲用户将获得厌烦或沮丧(和潜在的放弃的站点)

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

(+) 通过'安全'的,我的意思是至少作为安全作为一个偏执的用户的能力,以保持他的密码的秘密

这样-让我们听到它! 你会怎么做呢?你知道一个最佳做法,我没有提到(哦,请说,你做的)?我承认我有一个想法我自己的(合并的想法,从3和4),但是我会让真正的专家发言之前尴尬自己;-)

有帮助吗?

解决方案

所有的权利,足够的拖延;这是什么我来了这么远

(对不起,长员额。是勇敢的,朋友,这次旅行将是值得的)

相结合的方法3和4从原来的职位变成一种'模糊或动态白名单,然后-这里是招 不阻止非白名单IPs,只是限制他们到地狱和回.

注意,这一措施 意味着阻止这种非常特定类型的攻击。在实践中,当然,它的工作与其他最佳做法的方法来验证:固定用户名,限制每IP限制,代强制执行强密码政策,受cookie登录,散列的所有密码等效之前,为他们节省,从不使用安全问题,等等。

假设有关攻击的情况

如果攻击者的目标是可变的用户名,我们的用户名,限制不火。如果攻击者使用的是一个僵尸网络或访问一个大IP范围内,我们的知识产权的限制是无能为力的。如果攻击者已经预先刮我们的userlist(通常可以在开放注册网页服务),我们不可能检测一个正在进行的攻击基于数量的用户找不到'错误。如果我们执行限制性的系统范围(所有用户名,所有IPs)限制,任何这种攻击将DoS我们的整个网站的持续攻击加的限制期。

因此,我们需要做些别的事情。

第一部分的对策:白名单

我们可以相当肯定的是,攻击者是不够的检测和动态欺骗的IP地址的几万用户的(+).这使得 白名单 可行的。换句话说:对于每个用户,我们储存的列表(hashed)IPs从其用户以前(最近)登录。

因此,我们的白名单方案将作为一个锁着的"大门",其中一个用户必须接从他的一个公认的'良好'IPs以登录。暴力攻击在这个"大门"将几乎是不可能的(+).

(+)除非攻击者'拥有'的服务器,我们所有用户的盒子,或者连接的本身--而在这些情况下,我们不再有'认证'的问题,我们有一个真正的特权大拉的-塞FUBAR情况

第二部分的反措施:系统范围的限制 无法识别的IPs

为了使一个白名单的工作对于开放注册网服务,用户交换的电脑经常和/或连接,从动态IP地址,我们需要保持一个'猫的门打开连接的用户从未被识别的IPs。诀窍就是设计门的这么僵尸网络得到坚持,因此合法用户得到困扰 尽可能少.

在我的方案,这是通过设置一个 非常 限制性最大数目的登录失败的尝试,通过未经批准的IPs通过,比如说,一个3小时的时间(可能是明智的,使用较短或较长的期间根据服务的类型),并使这一限制 全球, ,即。为所有用户账户。

即使是一个缓慢(1-2分钟之间的尝试)蛮力将检测并阻碍了迅速和有效地使用这种方法。当然, 真的很慢 暴力可能仍被忽视,但太缓慢的速度失败的非常有目的的暴力攻击。

我希望能够完成与这个限制的机制是,如果达到最大限制,我们的'猫的门猛地关闭了一段时间,但我们的大门仍然是开放的合法用户连接的通常意味着:

  • 无论是通过连接从一个他们认识到IPs
  • 或者通过使用持久性登录cookie(从任何地方)

唯一合法的用户将受到影响在一次攻击-ie。同时限制被激活了-将用户没有持久的登录cookie谁是记录在从一个不知名的位置或动态IP。这些用户无法登录到限制了(这可能需要一段时间,如果攻击者保持他的僵尸网络的运行,尽管限制).

要能让这小子集用户要挤过无密封的猫门,甚至在机器人仍然骂个不停,我就会采用一个备份登录的形式与一个验证码。所以,当你显示"对不起,但是你不能登陆从这个IP地址的时刻"的信息,包括一链接,说"安全备份登录的人类只有(机器人:没有说谎)".玩笑开在一边,当他们点击链接,给他们一个验证码-验证登录的形式,绕过的站点范围的限制。这样,如果他们是人,知道正确的登录+password(和能够阅读的验证码),他们将 从来没有 被拒绝的服务,即使他们是从一个未知的主机和未使用的自动登录的cookie。

哦,只是澄清:因为我不认为验证码是一般恶,"备份"登录的选择 出现 虽然限制是活动.

不可否认的是,一个持续的攻击一样,将仍然构成一种形式的DoS攻击,但与所述系统的地方,这只会影响我怀疑是一个很小的部分用户,即人民不使用的"记住我"小甜饼和巧日志记录中,同时袭击发生的事情并不记录在任何其常IPs和谁不能读验证码。只有那些可以说没有所有这些标准的具体和机器人 真倒霉 残疾人将可以转身就走在一个机器人攻击。

编辑: 其实,我认为的一种方法来让我们甚至验证码-挑战,用户通过在'封锁':相反的,或者作为补充,对备份验证码登录用户提供的选择有一个单使用中,用户的具体锁定的代码发送到他的电子邮件,他随后可以用来绕过限制。这绝对跨越我心烦'的阈值,但因为它仅仅用作一个 去度假 小组用户,而且由于它还在跳动被锁定了你的账户,这将是可接受的。

(此外,请注意 没有 这种情况发生,如果攻击是任何不那么复杂的比讨厌的分布式版本我在这里描述。如果攻击的是来自仅有几IPs或者只打几个用户名,它将阻碍了早得多,并与 没有 站点范围的后果)


所以,这是对策,我会实现我的身份验证库,一旦我相信,它的声音和没有一个更简单的解决方案,我已经错过了。事实上,有很多微妙的方式做事情是错误的安全,我不上作出错误的假设或无可救药的缺陷的逻辑。所以请,任何和所有反馈意见、批评和改进的细微之处等。高度赞赏。

其他提示

一些简单步骤:

黑名单中的某些共同的用户名,并将它们用作一种蜜罐。管理、客,等等。不要让任何人创建的账户与这些名称,所以如果有人试图记录它们在你知道这是别人在做的事情,他们不应该。

确保任何人都有真正的力量在该网站有一个安全密码。需要管理员/主持人要有更密码的字母、数字和符号。平凡拒绝简单的密码从普通用户的解释。

一个最简单的事你能做的就是告诉人们,当有人试图登陆自己的帐户,并给他们一个链接到报告的事件如果不是他们。一个简单的信息时,他们登录像"有人试图登入你的帐户在4:20周三等等。点击,在这里,如果这不是你。" 它可以让你保留一些统计数据的攻击。你可以加强监测和安全措施如果你看到有的突然增加欺诈性的访问。

如果我了解莫的暴力攻击当,则一个或更多的用户名是试图连续进行。

有两个建议,这些建议,我不认为我已经看到在这里:

  • 我一直认为,标准做法是要有一个短暂的拖延(第二次或以后)每个错误的登录为每个用户。这阻止了暴力,但我不知道怎么长一秒钟的延迟就会保持一词典攻击在海湾。(字典中的10 000名字==10000秒==大约3小时。嗯。不够好。)
  • 而不是一个站点范围的减慢,为什么不用户的名字节流。油门变得越来越苛刻的与各个错误的尝试(至多的限制,我猜是这样真正的用户仍然可以登录)

编辑:在回应意见在一个用户名门:这是一个用户名专门没有关来源的攻击。

如果用户名是受到限制,那么即使一个协调一致的用户名攻击(多IP,单猜每IP,同的用户名)会被抓住。个人用户名是保护通过节流,即使攻击者都是免费的,试试另一个用户/用户通过的超时。

从攻击者的观点,在此期间超时你可能可以采取的第一时间想在100码的密码,并将很快发现的一个错误密码的每个帐户。你可能只可以使50第二猜测用于同一时间期限。

从一个用户账户的观点,它仍然需要同样平均数的猜测来打破密码,即使猜测是来自多个来源。

对袭击者,在最好的,它将以同样的努力要打破的100账户,因为这将1的账户,但因为你没有限制的网站上广泛基础,可以提升油门相当迅速。

额外精炼:

  • 检测Ip地址,是猜测多个帐户-408请求超时
  • 检测Ip地址,是猜测相同的帐户-408请求超时之后,一大(说100)多猜测。

UI的想法(可能不适合在这方面),这也可能改善上述:

  • 如果你是在控制设置密码,然后显示出用户 如何强他们的密码 鼓励他们挑选一个更好的。
  • 如果你是在控制的登录名 页面, 后一个小(说10)号猜测的一个单一的用户名,提供一个验证码。

有三个因素的认证:

  1. 一个用户 知道 东西(即,一个密码)
  2. 一个用户 东西(即,一个关键离岸价格)
  3. 一个用户 东西(即,视网膜扫描)

通常,网站只强制执行政策#1.即使大多数银行只强制执行政策1.他们转而依靠一种"知道其他的东西"的方法对两个因素认证。(即:一个用户知道自己的密码和他们的母亲的娘家姓名。) 如果你能,这是一种添加在第二个因素的认证是不是太困难。

如果你可以产生大约256人物的随机性的,你能结构,在一个16×16表,然后要求的用户要给你的价值在表格的细胞-14,例如。当用户签名了或改变了他们的密码给他们的表,并告诉他们打印它和保存。

困难与这种做法是,当一个用户忘记他们的密码,他们会的,你不能只是提供标准"回答这个问题,并放在一个新的密码",因为这容易受到暴力。还有,你不能重新设置并通过电子邮件发送的新的一个,因为他们的电子邮件可能会受到损害。(参见:Makeuseof.com 和他们的被盗域。)

另一个想法(其中涉及小猫),是什么BOA呼吁SiteKey(我认为他们的商标的名称)。简单的说,你有用户上的一个图像时,他们注册,并且当他们试图登录,要求他们挑选他们的形象出来的8个或15个(或多个)的随机的。因此,如果一个用户上传照片的小猫,从理论上说只有他们知道这张照片是他们出的所有其他的小猫(或花或什么的).只有真正的vunerability这种方法已为人中间的攻击。

一想法(没有小猫虽然),以追踪Ip地址,用户访问系统,并要求他们执行额外的认证(验证,挑一只小猫咪,挑选的一个关键,从这个表)时,他们的日志在从一个地址,他们没有。此外,类似于免费允许用户查看他们在那里已登录在最近。

编辑、新的想法:

另一种方式验证登录尝试是为了检查用户是否已经从登录网页。你不能检查推荐,因为它们可以轻易伪造。什么你需要的是设置一个关键在_SESSION var当用户意见的登录网页,然后检查,以确保关键的存在,当他们提出他们的登录的信息。如果机器人不提交从登录网页,它将不能够登录。你也可以促进这一涉及javascript过程中,无论是通过利用它来设置一个饼干,或者添加一些信息的形式之后装载。或者,可以分裂成为两个不同的提交(即用户进入自己的用户名,提交,然后在一个新的页面进入他们的密码,并提交一次。)

钥匙,在这种情况下,是最重要的方面。一个共同的方法产生的它们是一些的组合用户的数据,他们的知识产权,以及时提交。

我必须问您是否已经做成本-效益分析这个问题;这听起来像你在试图保护自己免受攻击者有足够的网络存在猜测一些密码,在发送可能3至5要求的每IP(因为你已经驳回了IP限制).多少(大约)将这种攻击的成本?它是更昂贵的比值的帐户你在试图保护?多少个庞大的僵尸网络希望你有什么?

答案可能没有-但如果它是的,我希望你得到帮助从一个安全专业人员的一些排序;编程技能的(和计算器的分数)不相关的强烈的安全知识。

我以前回答的一个非常类似的问题在 我怎么可以门户登录尝试在PHP.我会重申的建议的解决方案,因为我相信你们许多人会发现它的信息和有用的看到一些实际代码。请裸记住,使用验证可能不是最佳解决方案由于越来越精确算法中正在使用验证的主力部队现在:

你不能简单地防止DoS攻击的链接方式限制下,一个单一知识产权或用户名。地狱,你甚至不能真正防止迅速火登录尝试使用这种方法。

为什么? 因为攻击可以跨越多个IPs和用户账户,为了绕过你的限制的企图。

我已经看到发布在其他地方,最理想的是你应该跟踪所有登录失败的尝试跨越的网站,并使他们有时间戳,也许是:

CREATE TABLE failed_logins(
    id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(16) NOT NULL,
    ip_address INT(11) UNSIGNED NOT NULL,
    attempted DATETIME NOT NULL
) engine=InnoDB charset=UTF8;

决定在某些拖延的基础上 整体 数登录失败的在给定的时间量。你应该基本上统计数据拉从你的 failed_logins 表,因为它会 随着时间改变 根据用户的数量和如何他们中的许多人可以回忆(和类型)他们的密码。


10 failed attempts = 1 second
20 failed attempts = 2 seconds
30 failed attempts = reCaptcha

查询该表上每个登录失败的尝试找到数目的登录失败的一定时期内的时间,说15分钟:


SELECT COUNT(1) AS failed FROM failed_logins WHERE attempted > DATE_SUB(NOW(), INTERVAL 15 minute);

如果试图通过定期的时间结束你的限制,无论是强制执行限制或武力的所有用户的使用验证(即验证码),直到这些失败的尝试,在给定的时间期低于该阈值。

// array of throttling
$throttle = array(10 => 1, 20 => 2, 30 => 'recaptcha');

// assume query result of $sql is stored in $row
$sql = 'SELECT MAX(attempted) AS attempted FROM failed_logins';
$latest_attempt = (int) date('U', strtotime($row['attempted']));
// get the number of failed attempts
$sql = 'SELECT COUNT(1) AS failed FROM failed_logins WHERE attempted > DATE_SUB(NOW(), INTERVAL 15 minute)';
// assume the number of failed attempts was stored in $failed_attempts
krsort($throttle);
foreach ($throttle as $attempts => $delay) {
    if ($failed_attempts > $attempts) {
        // we need to throttle based on delay
        if (is_numeric($delay)) {
            $remaining_delay = time() - $latest_attempt - $delay;
            // output remaining delay
            echo 'You must wait ' . $remaining_delay . ' seconds before your next login attempt';
        } else {
            // code to display recaptcha on login form goes here
        }
        break;
    }
}

使用验证码在某一阈值将确保这一攻击从多方面将是 最小化 和正常的网站的用户会不会遇到重大延误合法登录失败的尝试。我不能保证预防,因为它已经扩展后,验证码是可以被捣毁。还有替代解决方案,也许是一个变体"的名称,这种动物",这可能相当不错的工作作为一种替代。

总结斯'方案进入一个伪状态过渡图/规则库:

  1. user+password->项
  2. 用户+!密码->拒绝
  3. 用户+known_IP(用户)->前门 // never throttle
  4. 用户+unknown_IP(用户)->catflap
  5. (#拒绝>n)通过catflaps(网站)->门catflaps(网站) // slow the bots
  6. catflap+门+密码+验证码->项 // humans still welcome
  7. catflap+门+密码+!验证码->拒绝 // a correct guess from a bot

意见:

  • 从来没有油门前门。该Elbonian国家警察有计算机,在你的房子,但是无法拷问你。暴力是一个可行的方法从你的计算机。
  • 如果你提供一个"忘你的密码?"的链接,然后,你的电子邮件帐户成为攻击的一部分表面。

这些意见涵盖不同类型的攻击来你正在尝试反击。

看起来你正在尝试来防御 缓慢的分布式暴力.不那么多,你可以做的。我们正在使用公钥基础设施并没有密码登录。它可以帮助,但是如果你的客户机会工作站每隔一段时间,这不是非常适用。

免责声明:我的工作对于两个因素的公司,但不是这里堵塞。这里是一些意见。

饼干可能被盗用的XSS和浏览器的安全漏洞。用户通常变化的浏览器或清除他们的饼干。

源IP地址同时动态变量和spoofable.

验证码是有用的,但不进行身份验证的特定人。

多种方法可以结合成功的,但是良好的味道肯定是在订单。

密码复杂性是好的,任何基于密码的严重依赖于密码具有足够的熵。恕我直言,一个强大的密码写下来在安全理位置优于弱的密码存储器。人们知道如何评价安全的纸面文件比他们知道如何图的有效熵在他们的狗的名字时,作为一个密码,用于三个不同的网站。考虑给予用户的能力来印刷出或大或小页全的一次性使用密码.

安全问题,如"什么是你的高学校吉祥物"是主要的另一个糟糕的形式"你知道的东西",他们大多数都很容易猜测或者完全在公共领域。

正如你所指出的,限制背登录尝试失败是贸易之间的关防止暴力攻击并轻松的配量帐户。积极的闭锁政策的可能反映出一种缺乏信心密码熵。

我个人看不到的好处实行密码失效的网站上。攻击者得到你的密码有一次,他可以改变它然后和遵守这项政策只是作为容易,你可以。也许是一个好处是,用户可能也注意到越早,如果攻击者的变化帐户密码。甚至更好的是,如果用户以某种方式通知之前攻击者获得了访问。消息,如"N失败的尝试,因为最后的登录"是有用的,在这个方面。

最好安全带从第二个因素的认证,这是out-of-band相对于第一个。就像你说的硬件标记的"你拥有的东西"是巨大的,但许多(不是所有)具有实际管理相关的开销它们的分布。我不知道的任何生物特征"什么是你的"解决方案良好的网站。一些两个因素的解决方案的工作与openid提供者,一些有PHP/Perl/Python软件开发工具包。

我最高的建议是简单地确保你 让用户通知了 坏的登录尝试以自己的账户-- 用户将可能采取的强度的密码更严重的是,如果他们提出证据,证明某人实际上是试图获得进入他们的帐户。

实际上我抓住了有人侵入了我弟弟的myspace帐户,因为他们曾试图进入谷歌帐户设置对于他和使用的重我的密码通过电子邮件的功能...哪去了我的邮箱。

  1. 什么大约需要一个一次性密码才能进入自己的正常密码?这将使它非常明显的,某人是在攻击之前他们有许多机会猜到的主要密码?

  2. 保持一个全球数/率的登录失败-这是本指标进行攻击-在攻击期间可以更严格的有关登录失败例如禁止IPs更为迅速。

我不相信有一个完美的回答但我会倾向于方法的基础上试图混淆的机器人如果攻击感测。

离我的心灵:

切换到备用登陆屏幕上。它具有多用户名和密码空白,真的出现,但只有其中之一是在正确的地方。域名是 随机的-一届会议的关键是起发送与登陆界面,服务器然后可以找出哪些领域是什么。成功或失败,然后丢弃所以你不能试着重放的攻击--如果你拒绝密码,他们得到一个新的session ID.

任何形式提交的数据在一个领域是错误的假定是从一个机器人--登录失败,期间,知识产权是受到限制。确保随机场的名字不匹配合法的域名的所有人利用的东西记得密码是不是误导。

接下来,怎么样一种不同的验证码:你有一系列的问题,不会导致问题的人。然而,它们 随机的。当进攻开始每个人都给出了问题1中。一个小时后,问题1被丢弃,永远不会被再次使用和每个人都有问题#2等。

攻击者不能探测到下载的数据库投入到他的机器人,因为一次性性质的问题。他已经发出新的指令,以他的僵尸网络的一个小时内有任何能力做任何事情。

由于几个人包括验证作为后备人力的机构,我加入一个较早的计算器问题和线上验证的有效性。

已验证码被破解/侵/OCR会/败/坏了吗?

使用验证并不限制改进自己的限制和其他建议,但我认为这些答复,包括验证作为一种后退,应考虑人类的基础的方法提供给人们打破安全。

你可能也门根据强度的一个用户密码。

当一个用户登记或改变它们的密码计算出一个强度评价他们的密码,说之间1和10。

像"密码"的分,1而"c6eqapRepe7et*Awr@ch"可能的分数9或10和较高分数的限制。

第一个答案我通常听到的时候问这个问题是改变口,但是要忘记,而只是禁止IPv4。如果你只允许客户从IPv6网络找你不再祈求的简单网络的扫描和攻击者将诉诸DNS lookups.不运行在相同的地址作为Apache(AAA)/Sendmail(MX->AAAA)/有什么你给了大家(AAA).请确保您的区域不可能xferd,等待找你让你区被下载通过任何人吗?

如果机器人找到你的服务器安装新的主机名称,只是在前面加一些胡言乱语你的名,并改变你的地址。离开旧的名字,甚至设置**蜜罐的名称的机器人净超时。

*测试你的逆转(PTR)记录(下ip6。arpa。) 看如果他们可用于零/4的有记录VS/4,不。E.I.通常ip6。arpa会有-32"。"s在一个地址而试图与最后的几个缺失可能会逃避网络块,记录VS的人,不。如果你采取进一步变得可以跳过大部分的地址空间。

在最糟糕的情况下,用户必须安装一个IPv6隧道,这是不喜欢他们要去尽VPNing到DMZ...虽然人们不禁要问,为什么这不是第一个选项。

还Kerberos是很酷,但恕我直言LDAP的打击(有什么技术上的错NISPlus?我读过那太阳决定,用户想LDAP,因此他们放弃了NIS+).Kerberos的工作没有LDAP或新谢克尔,只有管理的用户使用的主机上的主机为基础。使用Kerberos给你一个容易使用,如果不是自动的,PKI。

点晚了,在这里,但我想,假设一个艰苦的情况下-攻击者使用了大量的随机IPs的,随机的用户名和一个随机的密码选择的自说一个列表中的10 000名最受欢迎的。

有一件事你能做到的,特别是如果该制度似乎在攻击中,有很多密码错误的尝试,对系统和尤其是如果密码被低熵是要求一个次要问题,如什么是您的父母第一名称,例如。如果攻击者打了一万个账户的密码密码1'有一个很好的机会,他们会得到了很多,但他们的几率也越来越姓名的权利将会减少成功显着。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top