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


151

首先,有一点背景知识:我正在为CodeIgniter实现auth + auth系统,这并不是什么秘密,到目前为止,我已经赢了(可以这么说)。但是我遇到了一个非常艰巨的挑战(大多数身份验证库都完全忽略了这一挑战,但是我坚持要正确处理):如何智能地应对大规模,分布式,可变用户名的暴力攻击

我知道所有常用的技巧:

  1. 限制每个IP /主机尝试失败的次数,并拒绝违规者访问(例如Fail2Ban)- 由于僵尸网络变得越来越聪明,这种访问不再有效
  2. 将上述内容与已知的“不良” IP /主机(例如DenyHosts)的黑名单相结合-依赖于僵尸网络排名第一的僵尸网络,它们越来越不会
  3. IP /主机白名单与传统身份验证结合在一起(对于动态IP用户和大多数网站上的用户流失率非常低)
  4. 在整个N分钟/小时的时间内对失败尝试的次数设置站点范围的限制,并在此之后的几分钟/小时内限制(挂起)所有登录尝试(问题是DoS攻击您成为僵尸网络的玩法)
  5. 强制性数字签名(公钥证书)或RSA硬件令牌,适用于所有没有登录/密码选项的用户(毫无疑问是坚如磐石的解决方案,但仅适用于封闭的专用服务)
  6. 强制执行超强密码方案(例如,> 25个带有符号的废话字符-再次对临时用户来说太不切实际)
  7. 最后,CAPTCHA(在大多数情况下都可以使用,但是使用户烦恼,并且对于坚定的,足智多谋的攻击者几乎毫无用处

现在,这些只是理论上可行的想法。有很多垃圾想法使站点大开眼界(例如,对琐碎的DoS攻击)。我想要的是更好的东西。更好的是,我的意思是:

  • 它必须具有抵御DoS和暴力攻击的安全性(+),并且不得引入任何新的漏洞,而该漏洞可能会使稍稍偷偷摸摸的bot继续在雷达下运行

  • 它必须是自动化的。如果它需要人工来验证每个登录名或监视可疑活动,那么它将无法在实际情况下工作

  • 它对于主流Web使用必须是可行的(例如,非程序员可以进行的高流失,高流量和开放式注册)

  • 它不会将用户体验阻止到使临时用户感到烦恼或沮丧(并有可能放弃该网站)的程度

  • 除非小猫真的很安全,否则它不能涉及小猫

(+)“安全”是指至少与偏执狂用户对密码保密的能力一样安全

所以-让我们听听吧!你会怎么做?您知道我没有提到的最佳做法吗(哦,请说您同意)?我承认我确实有自己的想法(结合3和4的想法),但是在让自己尴尬之前,我会让真正的专家讲话;-)

Answers:


68

好吧,足够拖延;到目前为止,这是我想出的

(对不起,很长的篇幅。勇敢点,朋友,旅途值得)

将原始帖子中的方法3和4组合成一种“模糊”或动态白名单,然后-这就是窍门- 不阻止非列入白名单的IP,只是将它们限制在地狱之中

请注意,此措施旨在阻止这种非常特殊的攻击。当然,实际上,它可以与其他最佳身份验证方法结合使用:固定用户名限制,按IP限制,代码强制的强密码策略,无限制的cookie登录,在保存所有密码等效项之前对其进行哈希处理,从不使用安全性问题等

关于攻击场景的假设

如果攻击者针对可变用户名,则不会触发我们的用户名限制。如果攻击者正在使用僵尸网络或可以访问较大的IP范围,则我们的IP限制是无能为力的。如果攻击者已经预先抓取了我们的用户列表(通常是在开放注册的Web服务上可能),则我们无法根据“未找到用户”错误的数量来检测正在进行的攻击。而且,如果我们在整个系统范围内(所有用户名,所有IP)实施限制性限制,则任何此类攻击都将在攻击持续时间和限制时间段内对整个站点进行DoS。

因此,我们需要做其他事情。

对策的第一部分:白名单

