有什么技巧可以应对“僵尸网络” sshd 登录失败率出奇的高?

有什么技巧可以应对“僵尸网络” sshd 登录失败率出奇的高?

我刚刚一次性设置了 2 个新的 Debian 12 VPS。

其中一个运行良好;另一个,我似乎与它有间歇性连接。我甚至写了一半的支持单,认为这一定是他们数据中心的连接问题,但后来深入挖掘,发现了 sshd 的“MaxStartups”功能:一旦打开但尚未验证的连接数超过一定数量,sshd 就会故意开始丢弃更多连接,这与我看到的情况一致。

在运行正常的 VPS 上,日志显示恶意攻击大约每两分钟一次,这是我预料到的。在有问题的 VPS 上,它似乎大约每两分钟一次每一秒平均而言,默认的 LoginGraceTime 为 2 分钟,这完全解释了我为什么很难登录。我已经将其缩短到 5 秒,这几乎可以控制打开的连接数。(两个 VPS 都已配置为仅接受公钥身份验证,因此恶意尝试无论如何都不可能成功。)

我对这个麻烦的攻击速度之快感到惊讶。它们似乎来自不同的源 IP,所以显然是一个僵尸网络,不是我能轻易阻止的东西。例如,据我所知,fail2ban 在这里不会做任何事情,因为它完全在源 IP 上运行。

我计划在这个 VPS 上放置一个公共 HTTP 服务器,因此我还担心,如果它已经成为通过 SSH 进行的僵尸网络攻击的目标,那么我的 HTTP 服务器可能在我开始之前就被 DDOS 攻击,并且/或者引起某人或某物扫描漏洞以利用漏洞的注意。(另一个 VPS,每两分钟只看到一次尝试,我计划在上面放置一个邮件服务器 - 我不确定我应该更关注哪种协议!)

  • 我应该采取什么样的恶意尝试率预计指向随机选择的 IPv4 地址?
  • 我是否应该对此采取任何行动,还是只能忍受它?
    • 询问我的 VPS 提供商他们是否可以更改服务器的 IP,因为也许我只是运气不好,而这个服务器成为了某个随机人员的 DDOS 目标,而这个人已经解除了他们的 IP 分配,最后被分配给了我?
    • 除了我可以通过的另一个 VPS 访问之外,阻止任何地方使用 SSH - 尽管我最终还是会在其上运行公共 HTTP 服务器?(当需要打开 HTTP 时,关闭防火墙 SSH 似乎毫无意义 - 对我来说这样做会有点不方便)
    • 只是对失败的尝试保持沉默日志消息?(假设有选项可以做到这一点 - 我还没有检查)
    • 是否有其他 SSH 服务器软件包可供我使用,这些软件包在处理大量恶意尝试方面更加优化?例如,sshd 在身份验证之前为每个新连接创建一个新进程,这似乎有很多不必要的开销:理想情况下,它应该消耗尽可能少的资源,直到身份验证成功。
    • ...还有其他建议吗?

答案1

我应该预计针对随机选择的 IPv4 地址发起的恶意尝试的频率是多少?

互联网的背景噪音:对互联网大部分区域进行例行、自动、拖网式(而不是专门针对您的 IPv4 地址)扫描,以查找暴露的主机和服务。连续不断的探测流,每天很容易导致仅在暴露的 sshd 上就有数百次登录/滥用尝试(尽管数量可能从数十到(许多)数千不等,某些提供商的 IP 地址范围比其他范围更容易成为目标),来源包括:

  • 勤勉的提供商(他们可能正在运行漏洞扫描程序,因为他们希望在客户操作不安全/易受攻击/受感染的系统时发出警告/断开客户连接)
  • 研究项目(例如shodan.io以及其他人)和其他好奇的人
  • 恶意行为者(可能使用僵尸网络执行探测)
  • 等等等等

我是否应该对此采取任何行动,还是只能忍受它?

一般来说:当您将服务器和服务暴露给互联网时,您应该预料到来自整个互联网的连接,最重要的是滥用(尝试)。

如果某项服务并非旨在作为公共服务然后它不应该暴露给整个互联网。
当您可以时:最佳做法是应用访问控制。这可以有多种形式,但常见的是限制对已知 IP 地址和/或已知 IP 地址范围的访问。或者,当您不完全知道良好的 IP 地址范围时,阻止不太可能具有有效访问要求的范围。
虽然将 IP 地址(范围)与地理位置绑定远非 100% 可靠或完全完整,但使用 Geo-IP 数据的访问列表在这方面非常有用。

访问控制可以在主机外部设置,例如使用安全组或防火墙设备。这样服务器本身就不需要提供任何资源来维护它们。

通常更灵活,但也需要主机本身的资源的是基于主机的访问控制,例如基于主机的防火墙(在 Linux netfilter/iptables/nftables 上)或应用程序本身的访问控制。例如,这通常是为不同用户设置不同 IP 地址限制的唯一方法。

