每天晚上,我在RedHat 4服务器上都会收到数百次(有时甚至数千次)的ssh登录失败。由于远程站点的防火墙原因,我需要在标准端口上运行。有什么我应该做的阻止此操作。我注意到许多来自同一IP地址。不应该在一段时间后停止吗?

#1 楼

您可以使用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 


这些规则假定您将在表中的较早位置接受已建立的连接(这样,只有新的连接才会符合这些规则)。新的SSH连接将符合这些规则并被标记。在60秒内,来自一个IP地址的5次尝试将导致该IP的新传入连接被丢弃。

这对我来说效果很好。

编辑:我更喜欢此方法“ fail2ban”,因为没有要安装的其他软件,并且完全在内核模式下发生。它不像“ fail2ban”这样处理日志文件,但是如果您的问题仅在于SSH,我不会使用需要软件安装且更加复杂的用户模式。

评论


我喜欢这种解决方案,并且计划在今晚解决问题后,于今晚将其安装到位。

–MattMcKnight
09年2月2日在20:10

它减慢了攻击速度,我还是建议这样做,但是因为那里有分布式的扫描僵尸网络,所以它不是万能药。僵尸网络仍然会针对您运行无效的登录,这是无效的登录。确实没有太多可以做的,缺少某种“端口敲门”方案,可以在您想进入时远程打开SSH端口。

–埃文·安德森(Evan Anderson)
09年2月2日在20:16

为@Evan的“端口敲门”建议+1。一些信息:linux.die.net/man/1/knockd。但不要以手册页的方式进行操作(即添加/删除iptables规则),而应使用-m condition iptables match来代替。

– pepoluan
2011-03-10 9:24



您是否不需要这些规则中的--dport 22,以便仅将它们应用于ssh流量?

–气候
13年1月7日在22:00

@clime-是的很难相信这已经有2 1/2年了,没人注意到!接得好。

–埃文·安德森(Evan Anderson)
2013年1月7日22:43

#2 楼

fail2ban可以通过阻止尝试登录失败次数过多的IP地址来解决此问题。

评论


我不喜欢工具/脚本代表sysadmin用户阅读日志并发出命令

– asdmin
09年8月17日在18:24

@asdmin,是的,尤其是当他们拥有如此良好的业绩记录时...

–maxschlepzig
2014年12月4日16:12

#3 楼

如果可以的话,我建议使用非标准的SSH端口(即端口10222),但是由于您提到您不能这样做,所以我建议使用诸如DenyHosts之类的东西。

http ://denyhosts.sourceforge.net/

很棒的软件包,易于安装和配置。

评论


我不知道为什么人们对此表示支持; SSH在标准端口22上。这意味着,当您在外部网络上时,不必依赖它们通过出站防火墙打开非标准端口。上面已记录了此问题的真正解决方案,它可以通过入站防火墙限制重复连接的数量,也可以关闭密码登录。

–安德鲁·泰勒(Andrew Taylor)
2011年1月25日上午10:24

OpenSSH 6.7放弃了tcpwrappers支持,这是denyhosts使用的支持。

– Zoredache
2014年10月30日21:31

#4 楼

能够从Internet上的任意位置ssh进入系统可能会很好,但是有一些自动密码攻击系统会锁定到打开的ssh端口,并对您的系统进行各种joe帐户和字典攻击。每天晚上的日志摘要中可能会令人讨厌阅读,这会浪费带宽。

如果在同一系统上有Web服务器,则可以使用php和tcp包装程序来限制ssh入站流量到已知系统,再给您一个后门钥匙,以允许您从Internet上的任意系统进行访问。

这是您的操作方法:

拒绝所有ssh连接/etc/hosts.deny:

# /etc/hosts.deny fragment
sshd:  all


通过IP在/etc/hosts.allow中允许已知系统,并添加用于临时访问的文件:

# /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包含了该文件) 。

现在,当您使用网络上的任意系统并希望使用ssh时,请首先使用网络浏览器并单击该文件(或使用wget或等效文件):

$ wget http://your.system.name/my-sshd-access.php


现在您应该可以使用ssh进入系统了。如果这是您经常去的地方,那么读取/etc/hosts.allow.temporary-sshd-access文件的内容并将IP地址永久添加到/ etc / hosts会很简单。允许。

评论


为了使其更安全,请在https上运行此页面。

– Robert Munteanu
09年2月2日在18:32

如果您更改脚本以使其不输出“允许的临时IP地址”文件的内容,则不会有任何嗅探。然后,您可以在http而不是https上运行它。

–巴里·布朗(Barry Brown)
09年8月18日在1:40

“允许的临时IP地址”始终是请求者(即您的)的IP地址。我认为这无关紧要。 Https确实意味着对请求的URL进行了加密,这意味着从网络上嗅探它并不容易。