我们可以确定的是,攻击者无法检测到并且动态地欺骗了我们数千名用户的IP地址。这使白名单可行。换句话说:对于每个用户,我们存储该用户(先前)登录过的(散列)IP的列表。

因此,我们的白名单方案将充当锁定的“前门”,其中用户必须从其公认的“良好” IP之一连接才能完全登录。对该“前门”进行暴力攻击几乎是不可能的(+)。

(+),除非攻击者“拥有”服务器,所有用户的主机或连接本身,并且在这种情况下,我们不再遇到“身份验证”问题,那么我们将拥有真正的特许经营权插头FUBAR情况

对策的第二部分:无法识别IP的系统范围限制

为了使白名单适用于开放注册的Web服务,在该服务中用户经常切换计算机和/或从动态IP地址进行连接,我们需要为通过未识别IP进行连接的用户保持“猫门”。诀窍是设计该门,以使僵尸网络陷入困境,从而使合法用户尽可能少受到打扰。

在我的方案中,这是通过设置一个非常严格的最大限制来实现的,该限制是由未经批准的IP在3小时的时间内设定的最大失败登录尝试次数(根据服务类型,使用较短或较长的时间可能更明智),并且使限制成为全局,即。对于所有用户帐户。

使用这种方法,即使是缓慢的(两次尝试之间只有1-2分钟)强力也会被检测到并快速有效地受到挫败。当然,仍然可能不会注意到真正缓慢的蛮力,但是太慢的速度会破坏蛮力攻击的目的。

我希望通过这种限制机制来实现的目的是,如果达到最大限制,我们的“猫门”猛然关闭一会儿,但是我们的前门仍然向通过常规方式连接的合法用户开放:

  • 通过从其公认的IP之一进行连接
  • 或通过使用永久性登录cookie(从任何地方)

遭受攻击的唯一合法用户-即。在启动节流时-将是没有永久登录cookie的用户从未知位置或使用动态IP登录。这些用户将无法登录,直到限制消失为止(如果攻击者尽管受到限制,攻击者仍保持其僵尸网络运行,则可能需要一段时间)。

