每天晚上,我的RedHat 4服务器上都会有数百个,有时甚至是数千个sshlogin失败。 由于远程站点的防火墙原因,我需要在标准端口上运行。 有什么我应该做的,以阻止这一点。 我注意到很多来自同一个IP地址。 难道不应该在一段时间后停止?
您可以使用iptables来限制新的传入连接到SSH端口。 我必须看到你的整个iptablesconfiguration为了给你一个交钥匙解决scheme,但你基本上是在谈论添加规则,如:
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”那样的日志文件parsing,但是如果你的问题只是用SSH,我不会使用一些需要软件安装的用户模式,而且更复杂。
fail2ban可以通过阻止尝试login失败的IP地址来解决这个问题。
如果可以的话,我build议使用SSH的非标准端口(即端口10222),但由于您提到你不能这样做,我build议使用诸如DenyHosts之类的东西。
http://denyhosts.sourceforge.net/
大包装,易于安装和configuration。
尽pipe能够从互联网上的任意位置进入你的系统可能是很好的,但有自动化的密码攻击系统会locking到一个开放的ssh端口,并针对你的系统应用各种joe帐户和字典攻击。 这可能会使你的夜间日志摘要更加恶化,浪费你的带宽。
如果你在同一个系统上有一个web服务器,你可以使用php和tcp wrappers来限制ssh入站stream量到已知的系统,再给你一个后门密钥来允许你从互联网上的任意系统访问。
以下是你如何做到这一点:
拒绝/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服务器上创build一个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中) 。
现在,当你在networking上的一些任意系统上,想要ssh到这个系统时,首先使用一个web浏览器并打这个文件(或者使用wget或者equivilent):
$ wget http://your.system.name/my-sshd-access.php
现在你应该可以进入你的系统了。 如果这是某个地方你可能会频繁ssh'ing,那么读取/etc/hosts.allow.temporary-sshd-access文件的内容并永久地将IP地址添加到/ etc / hosts将是微不足道的。允许。
你也可以看看denyhosts 。
仅供参考:OpenSSH 6.7 下载tcpwrappers支持 ,这意味着denyhosts可能不是新安装的解决scheme。
帮你一个忙,并禁用密码login。 使用唯一的身份validation密钥(例如谷歌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暴力攻击的受害者。
另一个解决scheme就是把ssh移到另一个端口。 这些蠕虫非常愚蠢。
另一个select可能是要求所有的ssh连接都要通过证书validation,并彻底取消密码。
我使用Denyhosts,但是我发现我只是经常从less数几个地方远程连接,所以我阻止了除了其他任何地方以外的所有端口22的连接,并且使用端口敲打,所以我可以用笔记本电脑从任何地方连接,如果必须的话。
任何涉及在多次故障后自动阻止IP的解决scheme都会带来拒绝服务攻击的风险。 只要有一个很好的密码策略来降低powershell或字典攻击的效力,我不会太担心。
如果您将用户/组限制为只允许那些首先被允许进入ssh的用户,并禁止以root身份login,则应该足够安全。 而且,如果这还不够,总会有基于密钥的身份validation。
老实说,如果你必须运行SSH(和端口22),你不能避免这些。 如果你必须接受密码,那么你的形状就更糟了。
您最好的select是configuration日志分析软件以排除SSH日志。 然后运行一个单独的实例来查看SSH日志,并使用procmail过滤掉不成功的尝试。 您甚至可能会编写脚本来监视IP地址成功login并尝试多次失败。
没有办法阻止人们探测你的SSH服务器。 Denyhosts,fail2ban和iptables的例子都可以达到某个程度,但是还会有意外阻止合法用户的危险。 最好的办法就是吸收它,并尝试自动化日志分析过程,以减less您需要考虑的时间。
当你说你失败的时候,在你的红帽子服务器上login尝试,它坐在什么types的防火墙,有多less人需要嘘。 我build议如果你想在防火墙到达实际的服务器附近之前想限制尝试。
如果您可以限制合法需要访问的IP地址范围,则应该能够在防火墙上设置访问列表。 如果你可以限制在防火墙的stream量,我build议你看看networking入侵系统,因为它听起来像你的服务器被某些东西所瞄准。
大多数networking主机使用APF + BFD来ip-block失败的SSHlogin。 现在有CSF(Configserver防火墙) ,其中包含一个名为LFD的工具,它可以做同样的事情,还有更多,包括来自某些国家的IP地址,您不想访问您的服务器(例如韩国,中国等,其中99%的SSH探测器似乎来自于)。
我一直在使用fail2ban ,它一直在帮助我很多。
如果您需要在多个主机上解决此问题,则可能需要查看OSSEC: http : //www.ossec.net/main/ossec-architecture
这将允许您从一个集中的位置configuration多个代理来自动响应暴力攻击(以及可以从日志中提取的任何其他模式)。
非常好的软件:)
另一个类似于DenyHosts的选项是sshutout http://www.techfinesse.com/sshutout/sshutout.html