MattMcKnight Asked: 2009-06-03 08:18:04 +0800 CST2009-06-03 08:18:04 +0800 CST 2009-06-03 08:18:04 +0800 CST 数百次失败的 ssh 登录 772 每天晚上我都会在我的 RedHat 4 服务器上收到数百甚至数千次失败的 ssh 登录。出于远程站点的防火墙原因,我需要在标准端口上运行。我应该做些什么来阻止它。我注意到许多来自同一个 IP 地址。不应该过一段时间就停止吗? linux redhat ssh 16 个回答 Voted Best Answer Evan Anderson 2009-06-03T08:25:16+08:002009-06-03T08:25:16+08:00 您可以使用 iptables 对 SSH 端口的新传入连接进行速率限制。我必须查看您的整个 iptables 配置才能为您提供交钥匙解决方案,但您基本上是在谈论添加以下规则: iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 5 --name SSH --rsource -j DROP iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH --rsource -j ACCEPT 这些规则假定您在表的前面接受 ESTABLISHED 连接(这样只有新连接才会符合这些规则)。新的 SSH 连接将符合这些规则并被标记。在 60 秒内,来自单个 IP 地址的 5 次尝试将导致来自该 IP 的新传入连接被丢弃。 这对我来说效果很好。 编辑:我更喜欢这种方法而不是“fail2ban”,因为不需要安装额外的软件,并且完全在内核模式下发生。它不会像“fail2ban”那样处理解析日志文件,但如果您的问题仅与 SSH 有关,我不会使用需要安装软件且更复杂的用户模式。 Kyle Brandt 2009-06-03T08:20:53+08:002009-06-03T08:20:53+08:00 fail2ban可以通过阻止登录尝试失败次数过多的 IP 地址来帮助解决此问题。 KPWINC 2009-06-03T09:16:50+08:002009-06-03T09:16:50+08:00 如果可以的话,我建议使用非标准的 SSH 端口(即端口 10222),但既然你提到你不能这样做,我建议使用诸如 DenyHosts 之类的东西。 http://denyhosts.sourceforge.net/ 很棒的软件包,易于安装和配置。 David Mackintosh 2009-06-03T09:07:26+08:002009-06-03T09:07:26+08:00 虽然能够从 Internet 上的任意位置 ssh 进入您的系统可能会很好,但有自动密码攻击系统会锁定一个开放的 ssh 端口并对您的系统应用各种 joe 帐户和字典攻击。这可能会加重您在夜间日志摘要中的阅读速度,并且会浪费您的带宽。 如果您在同一系统上拥有 Web 服务器,则可以使用 php 和 tcp 包装器来限制 ssh 入站流量到已知系统,并为您提供一个后门密钥以允许您从 Internet 上的任意系统访问。 这是你如何做到的: 拒绝 /etc/hosts.deny 中的所有 ssh 连接: # /etc/hosts.deny fragment sshd: all 在 /etc/hosts.allow 中通过 IP 允许已知系统,并添加一个文件用于临时访问: # /etc/hosts.allow fragment sshd: 10.0.10.2 # some system sshd: 172.99.99.99 # some other system sshd: /etc/hosts.allow.temporary-sshd-access 在您的 Web 服务器中创建一个 php 文件,并为其命名,例如 my-sshd-access.php: <?php function get_ip() { return getenv("REMOTE_ADDR"); } ?> <?php $out='/etc/hosts.allow.temporary-sshd-access'; $log='/var/log/sshd-access-addition-log'; print "Was:"; readfile($out); print "<br>"; $ip=get_ip(); $fp=fopen($out,"w"); fputs($fp,$ip); fclose($fp); $lfp=fopen($log,"a"); fputs($lfp,$ip); fputs($lfp,"n"); fclose($lfp); print "Wrote: "; readfile($out); ?> 原谅 php 代码 - 我从其他地方刷过它,所以它可能会被清理一大堆。它所做的只是将访问它的系统的 IP 地址添加到 /etc/hosts.allow.temporary-sshd-access 文件中,该文件由 sshd 在连接时读取(由于 /etc/hosts.allow 包含它) . 现在,当您在 Web 上的某个任意系统上并想要 ssh 到该系统时,首先使用 Web 浏览器并点击此文件(或使用 wget 或等效项): $ wget http://your.system.name/my-sshd-access.php 现在你应该可以通过 ssh 进入你的系统了。如果这是您可能会经常 ssh 的地方,那么读取 /etc/hosts.allow.temporary-sshd-access 文件的内容并将 IP 地址永久添加到 /etc/hosts 将是微不足道的。允许。 Zoredache 2009-06-03T08:23:18+08:002009-06-03T08:23:18+08:00 您可能还想查看拒绝主机。 仅供参考:OpenSSH 6.7 放弃了 tcpwrappers 支持,这意味着拒绝主机可能不是新安装的解决方案。 Manu 2009-08-18T14:08:16+08:002009-08-18T14:08:16+08:00 帮自己一个忙,禁用密码登录。仅使用身份验证密钥(例如 google ssh-keygen - 示例:http ://www.puddingonline.com/~dave/publications/SSH-with-Keys-HOWTO/document/html/SSH-with-Keys-HOWTO-4 .html ) 您的服务器将更加安全,您将更舒适地连接到它(检查 ssh-agent、ssh-add、keychain),您将不再是 ssh 暴力攻击的受害者。 disserman 2009-06-03T08:28:14+08:002009-06-03T08:28:14+08:00 另一种解决方案是将 ssh 移动到另一个端口。这些蠕虫非常愚蠢。 Evan 2009-06-03T16:51:51+08:002009-06-03T16:51:51+08:00 另一种选择可能是要求所有 ssh 连接都由证书验证并完全取消密码。 我曾经使用 Denyhosts,但我发现我只是定期从少数几个地方远程连接,所以我阻止了所有端口 22 连接,除了其他任何地方,并使用端口敲击,这样我可以在需要时从任何地方用笔记本电脑连接. goldPseudo 2009-06-03T09:03:25+08:002009-06-03T09:03:25+08:00 任何涉及在多次故障后自动阻止 IP 的解决方案都会带来拒绝服务攻击的风险。只要有一个好的密码策略来降低暴力破解或字典攻击的有效性,我就不会太担心它们。 如果您将用户/组限制为只允许首先允许 ssh 登录的用户/组,并禁用以 root 身份登录,那么您应该足够安全。而且,如果这还不够,总是有基于密钥的身份验证。 erik 2009-08-18T14:51:07+08:002009-08-18T14:51:07+08:00 老实说,如果您必须运行 SSH(并且在端口 22 上),您无法避免这些。如果您必须接受密码,那么您的情况会更糟。 最好的办法是配置日志分析软件以排除 SSH 日志。然后运行一个单独的实例只查看 SSH 日志,并使用 procmail 过滤掉不成功的尝试。您甚至可以编写脚本来监视来自 IP 地址的成功登录以及多次不成功的尝试。 没有办法阻止人们探测您的 SSH 服务器。Denyhosts、fail2ban 和 iptables 示例可以在一定程度上发挥作用,但会增加意外阻止合法用户的危险。最好的方法是将其吸收并尝试自动化日志分析过程,以减少您必须考虑的时间。
您可以使用 iptables 对 SSH 端口的新传入连接进行速率限制。我必须查看您的整个 iptables 配置才能为您提供交钥匙解决方案,但您基本上是在谈论添加以下规则:
这些规则假定您在表的前面接受 ESTABLISHED 连接(这样只有新连接才会符合这些规则)。新的 SSH 连接将符合这些规则并被标记。在 60 秒内,来自单个 IP 地址的 5 次尝试将导致来自该 IP 的新传入连接被丢弃。
这对我来说效果很好。
编辑:我更喜欢这种方法而不是“fail2ban”,因为不需要安装额外的软件,并且完全在内核模式下发生。它不会像“fail2ban”那样处理解析日志文件,但如果您的问题仅与 SSH 有关,我不会使用需要安装软件且更复杂的用户模式。
fail2ban可以通过阻止登录尝试失败次数过多的 IP 地址来帮助解决此问题。
如果可以的话,我建议使用非标准的 SSH 端口(即端口 10222),但既然你提到你不能这样做,我建议使用诸如 DenyHosts 之类的东西。
http://denyhosts.sourceforge.net/
很棒的软件包,易于安装和配置。
虽然能够从 Internet 上的任意位置 ssh 进入您的系统可能会很好,但有自动密码攻击系统会锁定一个开放的 ssh 端口并对您的系统应用各种 joe 帐户和字典攻击。这可能会加重您在夜间日志摘要中的阅读速度,并且会浪费您的带宽。
如果您在同一系统上拥有 Web 服务器,则可以使用 php 和 tcp 包装器来限制 ssh 入站流量到已知系统,并为您提供一个后门密钥以允许您从 Internet 上的任意系统访问。
这是你如何做到的:
拒绝 /etc/hosts.deny 中的所有 ssh 连接:
在 /etc/hosts.allow 中通过 IP 允许已知系统,并添加一个文件用于临时访问:
在您的 Web 服务器中创建一个 php 文件,并为其命名,例如 my-sshd-access.php:
原谅 php 代码 - 我从其他地方刷过它,所以它可能会被清理一大堆。它所做的只是将访问它的系统的 IP 地址添加到 /etc/hosts.allow.temporary-sshd-access 文件中,该文件由 sshd 在连接时读取(由于 /etc/hosts.allow 包含它) .
现在,当您在 Web 上的某个任意系统上并想要 ssh 到该系统时,首先使用 Web 浏览器并点击此文件(或使用 wget 或等效项):
现在你应该可以通过 ssh 进入你的系统了。如果这是您可能会经常 ssh 的地方,那么读取 /etc/hosts.allow.temporary-sshd-access 文件的内容并将 IP 地址永久添加到 /etc/hosts 将是微不足道的。允许。
您可能还想查看拒绝主机。
仅供参考:OpenSSH 6.7 放弃了 tcpwrappers 支持,这意味着拒绝主机可能不是新安装的解决方案。
帮自己一个忙,禁用密码登录。仅使用身份验证密钥(例如 google ssh-keygen - 示例:http ://www.puddingonline.com/~dave/publications/SSH-with-Keys-HOWTO/document/html/SSH-with-Keys-HOWTO-4 .html ) 您的服务器将更加安全,您将更舒适地连接到它(检查 ssh-agent、ssh-add、keychain),您将不再是 ssh 暴力攻击的受害者。
另一种解决方案是将 ssh 移动到另一个端口。这些蠕虫非常愚蠢。
另一种选择可能是要求所有 ssh 连接都由证书验证并完全取消密码。
我曾经使用 Denyhosts,但我发现我只是定期从少数几个地方远程连接,所以我阻止了所有端口 22 连接,除了其他任何地方,并使用端口敲击,这样我可以在需要时从任何地方用笔记本电脑连接.
任何涉及在多次故障后自动阻止 IP 的解决方案都会带来拒绝服务攻击的风险。只要有一个好的密码策略来降低暴力破解或字典攻击的有效性,我就不会太担心它们。
如果您将用户/组限制为只允许首先允许 ssh 登录的用户/组,并禁用以 root 身份登录,那么您应该足够安全。而且,如果这还不够,总是有基于密钥的身份验证。
老实说,如果您必须运行 SSH(并且在端口 22 上),您无法避免这些。如果您必须接受密码,那么您的情况会更糟。
最好的办法是配置日志分析软件以排除 SSH 日志。然后运行一个单独的实例只查看 SSH 日志,并使用 procmail 过滤掉不成功的尝试。您甚至可以编写脚本来监视来自 IP 地址的成功登录以及多次不成功的尝试。
没有办法阻止人们探测您的 SSH 服务器。Denyhosts、fail2ban 和 iptables 示例可以在一定程度上发挥作用,但会增加意外阻止合法用户的危险。最好的方法是将其吸收并尝试自动化日志分析过程,以减少您必须考虑的时间。