为了使这小部分用户挤过原本被密封的猫门,即使机器人仍在敲门,我仍将使用带有CAPTCHA的“备份”登录表单。这样,当您显示“对不起,但您目前无法从该IP地址登录”消息时,请包含一个链接,内容为“ 安全备份登录-仅限人类(机器人:不说谎 ”。除了开个玩笑,当他们单击该链接时,请给他们提供经过reCAPTCHA身份验证的登录表单,该表单绕过了整个站点范围的限制。这样,如果它们是人为的并且知道正确的登录名和密码(并且能够读取验证码),则即使它们从未知主机进行连接并且未使用自动登录cookie ,也永远不会拒绝它们的服务。

哦,请澄清一下:由于我确实认为验证码通常是邪恶的,因此在节流处于活动状态时才会显示“备份”登录选项。

不可否认的是,像这样的持续攻击仍将构成DoS攻击的一种形式,但是使用所描述的系统,它只会影响到我怀疑只是一小部分用户的用户,即那些不使用网络攻击的用户。 “记住我” cookie,并且正巧在发生攻击时登录,并且不会从他们的任何常规IP登录并且无法读取验证码。只有那些拒绝所有这些条件的人-特别是机器人和真正不幸的残疾人-在机器人攻击期间会被拒绝。

编辑:确实,我想到了一种方法,甚至可以让受验证的用户在“锁定”期间通过:代替或作为备用验证码登录的补充,可以为用户提供一次性使用的选项,将特定于用户的锁定代码发送到他的电子邮件,然后他可以用来绕过限制。这肯定超过了我的“烦恼”门槛,但是由于它仅是一小部分用户的最后选择,并且仍然可以避免被锁定在您的帐户之外,因此可以接受。

(此外,请注意,如果攻击的复杂性不如我在此描述的讨厌的分布式版本,则不会发生任何情况。如果攻击仅来自几个IP或仅攻击了几个用户名,它将在更早的时候被阻止,并且不会对整个网站造成影响)


因此,这是我将在我的auth库中实现的对策,一旦我确信这是合理的,并且没有我错过的更简单的解决方案。事实是,有许多微妙的方法可以解决安全性方面的错误,而我也不能做出错误的假设或毫无希望的错误逻辑。因此,请您对所有反馈,批评和改进,细微之处等表示高度赞赏。


1
也许您可以为每个用户生成一个“专用”密码,如果该密码处于锁定模式(并且他们正在从新IP连接,等等),那么该专用密码过于复杂,无法进行暴力破解?
道格拉斯·里德

1
这可能行得通,但是前提是用户即使没有使用过密码也记住了这些密码(这些攻击类型并不常见,并且没有一个值得他精打细算的僵尸管理员会在被限制后长时间保持运行状态)。风险太大了,他们简直不记得了。
詹斯·罗兰

1
但是,一种绝对可行的方法是为这些用户提供“向我发送锁定代码”链接,使他们能够获得包含一次性使用的,特定于用户的令牌的电子邮件,从而使他们能够绕过登录。节流。
詹斯·罗兰

1
@阿卜丁:好主意,除了那是“参加军备竞赛”-即。与为字典攻击创建密码列表的人一起开始“谁能胜过谁”。我认为更好的方法是强制使用强密码策略,这样就不会存在弱密码
Jens Roland

1
@OrestisP .:您缺少分布式攻击的要点-每个IP的无效尝试次数极少,因此每个IP阻止都无法进行。此外,该问题还专门描述了自动蛮力攻击,因此1)攻击者不是人类,而是僵尸机器的僵尸网络(无法使用验证码登录);和2)攻击的暴力性质要求进行大量登录尝试才能确保成功,这意味着将验证码解决方案运到某地的一家血汗工厂是不可行的(尽管如果攻击者的资金充裕且确定,足够)。
詹斯·罗兰

17

一些简单的步骤:

将某些常用用户名列入黑名单,并将其用作蜜罐。管理员,来宾等...不要让任何人使用这些名称创建帐户,因此,如果有人确实尝试将其登录,则您知道这是某人在做的事,他们不应该这样做。

确保在网站上拥有真正力量的任何人都具有安全密码。要求管理员/主持人使用包含字母,数字和符号的更长密码。拒绝普通用户提供的简单密码并提供说明。

您可以做的最简单的事情之一就是告诉人们何时有人尝试登录他们的帐户,并给他们提供链接以报告事件(如果不是他们的话)。当他们登录时,出现一条简单的消息,例如“有人试图在星期三凌晨4:20登录到您的帐户。如果不是,请单击此处。” 它使您可以保留一些有关攻击的统计信息。如果发现欺诈性访问突然增加,则可以加强监视和安全措施。


好主意。我绝对打算实施一种自动密码策略,该策略会随着用户的特权级别而动态变化。蜜罐的想法可能适用于某些类型的攻击,但是如果攻击是分布式的,则阻止掉落的IP无效。
詹斯·罗兰

对于“上次尝试登录时间”而言,这对高级用户来说是个不错的策略(我敢打赌,为什么要这样做),但是它有两个缺点:(a)它不能解决入侵问题,仅报告可能已发生,并且(b),大多数用户只是不记得/不在意
Jens Roland

1
是的,蜜罐和用户报告更多地与信息收集有关。它们可能会提供一些有价值的指标,以让您知道是否/何时发生缓慢的蛮力攻击。
patros

2
对于蜜罐,难道不将任何不存在的用户名视为可疑总比仅使用固定的已知错误用户名列表好吗?您可能希望避免将用户名键入错误并且多次重试密码时没有发现错字的用户拒之门外,但我仍然认为有很多方法很有价值。您甚至可以通过添加用户时使用有效的用户名,名字,姓氏,电子邮件名等的变体构建大型的bloom过滤器或类似的数据结构,来避免某些“误报”。
R .. GitHub STOP HELPING ICE 2013年

11

