题 数百个失败的ssh登录


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


76
2018-06-02 16:18






答案:


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


63
2018-06-02 16:25



我喜欢这个解决方案,而且我计划今晚把它拿到位,一旦我今天开火了。 - MattMcKnight
它减慢了攻击速度,我确实推荐它,但因为那里有扫描僵尸网络,所以它不是灵丹妙药。来自运行针对您的分布式扫描的僵尸网络仍将存在无效登录。你可以做的并不是太多,除了某种“端口敲门”方案,当你想进入时远程启动SSH端口。 - Evan Anderson
为@Evan的“端口敲门”建议+1。一些信息: linux.die.net/man/1/knockd 。但是不要以man page方式(即添加/删除iptables规则),而是使用 -m condition iptables匹配。 - pepoluan
你不需要在这些规则中使用--dport 22,以便它们仅适用于ssh流量吗? - clime
@clime - 是的。很难相信这已经过了2年半,没有人注意到!接得好。 - Evan Anderson


的fail2ban 可以通过阻止太多登录尝试失败的IP地址来帮助解决这个问题。


38
2018-06-02 16:20



我不喜欢代表sysadmin用户阅读日志和发出命令的工具/脚本 - asdmin
@asdmin,是的,尤其是他们的时候 有这么好的记录...... - maxschlepzig


如果可以的话,我建议使用非标准的SSH端口(即端口10222),但既然你提到你不能这样做,我建议使用像DenyHosts这样的东西。

http://denyhosts.sourceforge.net/

优秀的包装,易于安装和配置。


25
2018-06-02 17:16



我不知道为什么人们会支持这一点; SSH位于标准端口22上。这意味着当您在外部网络上时,您并不依赖它们通过出站防火墙打开非标准端口。上面记录了此问题的真正解决方案,或者通过入站防火墙限制重复连接的数量,或者关闭密码登录。 - Andrew Taylor
OpenSSH 6.7下降 tcpwrappers支持,这是denyhosts使用的。 - Zoredache


虽然能够从互联网上的任意位置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到这个系统时,首先使用Web浏览器并点击该文件(或使用wget或equivilent):

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

现在你应该能够进入你的系统了。如果这是某个地方,你可能会频繁地进行ssh'ing,那么读取/etc/hosts.allow.temporary-sshd-access文件的内容并永久地将IP地址添加到/ etc / hosts将是微不足道的。允许。


15
2018-06-02 17:07



为了使这更安全,请在https上运行此页面。 - Robert Munteanu
如果您更改脚本以便它不输出“允许的临时IP地址”文件的内容,那么将不会有任何可能的嗅探器嗅探。然后你可以在http而不是https上运行它。 - Barry Brown
“允许的临时IP地址”始终是请求者(即您的)。我不认为这样或那样重要。 Https确实意味着所请求的URL是加密的,这意味着从线路上嗅探它并不容易。 - David Mackintosh
如果您所在的网络代理HTTP连接,但您通过不同的出口直接访问互联网,则无法使用此功能。 - Andrew Taylor
OpenSSH 6.7下降 tcpwrappers支持,这是你的答案中使用的。 - Zoredache


你可能想看一下 的DenyHosts 同样。

仅供参考:OpenSSH 6.7下降 tcpwrappers支持,意味着denyhosts可能不是新安装的解决方案。


9
2018-06-02 16:23





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


8
2017-08-17 22:08





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


2
2018-06-02 16:28



原始海报说他需要在标准端口上运行。 - kbyrd
对不起,我必须仔细阅读这些问题:) - disserman
我不得不同意......我的SSH在“替代”端口上运行,它在日志中创造了一个与众不同的世界。这些蠕虫就像砖块一样聪明,因此它可以很好地应对愚蠢的自动化脚本;对人类攻击者不太好。不过,原木还是有福音的 安静 在他们中... - Avery Payne


另一种选择可能是要求所有ssh连接都由证书验证,并完全取消密码。

我使用Denyhosts,但我发现我只是从少数几个地方定期远程连接,所以我阻止了所有端口22连接,除了从其他任何地方,并使用端口敲击所以我可以从任何地方连接我的笔记本电脑,如果我不得不。


2
2018-06-03 00:51





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

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


1
2018-06-02 17:03





老实说,如果你必须运行SSH(和端口22),你无法避免这些。如果你必须接受密码,你的形状会更差。

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

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


1
2017-08-17 22:51





当你说你的失败时,你的红帽服务器上的登录尝试是什么,它背后是什么样的防火墙,有多少人需要嘘声。我建议你,如果你想在防火墙到达实际服务器附近之前限制它们的尝试。

如果您可以限制合法需要访问的IP地址范围,您应该能够在防火墙上设置访问列表。如果您可以限制防火墙的流量,我建议您查看网络入侵系统,因为它听起来像您的服务器是某种目标。


0
2018-06-02 17:28