为什么通过 ssh 登录失败所花的时间比成功登录所花的时间更长?

为什么通过 ssh 登录失败所花的时间比成功登录所花的时间更长?

这个问题困扰了我好几年,我很好奇你们中是否有一位超级管理员可以向我解释一下。

如果我通过 ssh 进入我的一台 Linux 机器并提供正确的凭证,我的身份验证几乎是即时的。在同一个机器上,如果我输入了错误的密码,则需要几秒钟才能显示登录失败的消息并重新提示。服务器上发生了什么,为什么错误密码需要这么长时间才能失败?

谢谢 sf!

简写

答案1

这是由检查您的密码的 PAM 模块实现的安全功能。

如果您阅读 pam_unix(8) 的手册页,您将看到“nodelay”选项。ssh 使用 pam_unix 来检查密码、登录以及检查密码的其他任何操作。“默认操作是模块请求大约两秒钟的故障延迟。”

所有 pam 模块都可以调用一个函数来请求主 pam 内容延迟。pam_fail_delay。此函数采用所有调用的模块中最长的延迟,并将其随机更改最多 25%,然后等待这么长时间,然后再返回到应用程序(sshd、login 等)。

在许多系统中,一种常见的安全措施是,如果发生故障(例如尝试检查不存在的用户的密码),则会插入一个短暂的休眠。这可以防止计时攻击,因为否则,登录有效帐户失败可能比尝试登录不存在的帐户花费的时间稍长(加密密码、主目录中的统计数据等)。其他术语为隐蔽通道定时通道, 或者侧信道攻击。它还可以阻止暴力攻击(但效果不是很好,只是打开更多连接)。稍微随机化睡眠也有帮助。

答案2

虽然我对 OpenSSH 的工作原理并不十分熟悉,但可以肯定这是一个安全功能。如果没有延迟,(自动)攻击者很容易在很短的时间内尝试大量密码。任何类型的“污泥因素”都会使这种类型的攻击变得不可行。

答案3

这取决于您服务器的身份验证配置。在大多数 Linux 机器(现成的普通机器)上,这将使用 PAM 来处理本地帐户。但是,它也可能寻找 NIS 服务。当您成功登录本地用户帐户时,这永远不会起作用,但如果这不起作用,那么 PAM 将在搜索 NIS 服务器(或 NIS 服务器上的凭据,如果有)时超时。

当然,还有许多其他可能的情况,其中适用类似的原则。为了给您详细的答案,您需要提供有关服务器身份验证设置的更多详细信息(例如 /etc/nsswitch.conf 和 /etc/pam.conf 或 /etc/pam.d 中文件的内容)。

答案4

这是否也与后备机制有关 - 如果您在启用详细输出的情况下登录,当您获得正确的凭据时,它不需要恢复任何其他形式的身份验证。

相关内容