如果我正确理解蛮力攻击的MO,则将连续尝试一个或多个用户名。

这里有两条我还没有看到的建议:

  • 我一直认为标准做法是在每个用户每次错误登录后都有短暂的延迟(一秒钟左右)。这阻止了蛮力,但是我不知道一秒钟的延迟会使字典攻击陷入困境。(字典10,000个单词== 10,000秒==大约3个小时。嗯。还不够好。)
  • 而不是整个站点的速度放慢,为什么不使用用户名限制。每次错误尝试都会使节流阀变得越来越严厉(我想这是一个极限,所以真正的用户仍然可以登录)

编辑:响应对用户名限制的评论:这是用户名特定的限制,不考虑攻击源。

如果限制用户名,那么甚至会引起协调的用户名攻击(多个IP,每个IP一次猜测,相同的用户名)。即使攻击者在超时期间可以自由尝试其他用户/密码,个人用户名也会受到限制。

从攻击者的角度来看,在超时期间,您可以首次猜测100个密码,并迅速发现每个帐户一个错误的密码。您可能只能在同一时间段猜测50秒。

从用户帐户的角度来看,即使猜测来自多个来源,也仍然需要相同的平均猜测次数才能破解密码。

对于攻击者而言,充其量来说,最多可以像破坏1个帐户一样破坏100个帐户,但是由于您没有在整个站点范围内进行限制,因此可以快速提高速度。

额外的改进:

  • 检测正在猜测多个帐户的IP-408请求超时
  • 检测猜测相同帐户的IP-经过大量(例如100次)猜测后408请求超时。

UI创意(可能不适用于这种情况),也可以完善上述内容:

  • 如果您可以控制密码设置,则向用户显示密码强度有多高,可以鼓励他们选择更好的密码
  • 如果您控制登录页面,则在对单个用户名进行少量(例如10次)猜测后,请提供一个验证码。

用户名限制和IP限制可以很好地抵抗固定用户名或固定IP攻击,并且它们确实使传统的字典攻击变得不可行。但是,如果攻击者不断更改用户名,他将在不触发用户名限制的情况下溜走。那就是我要反驳的
Jens Roland

2
谢谢你的编辑,贾梅什。现在我们在说。我喜欢408的想法。但是,即使严格执行用户名限制,攻击多个用户的僵尸网络仍然可以使用。与检查5000个用户的前1个密码相比,针对一个用户检查前5000个密码的成功率要低
Jens Roland

就像生日悖论一样。在一大群人中,许多人将使用不安全的密码,并且很可能会使用任何给定的流行密码。也将有很多像我这样的人不会被这种攻击所吸引。
David Thornley,2009年

2
实际上,我可能不得不重新检查上一次陈述的数学运算。一旦排除了前N个最常用的密码,用户拥有密码#(N + 1)的可能性就可能增加到足以使差异均匀的程度。尽管曲线可能足够陡峭,但事实并非如此
Jens Roland

9

认证包含三个因素:

  1. 用户知道一些信息(即密码)
  2. 用户东西(例如,钥匙扣)
  3. 用户某种东西(即视网膜扫描)

通常,网站仅执行策略1。甚至大多数银行也只执行策略1。相反,他们依靠“知道其他”方法进行两因素身份验证。(IE:用户知道他们的密码和他们母亲的娘家姓。)如果可以,添加第二个身份验证因素的方法也不太困难。

如果您可以生成大约256个字符的随机性,则可以在16×16的表中进行结构化,然后要求用户在单元格A-14的表中提供该值。当用户注册或更改密码时,请给他们表格并告诉他们将其打印并保存。

这种方法的困难在于,当用户忘记密码时,您将不能仅仅提供标准的“回答此问题并输入新密码”,因为这也容易受到暴力攻击。另外,您也无法重置它并通过电子邮件发送给他们新的电子邮件,因为他们的电子邮件也可能遭到破坏。(请参阅:Makeuseof.com及其被盗域。)