–大卫·麦金托什(David Mackintosh)
09年8月18日在12:47

如果您使用的是代理HTTP连接的网络,但是通过不同的出口直接访问Internet,则此方法将无效。

–安德鲁·泰勒(Andrew Taylor)
2011年1月25日上午10:25

OpenSSH 6.7放弃了tcpwrappers支持,这就是您的答案中正在使用的支持。

– Zoredache
2014年10月30日21:31

#5 楼

您可能还想看看denyhosts。

FYI:OpenSSH 6.7放弃了tcpwrappers支持,这意味着denyhosts可能不是新安装的解决方案。

#6 楼

帮个忙,禁用密码登录。仅使用身份验证密钥(例如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暴力攻击的受害者。

#7 楼

另一个解决方案是将ssh移到另一个端口。这些蠕虫非常愚蠢。

评论


原始海报说他需要在标准港口上行驶。

–kbyrd
09年6月2日于16:30

抱歉,我必须仔细阅读问题:)

– Disserman
09年6月2日在16:55

我必须同意...我的SSH在“备用”端口上运行,这使日志变得天壤之别。蠕虫的智能程度几乎与砖块一样高,因此可以有效地应对愚蠢的自动化脚本。对人类攻击者的反应不太好。尽管如此,原木在它们的寂静中却是幸福的声音。

–艾琳·佩恩(Avery Payne)
09-10-5在4:22

..并不是说机器人是“愚蠢的”,而是他们被设计为寻找低挂的水果。因此,移动SSH端口的方式是..让您的水果离开地面。

– elrobis
19年2月27日在17:05

#8 楼

另一个选择可能是要求所有ssh连接都通过证书进行验证,并且完全取消密码。

我曾经使用Denyhosts,但是我发现我只是定期从几个地方远程连接,因此,除了其他任何地方,我都阻止了所有端口22的连接,并使用了端口敲击功能,因此我可以在任何地方使用笔记本电脑进行连接。

#9 楼

任何涉及在多次失败后自动阻止IP的解决方案都会带来拒绝服务攻击的风险。只要有适当的密码策略来降低暴力破解或字典攻击的有效性,我就不会为它们担心太多。

如果将用户/组限制为仅首先应该允许ssh进入,并禁止以root身份登录,否则,您应该已经足够安全了。而且,如果这还不够,那么总会有基于密钥的身份验证。

#10 楼

老实说,如果您必须运行SSH(并在端口22上),则无法避免。如果必须接受密码,则情况甚至更糟。

最好的选择是配置日志分析软件以排除SSH日志。然后运行一个单独的实例,仅查看SSH日志,然后使用procmail过滤掉失败的尝试。您甚至可能编写脚本来监视IP地址是否多次成功尝试登录。

无法阻止人们探测SSH服务器。 Denyhosts,fail2ban和iptables示例可以工作到一定程度,但是存在意外阻止合法用户的额外危险。最好的方法是将其吸收,并尝试使日志分析过程自动化,以减少您必须考虑的时间。

#11 楼

当您说要失败时,请在您的Red Hat服务器上尝试临时登录,它位于后面的是哪种防火墙,需要多少人进入它。我建议,如果可以的话,可以限制对防火墙的尝试,直到它们到达实际服务器附近为止。

如果可以限制合法需要访问的IP地址范围,则应该可以设置在防火墙上的访问列表。如果您可以限制防火墙处的流量,我建议您看一下网络入侵系统,因为听起来您的服务器正受到某些目标的攻击。<​​br />

#12 楼

大多数Web主机使用APF + BFD来IP阻止失败的SSH登录。如今,有了CSF(配置服务器防火墙),其中包括一个名为LFD的工具,它可以完成相同的工作,并且还包括其他一些您不想访问服务器的国家(例如韩国,中国等)的阻止IP,其中有99%的SSH探针似乎来自)。

#13 楼

我一直在使用fail2ban,它一直在帮助我很多。

#14 楼

如果您需要跨多个主机解决此问题,则可能需要查看OSSEC:http://www.ossec.net/main/ossec-architecture

这将允许您配置从一个集中位置的多个代理自动响应暴力攻击(以及您可以从日志中提取的任何其他模式)。

非常好的软件:)

#15 楼

类似于DenyHosts的另一个选项是shutout http://www.techfinesse.com/sshutout/sshutout.html

#16 楼

这是一个很老的话题,需要刷新;)
现在,最好的选择是使用2FA,例如https://ubuntu.com/tutorials/configure-ssh-2fa#1-overview。
之后将其设置在我的服务器上后,与已接受的iptables解决方案不同,僵尸程序停止尝试立即入侵。