我MaxAuthTries
在 Linux 机器上设置为 1。然后我尝试ssh
从本地网络上的另一台机器进入我的 Linux 机器,但失败并显示“ Too many authentication failures
”。
我假设这是因为我之前在设置时遇到了一些失败,但它们仍然计入总数。
该man
页面说:
MaxAuthTries
指定每个连接允许的最大身份验证尝试次数。一旦失败次数达到该值的一半,就会记录更多失败。默认值为 6。
什么被视为连接?这是否意味着您只能MaxAuthTries
从某个 IP 地址获取信息?这是指 TCP 连接吗?我怎样才能终止连接,以便建立一个新连接并重试ssh
?
答案1
对于 SSH,连接是指与sshd
的 TCP 端口(通常是端口 22)建立的连接。一旦sshd
停止接受进一步的身份验证尝试,它就会关闭连接,此时连接就完成了。
在用户尝试进行身份验证之前,SSH 协议需要协商加密和其他协议选项、建立会话密钥以及交换主机密钥。因此,每个新连接都需要进行一些不平凡的工作:来自多个来源的大量 SSH 连接尝试肯定会被用来对服务器进行 DoS。
身份验证尝试是对sshd
配置中当前启用的任何身份验证方法的一次尝试。例如:
- 如果客户端提供 SSH 密钥进行身份验证,则每个提供的密钥都算作一次尝试。
- 如果启用了 Kerberos/GSSAPI 身份验证方法,则查看是否可以使用该方法对客户端进行身份验证将计为一次尝试
- 在密码验证提示中输入的每个密码显然都算作一个。
前两个可能会导致您遇到的情况:如果您设置MaxAuthTries
为一并且启用了 Kerberos/GSSAPI 身份验证,则在您尝试密码身份验证之前,它可能会耗尽单次尝试。同样,如果您的 SSH 客户端有可用的身份验证密钥,但您尚未将公钥添加到~/.ssh/authorized_keys
目标用户的目标系统中,则公钥身份验证尝试将耗尽您的单次尝试,您甚至无法尝试密码验证。
pam_unix
,通常处理密码身份验证的 PAM 库,默认情况下在身份验证尝试失败后强制执行两秒的延迟。
如果您的主要威胁是互联网中其他受感染系统上的密码猜测蠕虫和机器人,那么减少 MaxAuthTries 可能是一个糟糕的举措:因为机器人不会疲倦,它总是会重新连接并重试。每次尝试都需要您花费一些 CPU 容量来进行 SSH 协议协商。您首先需要确保机器人不会成功,其次机器人会浪费尽可能多的时间在该现有连接上,您的最低成本。允许在一个连接上进行多次身份验证尝试,但应答...非常...缓慢...就可以做到这一点。
这也是为什么sshd
即使完全禁用密码验证也会向客户端请求密码:提示完全是假的,无论客户端输入什么密码都会被拒绝。但客户无法确定这一点。
当然,如果您允许在一个连接上进行过多的身份验证尝试,并且机器人程序员已实施超时来限制此类“tar-pit 防御”的有效性,则机器人最终可能会终止其一侧的连接。
答案2
从广义上讲,连接被定义为以特定用户身份进行连接的任何尝试。
pam_tally
or命令pam_tally2
在这里很有用,具体取决于您使用的发行版。以下命令将显示某个用户有多少次失败:
pam_tally --user=username
要为特定用户重置它:
pam_tally --reset --user=username
对于所有用户:
pam_tally --reset
要验证它是否已重置:
pam_tally --user=username
执行该命令pam_tally
或pam_tally2
不执行任何选项将显示尝试失败或被锁定的所有用户。pam_tally2
如果您有这样的情况,请务必更改为。
答案3
这有点像水晶球凝视,但连接正是如此,除非您在客户端上显式设置有关连接多路复用和延迟 ( ControlMaster
, ) 的选项,否则它应该立即终止。ControlPersist
我认为正在发生的事情(并且ssh -v
可以帮助您验证,请留意“尝试私钥”)是您想要对该计算机使用基于密码的身份验证。但是,您的客户端可能有一个用于无密码身份验证的密钥对~/.ssh
。标准配置优先考虑密钥而不是密码,因此您ssh
提供了密钥,服务器不喜欢它,这是允许您进行的一次失败尝试。 (主题的变体:也许您有多个密钥对设置,并且只有其中之一被授权给您的服务器。)您可以使用-oPreferredAuthentications=keyboard-interactive,password
覆盖要提供的身份验证机制:如果客户端停止建议它可以基于密钥进行操作,您应该提示密码,以便您可以登录以在服务器上再次设置更高的值。