另一个想法(涉及小猫)是BOA所谓的SiteKey(我相信它们是该商标的商标)。简而言之,您让用户在注册时上传图像,并且当他们尝试登录时,请他们从8或15(或更多)随机图像中选择其图像。因此,如果用户上传了他们的小猫的图片,则从理论上讲,只有他们才能确切地知道所有其他小猫(或花朵或其他任何小猫)中的哪张照片。这种方法唯一真正的弱点是中间人攻击。

还有一个想法(虽然没有小猫),是跟踪用户用来访问系统的IP,并要求他们在从其避难所地址登录时执行其他身份验证(验证码,小猫,从此表中选择密钥)。没过 同样,类似于GMail,允许用户查看他们最近的登录位置。

编辑,新思路:

验证登录尝试的另一种方法是检查用户是否来自您的登录页面。您无法检查引荐来源网址,因为它们很容易被伪造。您需要的是在用户查看登录页面时在_SESSION var中设置一个密钥,然后在提交登录信息时检查并确保该密钥存在。如果Bot没有从登录页面提交,它将无法登录。您还可以通过在过程中使用javascript来简化此过程,或者使用它来设置cookie,或者在加载后向表单添加一些信息。或者,您可以将表单分为两个不同的提交(即,用户输入其用户名,进行提交,然后在新页面上输入其密码,然后再次提交。)

在这种情况下,关键是最重要的方面。生成它们的一种常见方法是将用户数据,其IP和提交时间进行某种组合。


我敢肯定还有很多,但是如果SiteKey的想法正是您所提到的,那么攻击者不必是MITM,他可以为该用户运行两次或三次登录尝试,然后选择在随机数之间重复。即使用户X的8-15张图片集是静态的,
Jens Roland

(续)选择正确的图像可能不会太难,因为人们倾向于选择可预测的图像类型(甚至包括他们自己的Flickr相册中的图像!)
Jens Roland

2
是的,我想到了昨晚我回家后提出的观点。我认为解决该问题的方法是:当用户登录并提供正确的密码时,显示其图像以及一些其他随机数。如果他们没有提供正确的密码,请显示一些随机数
davethegr8

1
图片+ 1,可能包含或不包含自己的图像。另外,我有另一个想法,请参阅文章中的编辑。但是,是的,这些想法有点困难/复杂。
davethegr8

1
这种“可能”有效,但我看到了几个问题。如果照片所有者删除图像会怎样?您如何确定返回的图像不会对用户有害?用户如何记住他们单击的位置?(似乎很难忘记)
davethegr8,2009年

7

我以前在“ 如何限制PHP中的用户登录尝试”上回答了一个非常类似的问题。我将在这里重申建议的解决方案,因为我相信很多人会发现它对于了解一些实际代码很有帮助。请切记,由于当今CAPTCHA破坏者正在使用越来越精确的算法,因此使用CAPTCHA可能不是最佳解决方案:

您不能简单地通过将限制链接到单个IP或用户名来防止DoS攻击。地狱,您甚至无法真正阻止使用此方法进行快速启动登录尝试。

为什么? 由于攻击可以跨越多个IP和用户帐户,因此可以绕过限制尝试。

我在其他地方看到过发布消息,理想情况下,您应该跟踪整个站点上所有失败的登录尝试,并将它们与时间戳相关联,也许:

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);

如果在给定时间段内的尝试次数超过了您的限制,请强制限制或强制所有用户使用验证码(即reCaptcha),直到在给定时间段内失败的尝试次数小于阈值。

// 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;
    }
}

以一定的阈值使用reCaptcha可以确保将来自多个方面的攻击降到最低,并且正常的站点用户也不会因合法的登录失败而遭受严重的延迟。我无法保证,因为可以删除验证码已经扩大了预防范围。有其他解决方案,也许是“给动物命名”的变体,可以很好地替代。


6

我要问你是否已经对这个问题进行了成本效益分析;听起来您好像是想保护自己免受攻击者的攻击,因为攻击者拥有足够的Web存在才能猜测许多密码,每个IP可能发送3-5个请求(因为您已取消IP限制)。这种攻击要花多少钱(大约)?它比您要保护的帐户的价值还贵吗?有多少庞大的僵尸网络想要您拥有的东西?

