登录 GNU/Linux 发行版花费的时间太长

登录 GNU/Linux 发行版花费的时间太长

所以,

当我尝试使用我的用户名和密码(在 tty 中)登录并插入错误的密码时,我需要等待5秒系统告诉我密码错误。

为什么验证过程需要这么长时间?

GNU/Linux 发行版:Archlinux。

答案1

添加一点历史观点,在错误密码后休眠的想法不仅仅存在于基于 PAM 的系统中。它很旧了。例如在4.4BSD登录源码你会发现这个美味的片段:

/* we allow 10 tries, but after 3 we start backing off */
if (++cnt > 3) {
        if (cnt >= 10) {
                badlogin(username);
                sleepexit(1);
        }
        sleep((u_int)((cnt - 3) * 5));
}

因此前 3 次故障是免费的,接下来的 7 次故障会增加延迟(5 秒、10 秒、15 秒...),在 10 次之后,它会执行sleepexit(1)5 秒延迟,然后执行exit(1).

当您在控制台上输入密码时,睡眠只是一种烦恼,但当输入来自可能会自动化该过程的远程用户时,睡眠就很重要了。

后面的10次sleepexit失败值得特别解释。退出后logingetty只是打印另一个登录提示并再次开始循环。那么为什么要睡觉然后退出而不是仅仅睡觉呢?因为当引入此功能时,通过拨号登录很常见。 (1995 年之前从未使用过调制解调器的人请注意:我说登录通过拨号,而不是通过拨号的 PPP 或其他基于数据包的协议。您可以在终端模拟器中拨打一个号码并收到登录提示。)

在拨号世界中,任何人都可以拨打您的号码并开始向其输入密码,因此该login过程会在输入几个错误密码后退出,导致调制解调器连接终止,迫使他们在尝试更多密码之前重拨。同样的原则适用于ssh今天(配置选项MaxAuthTries),但它在过去更有效,因为拨打调制解调器比 TCP 握手慢得多。

答案2

看到这个StackOverflow 上的回答引用了Linux-PAM 模块编写者指南:

按照此文件的指示,多个模块之一可能会失败,导致 pam_...() 调用返回错误。希望在应用程序继续之前也有一个暂停。这种延迟的主要原因是安全性:延迟主要是为了阻止暴力字典攻击,但也有助于阻止定时(隐蔽通道)攻击。

pam_fail_delay() 函数提供了一种机制,应用程序或模块可以通过该机制建议最小延迟(micro_sec 微秒)。 Linux-PAM 会记录使用此功能请求的最长时间。如果 pam_authenticate() 失败,则失败的应用程序返回会延迟一段关于该最长值随机分布的时间(最多 25%)。

无论成功与否,当 Linux-PAM 将控制权返回给应用程序时,延迟时间都会重置为零默认值。

答案3

正如其他人回答的那样,PAM 很可能是造成这种情况的原因。实际验证密码只需要很短的时间,剩下的就是为了防止暴力攻击而设计的延迟。在 Debian 上,我有以下几行/etc/pam.d/login

# Enforce a minimal delay in case of failure (in microseconds).
# (Replaces the `FAIL_DELAY' setting from login.defs)
# Note that other modules may require another minimal delay. (for example,
# to disable any delay, you should add the nodelay option to pam_unix)
auth       optional   pam_faildelay.so  delay=3000000

如果5秒的延迟太长了(当然如果你赶时间的话就得等这个时间了)感觉就像它太长一样),您总是可以通过在系统上查找等效文件来缩短时间。如果您没有 PAM,如上面代码片段中的注释所示,您可以在下面查找/etc/login.defsFAIL_DELAY值。

答案4

我自己不使用 Archlinux,所以我不太清楚,但这听起来像是一种防止暴力破解密码的机制。

相关内容