当服务预期为了公共服务比如你的公共网站的网络服务器,通常你不应用访问控制,因为真正的网站访问者来自任何地方都受到欢迎。
通常,此类公共服务会采取以下方法:允许来自任何地方的访问,但检测恶意行为并(暂时)阻止恶意行为者使用的 IP 地址. 类似Fail2ban就是这样一种方法,IDS 和 IPS 系统其他。

例子:比如说,我家乡阿姆斯特丹的一家当地餐馆的外卖订单页面和在线预订系统的访问控制列表。您不会将其设置为仅允许来自阿姆斯特丹的 IP 地址访问。这可能会过于严格,例如,拒绝使用手机访问网站的有效本地访问者。
但另一方面,阻止已知在欧洲以外分配和使用的 IP 地址范围,例如在非洲、亚太地区、北美和南美地区使用的 IP 地址范围,应该会大大减少滥用尝试的次数,并且不太可能影响预订/外卖订单的数量。
相比之下,同一 Web 服务器上的 SSH 访问的访问控制列表可以很容易地限制为网站管理员的静态 IP 地址、他们办公室的网关和/或当他们没有静态 IP 地址或 VPN 服务器时,限制为他们的 ISP 使用的范围。

是否有其他 SSH 服务器软件包可供我使用,这些软件包对处理高频率的恶意尝试进行了更优化?例如,sshd 在身份验证之前为每个新连接创建一个新进程,这似乎有很多不必要的开销:

我认为并且希望您大大高估了这些登录尝试的实际资源需求和影响。从总体上看,我见过的“正常”级别的 ssh 滥用尝试在暴露的 VPS 系统上产生的负载与实际应用程序负载相比微不足道。

当需要打开 HTTP 时,关闭防火墙 SSH 似乎毫无意义

实现安全的一般方法是最小特权原则;在防火墙规则中,其含义为:

  • 默认阻止所有内容
  • 只允许有需要的人访问所需的内容

因此,仅允许从某些 IP 地址而不是全世界进行 ssh 访问,并允许全世界访问端口 80(将纯文本重定向到 https)和 443(默认 https 端口)是没有意义的。

答案2

我以前从未见过针对 ssh 的 slowloris 类型攻击。查看文档,MaxStartups 似乎并不关心这些攻击是否来自同一客户端(即,您可以使用它来促进 DOS)。我的第一个反应(取决于攻击模式)是使用 iptables connlimit(限制每个客户端 IP 的连接数)。

Fail2ban 是大多数 ssh 攻击的明显解决方案(我也将它用于 HTTP[S] 流量),但一定要确保它配置为使用 ipset。

从长远来看,更改 IP 地址不太可能有帮助。

阻止从任何地方访问 SSH,除了我可以通过另一个 VPS 访问它

是的 - 使用跳转箱是一种相当常见的做法。同样,这是您可以自己做的事情。只需为端口 22 设置默认防火墙规则,然后将您的跳转箱列入白名单即可。Ssh 甚至具有内置功能,使使用变得透明,例如

ssh -J [email protected] [email protected]

或者您可以在 ssh_config 中设置此项,然后ssh targethost.example.com

Host jumpbox.example.com
   User: jumpuser
   IdentityFile: ~/.ssh/jumpuser.id_rsa

Host targethost.example.com
   User: user
   ProxyCommand: ssh -q -W %h:%p [email protected]:22 
   IdentityFile: ~/.ssh/user.id_rsa

只是对失败的尝试保持静音日志消息吗?

我不提倡这样做。如果您已采取合理措施防止未经授权的访问,请随意忽略它们。

正如 pepoluan 所建议的,你也可以使用非标准端口和端口敲击(顺便说一下后者可以纯粹在 iptables 中实现而不必使用 knockd)

答案3

我的建议:

  1. 将 SSH 端口从 22 更改为其他端口。
  2. 如果机器人仍然可以找到您的端口,请安装knockd并配置您的服务器以实现端口敲击。

答案4

如果您通过公共 IP 公开 SSH,它迟早会被扫描,并且威胁行为者会尝试进行身份验证,无论 VPS 提供商或网络如何。

我会使用如下的 ansible playbook 来强化你的 ssh 配置: https://github.com/dev-sec/ansible-collection-hardening/tree/master/roles/ssh_hardening

或者这个剧本,可以强化整个服务器: https://github.com/konstruktoid/ansible-role-hardening


我还推荐 fail2ban。Fail2Ban:禁止导致多次身份验证错误的主机 Fail2Ban 扫描日志文件(如 /var/log/auth.log)并禁止登录尝试失败次数过多的 IP 地址。它通过更新系统防火墙规则来拒绝来自这些 IP 地址的新连接,时间可配置


或者您可以创建一个到您的 VPS 网络的 VPN 连接/使用 OpenVPN 在您的 VPS 中创建一个 VPN 服务器(例如),并将 SSH 放在 VPN 后面,而不是将其暴露给互联网。

相关内容