答案可能是否定的-但如果是,我希望您从某种安全专家那里得到帮助。编程技能(和StackOverflow得分)与安全知识之间没有很强的关联。


(您的意思是说答案是否定的-即,相对于帐户而言,僵尸网络攻击的花费不太高)
Jens Roland

但是无论如何,您提出了一个重要的观点。就我自己的用途而言,我不希望任何僵尸网络操作员都在乎,但我将向希望对其Web应用程序提供良好安全性的任何人发布源代码,并且我不知道其他人可能会尝试做什么保护,或者他们的敌人是谁
詹斯·罗兰

无论如何,它都不会保护国家机密(官方系统需要特殊认证,我很确定PHP上没有任何东西可以胜任),但是所有Web应用程序都需要安全认证,所以如果我发布此认证,它就可以了。 d尽我所能地不使用最佳做法,这是非常不负责任的
Jens Roland 2009年

1
因此,我的简短回答是:之所以建立这个体系,是因为99.9%的网站和应用程序都具有令人震惊的安全性(即使在大型联盟中:AOL,Twitter,Myspace之前都曾遭到破坏),并且在大多数情况下,因为它们使用伪造的身份验证库。
詹斯·罗兰

另外,请阅读Niels Provos等人的论文“捕捉捕食者”。摘自2008年USENIX会议记录(链接:usenix.org/events/sec08/tech/small.html),这令人大开眼界:2个月,一个蜜罐:来自近30.000个不同IP的368,000次攻击来自5600多个僵尸网络!
詹斯·罗兰

5

