![登录 GNU/Linux 发行版花费的时间太长](https://linux22.com/image/52653/%E7%99%BB%E5%BD%95%20GNU%2FLinux%20%E5%8F%91%E8%A1%8C%E7%89%88%E8%8A%B1%E8%B4%B9%E7%9A%84%E6%97%B6%E9%97%B4%E5%A4%AA%E9%95%BF.png)
所以,
当我尝试使用我的用户名和密码(在 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
失败值得特别解释。退出后login
,getty
只是打印另一个登录提示并再次开始循环。那么为什么要睡觉然后退出而不是仅仅睡觉呢?因为当引入此功能时,通过拨号登录很常见。 (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.defs
该FAIL_DELAY
值。
答案4
我自己不使用 Archlinux,所以我不太清楚,但这听起来像是一种防止暴力破解密码的机制。