#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,我不会使用需要软件安装且更加复杂的用户模式。
#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解决方案不同,僵尸程序停止尝试立即入侵。
评论
我喜欢这种解决方案,并且计划在今晚解决问题后,于今晚将其安装到位。
–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