将Jens的方案总结为伪状态转换图/规则库:

  1. 用户+密码->输入
  2. 用户+!密码->拒绝
  3. 用户+已知IP(用户)->前门, // never throttle
  4. 用户+ unknown_IP(用户)-> catflap
  5. (#denied> n)通过catflaps(site)->节流catflaps(site) // slow the bots
  6. catflap +油门+密码+验证码->输入 // humans still welcome
  7. catflap +节流阀+密码+!验证码->拒绝 // a correct guess from a bot

观察结果:

  • 切勿节流前门。厄邦人州警察在您家中拥有您的计算机,但无法讯问您。蛮力是计算机上可行的方法。
  • 如果您提供“忘记密码?” 链接,那么您的电子邮件帐户就成为攻击面的一部分。

这些观察结果涵盖了与您要应对的攻击不同的攻击类型。


电子邮件帐户绝对是攻击面的一部分。对于我的策略将提供的安全性,我有一组上限假设,而最低限度是用户自己的电子邮件安全性。如果攻击者违反了用户的电子邮件,则所有赌注都无效。
詹斯·罗兰

另外,我认为您的状态转换图需要一些细节:#3和#4应该包含密码;#1和#2应该包含known_IP(user),因为登录名始终具有已知或未知IP;#6是“尽管油门却进入”
Jens Roland

4

看起来您正在尝试防御缓慢的分布式蛮力。您对此无能为力。我们使用的是PKI,没有密码登录。它会有所帮助,但是如果您的客户偶尔会碰巧有机会使用工作站,那么这将不太适用。


其实也是快速的蛮力。我希望对固定用户的蛮力有所宽容(仅节流20秒),但是在拥有5万用户的站点上,这将使可变用户的快速蛮力成为可能(假设在用户之间循环20秒以上)。而且,就像他们说的,会吸..
延斯·罗兰

来自单个主机的快速蛮力使用iptables或您使用的任何防火墙。
比约恩·拉帕奇(BjörnRaupach)2009年

我指的是分布式快速蛮力。它很少见,但可能非常讨厌
Jens Roland

3

免责声明:我在一家有两人组成的公司工作,但不是来这里工作的。这是一些观察结果。

Cookie可能会通过XSS和浏览器漏洞被盗。用户通常会更改浏览器或清除其Cookie。

源IP地址同时是动态可变的和可欺骗的。

验证码很有用,但不对特定人员进行身份验证。

多种方法可以成功组合,但是一定要有良好的口感。

密码复杂性很好,任何基于密码的关键都取决于具有足够熵的密码。恕我直言,在安全的物理位置写下的高强度密码比内存中的低强度密码更好。人们知道如何更好地评估纸质文档的安全性,而不是知道如何用狗的名字作为三个不同网站的密码来计算有效熵。考虑使用户能够打印出一张或多张一次性使用通行码的页面。

诸如“您的高中吉祥物是什么”之类的安全性问题大多是“您所知道的东西”的另一种糟糕形式,在公共领域中,大多数容易猜到或完全被忽略。

如您所述,限制失败的登录尝试是在防止暴力攻击和简化DoSing帐户之间的权衡。激进的锁定策略可能反映出对密码熵缺乏信心。

我个人看不到在网站上强制执行密码过期的好处。攻击者一旦获得您的密码,便可以对其进行更改,并尽可能轻松地遵守该政策。也许好处之一是,如果攻击者更改了帐户密码,则用户可能会很快注意到。更好的是,如果在攻击者获得访问权限之前以某种方式通知了用户。在这方面,诸如“自上次登录以来N次失败尝试”之类的消息很有用。

最好的安全性来自于第二个认证因素,该因素相对于第一个因素是带外的。就像您说的那样,“您拥有的东西”中的硬件令牌很棒,但许多(并非全部)具有与其分配相关联的实际管理开销。我不知道任何适合网站的生物识别解决方案。一些两因素解决方案可与openid提供程序一起使用,一些具有PHP / Perl / Python SDK。


所有的优点-我完全同意。关于cookie不安全的观点非常正确,但是如果没有物理令牌或一次性密码(通过安全线路分配)的第二因素,您实际上就无法防范易受攻击的端点。如果用户的浏览器/浏览器受到威胁,则其登录名也将受到威胁。
詹斯·罗兰

1

我的最高建议是仅确保您使用户知道其帐户的错误登录尝试-如果用户看到有人确实在尝试进入其帐户,则可能会更认真地使用密码的强度。 。

实际上,我发现有人入侵了我哥哥的myspace帐户,因为他们试图进入我为他设置的gmail帐户,并使用了“通过电子邮件重置密码”功能...该密码已进入我的收件箱。


1
  1. 在输入普通密码之前需要输入一次性密码怎么办?那将很明显有人在获得很多机会猜测主密码之前就在进行攻击?

  2. 保持全局的登录失败计数/比率-这是攻击的指标-在攻击过程中,应严格限制登录失败,例如更快地禁止IP。


1)您将如何在不安全,未经身份验证的线路上实施一次性密码?换句话说,用户什么时候设置这些一次性密码?2)是的,这就是我列表上的#4的要点,即尝试失败的站点范围限制。不利的一面是它打开的DoS机会。
詹斯·罗兰

0

我不认为这是一个完美的答案,但是如果发现攻击,我将倾向于以混淆机器人为基础来接近它。

在我的脑海中:

切换到备用登录屏幕。它确实有多个用户名和密码空白,但实际上只有其中一个在正确的位置。字段名是随机 --a会话密钥登录屏幕一起发送,服务器就可以找出哪些领域是什么。成功或失败将被丢弃,因此您无法尝试重播攻击-如果您拒绝密码,密码将获得新的会话ID。

假定在错误的字段中提交了带有数据的任何形式的表单,都是来自机械手的,登录失败,周期长,并且IP受限制。确保随机字段名永远不会与合法字段名匹配,这样使用记住密码的用户就不会产生误导。

接下来,如何处理另一种验证码:您有一系列不会对人类造成问题的问题。但是,它们不是随机的。攻击开始时,每个人都会收到第一个问题。一小时后,问题#1被丢弃,不再使用,每个人都遇到问题#2,依此类推。

