数以百计的ssh登录失败


81

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

Answers:


67

您可以使用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,我不会使用需要软件安装且更加复杂的用户模式。


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

2
它减慢了攻击速度,我确实建议这样做,但是由于那里有分布式的扫描僵尸网络,因此它不是万能药。僵尸网络仍然会针对您运行分布式扫描,从而导致无效登录。有没有真正太多可以做的是,短某种“端口敲门”方案时,要在得到远程带来SSH端口起来的。
埃文安德森

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

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

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


25

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

http://denyhosts.sourceforge.net/

大包装,易于安装和配置。


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

1
OpenSSH 6.7删除了tcpwrappers support,这是denyhosts所使用的。
Zoredache 2014年

15

能够从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包含了该文件) 。

现在,当您在网络上的某个任意系统上并想要通过ssh切换到该系统时,请首先使用网络浏览器并点击该文件(或使用wget或等效文件):

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

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


为了使其更安全,请在https上运行此页面。
罗伯特·蒙提亚努

如果您更改了脚本,使其不输出“允许的临时IP地址”文件的内容,那么嗅探器将不会监听任何内容。然后,您可以在http而不是https上运行它。
巴里·布朗

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

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

OpenSSH 6.7放弃了tcpwrappers support,这就是您的答案中所使用的。
Zoredache 2014年



2

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


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

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

1
我必须同意...我的SSH在“备用”端口上运行,这使日志变得完全不同。蠕虫的智能程度几乎与砖块一样高,因此可以有效地应对愚蠢的自动化脚本。对人类攻击者的反应不太好。尽管如此,原木在其中充满了幸福的寂静之声……
艾利·佩恩

..并不是说这些机器人是“愚蠢的”,而是因为它们旨在寻找低挂的水果。因此,移动SSH端口的方式是..让您的果实远离地面。
elrobis

2

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

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


1

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

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


1

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

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

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


0

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

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


0

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



0

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

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

非常好的软件:)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.