在 sshd_config 'MaxAuthTries' 中限制了每个连接的身份验证失败次数。什么是连接?

ptj*_*tty 8 ssh openssh sshd

MaxAuthTries在我的 Linux 机器上设置为 1。然后我尝试ssh从本地网络上的另一台机器进入我的 Linux 机器,但它没有说“ Too many authentication failures”。

我假设这是因为我在设置时遇到了一些失败,并且它们仍然计入总数。

man页面说:

MaxAuthTries指定每个连接允许的最大身份验证尝试次数。一旦失败次数达到此值的一半,就会记录更多失败。默认值为 6。

什么被认为是连接?这是否意味着您只能MaxAuthTries从某个 IP 地址获取?这是指TCP连接吗?如何终止连接以便我可以创建一个新连接并ssh再次尝试?

https://linux.die.net/man/5/sshd_config

tel*_*coM 9

在 SSH 的情况下,连接是与sshd的 TCP 端口(通常是端口 22)建立的连接。Omcesshd停止接受进一步的身份验证尝试,它关闭连接,此时连接完成。

在用户尝试进行身份验证之前,SSH 协议需要协商加密和其他协议选项、建立会话密钥和交换主机密钥。因此,每个新连接都需要一些重要的工作:来自多个来源的 SSH 连接尝试风暴当然可以用于对服务器进行 DoS。

身份验证尝试是当前在sshd配置中启用的任何身份验证方法的一次尝试。例如:

  • 如果客户端提供用于身份验证的 SSH 密钥,则每个提供的密钥都计为一次尝试。
  • 如果启用了 Kerberos/GSSAPI 身份验证方法,查看客户端是否可以通过它进行身份验证计为一次尝试
  • 在密码验证提示中输入的每个密码显然都算作一个。

前两个可能会导致您遇到的情况:如果您设置MaxAuthTries为一个并且启用了 Kerberos/GSSAPI 身份验证,它可能会在您尝试密码身份验证之前耗尽一次尝试。同样,如果您的 SSH 客户端有可用的身份验证密钥,但您尚未将公钥添加到~/.ssh/authorized_keys目标用户的目标系统中,则公钥身份验证尝试将耗尽您的单次尝试,您甚至无法尝试密码认证。

pam_unix,通常处理密码身份验证的 PAM 库,默认情况下在身份验证尝试失败后强制延迟两秒。

如果您的主要威胁是互联网中其他受感染系统上的密码猜测蠕虫和机器人,那么减少 MaxAuthTries 可能是一个糟糕的举措:因为机器人不会厌倦,它总是会重新连接并重试。每次尝试都需要您花费一些 CPU 容量来进行 SSH 协议协商。您首先要确保机器人不会成功,其次是机器人将尽可能多地在现有连接上浪费时间,而您的成本最低。允许通过一个连接进行多次身份验证尝试但回答......非常......缓慢......将完全做到这一点。

这也是为什么sshd即使完全禁用密码认证也会向客户端请求密码的原因:提示完全是假的,无论输入什么密码,客户端都会被拒绝。但是客户无法确定地知道这一点。

当然,如果您允许在一个连接上进行过多的身份验证尝试,如果 bot 程序员实施了超时以限制这种“tar-pit 防御”的有效性,bot 可能最终会从其一侧终止连接。

  • tarpit 防御很好,但如果我理解正确,那会引入fail2ban 的问题。sshd_config 手册页说只有在我们达到 MaxAuthTries 的一半后才会记录登录失败。因此,如果设置得高,攻击者将在 fail2ban 开始看到有问题的 IP 之前进行大量尝试。 (2认同)
  • 遗憾的是没有速率限制器,我不敢相信几十年后 openssh 仍然不提供这样的基本功能。Fail2ban 的工作也应该包含在 sshd 中,那就是它所属的地方,必须解析日志就像私人调查机构必须做警察的工作,调查犯罪,然后将材料交给警察逮捕某人(而不是警察一开始就这么做)。它创建了很多额外的工作,而 sshd 可以做得更容易,因为它是登录被拒绝时的来源。防止暴力破解的速率限制是非常基本的。 (2认同)

Nas*_*ley 2

从广义上讲,连接被定义为以特定用户身份进行连接的任何尝试。

pam_tallyor命令pam_tally2在这里很有用,具体取决于您使用的发行版。以下命令将显示某个用户有多少次失败:

pam_tally --user=username
Run Code Online (Sandbox Code Playgroud)

要为特定用户重置它:

pam_tally --reset --user=username
Run Code Online (Sandbox Code Playgroud)

对于所有用户:

pam_tally --reset
Run Code Online (Sandbox Code Playgroud)

要验证它是否已重置:

pam_tally --user=username
Run Code Online (Sandbox Code Playgroud)

执行该命令pam_tallypam_tally2不执行任何选项将显示尝试失败或被锁定的所有用户。pam_tally2如果您有这样的情况,请务必更改为。