由于问题的可处理性,攻击者无法探测将数据库下载到其机器人中。他必须在一小时内将新指令发送到他的僵尸网络,才能执行任何操作。


坦白说,备用登录屏幕听起来像会使人比机器困惑更多。我们当然假设攻击者会事先检查我们的安全措施。他本可以轻松地调整刮板以找到正确放置的字段。
詹斯·罗兰

人工检查的问题之前已经做过,而且效果不是很好。对于人类僵尸网络操作员而言,在攻击期间每小时回答一个问题(此后新的答案将传播到僵尸网络)将是非常可行的。
詹斯·罗兰

您错过了重点。攻击者无法事先检查,因为它仅在出现攻击时显示额外的防御措施。
罗伦·佩希特尔

当然,人类可以看到问题所在,但是他必须将其传达给所有机器人。这是一条通信路径,可以更轻松地关闭僵尸网络。
洛伦·佩希特尔

我认为我没有遗漏要点。我并不是说他以前会进行攻击以检查我们的安全措施,我是说他会已经阅读了该线程并检查了(开放的)源代码以检查错误:)
詹斯·罗兰


0

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

当用户注册或更改密码时,您将计算其密码的强度等级,例如1到10。

诸如“密码”之类的分数为1,而“ c6eq​​apRepe7et * Awr @ ch”之类的分数可能为9或10,分数越高,节流作用就越长。


2
我理解这个主意,但这会间接泄漏有关密码的信息,让攻击者知道密码是否值得黑客入侵。这似乎有点理论化,但是许多用户重复使用了密码,因此,如果我想闯入S​​trong_Throttling_Website.com,我可以简单地随机攻击(特权)帐户,直到找到密码薄弱的用户“ Freddy”(即(请先进行节流),然后转到Less_Secure_Website.edu,然后对Freddy的帐户进行简单的字典攻击。它有点涉及,但是在实践中肯定是可行的。
詹斯·罗兰

0

在问这个问题时,我通常听到的第一个答案是更改端口,但是忘记了而只是禁用IPv4。如果仅允许来自IPv6网络的客户端,则您不再为简单的网络扫描而祈祷,攻击者将诉诸DNS查找。不要在与您的Apache(AAAA)/ Sendmail(MX-> AAAA)/您分配给所有人(AAAA)相同的地址上运行。确保您的区域不能被xferd,等待您允许任何人下载您的区域?

如果僵尸程序发现您的服务器设置了新的主机名,只需在主机名前添加一些乱码,然后更改您的地址即可。保留旧名称,甚至为僵尸网络设置**蜜罐名称,以使其超时。

**测试您的反向(PTR)记录(在ip6.arpa下),以查看是否可以在具有VS / 4s记录的/ 4上将其归零。IE通常ip6.arpa的地址中会有〜32“。”,但是尝试丢失最后几个可能会使带有记录而不是其他记录的网络块无法使用。如果更进一步,则可以跳过大部分地址空间。

在最坏的情况下,用户将不得不设置IPv6隧道,这不像他们必须深入到将VPN接入DMZ一样……尽管有人想知道为什么这不是第一选择。

Kerberos也很酷,但是IMHO LDAP受到了打击(NISPlus在技术上有什么问题?我读到Sun决定用户需要LDAP,因此他们放弃了NIS +)。Kerberos在没有LDAP或NIS的情况下运行良好,只需要逐个主机地管理用户。使用Kerberos使您易于使用(即使不是自动化的)PKI。


0

在这里有点晚了,但我当时想,假设情况很艰难-攻击者使用了很多随机IP,随机用户名和随机密码,这些随机密码是从10,000个最受欢迎的列表中选择的。

您可以做一件事,特别是如果系统似乎受到攻击,因为系统上有很多错误的密码尝试,尤其是如果密码的密码熵很低时,您可以问一个次要问题,例如您父母的名字是什么? 。如果攻击者尝试使用一百万个尝试使用密码“ password1”的帐户,那么他们很有可能会获得很多收益,但是如果正确输入名称的几率也会大大降低成功率。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.