小智 5
从历史角度来看,在错误密码后休眠的想法不仅仅存在于基于 PAM 的系统中。它很旧了。对于4.4BSD 登录源中的eaxmple,您会发现这个美味的片段:
/* 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));
}
Run Code Online (Sandbox Code Playgroud)
所以前 3 次失败是免费的,接下来的 7 次有增加的延迟(5 秒、10 秒、15 秒......),10 秒后它会执行 a sleepexit(1),即 5 秒延迟,然后是exit(1).
当您在控制台上输入密码时,睡眠只是一种烦恼,但当输入来自可能正在自动化该过程的远程用户时,它们很重要。
在sleepexit10次后的失败值得特别说明。后login出口,getty只印刷另一登录提示,并重新开始循环。那么为什么要睡觉并退出而不是仅仅睡觉呢?因为在引入此功能时,通过拨号登录是很常见的。(对于 1995 年之前从未使用过调制解调器的人,请注意:我说的是通过拨号登录,而不是通过拨号登录,而不是 PPP 或其他基于数据包的协议。您可以在终端模拟器中拨打一个号码并获得登录提示。)
在拨号世界中,任何人都可以拨打您的号码并开始向其发送密码,因此该login过程在几次错误密码后退出,导致调制解调器连接终止,迫使他们在尝试更多密码之前重拨。同样的原则适用于ssh今天(配置选项MaxAuthTries),但在过去更有效,因为拨号调制解调器比 TCP 握手要慢得多。