面对SSH暴力破解,给你支个招

在最近一次云上线的过程当中,频繁遇到绑定公网浮动IP的云主机遭受外界SSH暴力破解***及用户设置弱密码的问题,由此引起的安全问题引发了针对防护SSH暴力破解的思考。python

SSH暴力破解算法

hydra 和medusa是世界顶级密码暴力破解工具,支持几乎全部协议的在线密码破解,功能强大,密码可否被破解关键取决于破解字典是否足够强大。在网络安全***过程当中,hydra 和medusa是必备的测试工具,配合社工库进行社会工程学***,有时会得到意想不到的效果。图示两款工具使用密码字典穷举SSH密码的过程。安全

面对SSH暴力破解,给你支个招

iptables限制ssh访问频率服务器

面对暴力破解,根据其工做原理可知:下降其试错频率,提升其试错次数,从而将破解时间提升到不可容忍的程度,是一条有效的防范手段。网络

提升***方试错次数,无非是提高密码长度,扩展密码复杂度,按期更换密码这些手段。而下降***方的试错频率其实也是一条值得一试的防护手段。运维

经过调用iptables的state模块与recent模块,实现对SSH访问的频率限制。这里重点解释下不经常使用的recent扩展模块。ssh

recent模块tcp

Recent,该扩展可以动态的建立IP地址列表,用于后期以多种不一样形式作出匹配。该扩展支持如下多种选项:ide

面对SSH暴力破解,给你支个招

iptables规则内容工具

要实现对SSH访问频率的控制,iptables规则以下两条:

#如果SSH访问,源IP在最近访问列表中,且60秒内访问次数大于等于3次,则丢弃。        

iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSH_RECENT --rcheck --seconds 60 --hitcount 3 -j DROP 

#如果SSH访问,则将源IP加入最近访问列表中。                                        

iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSH_RECENT –set                                                         

实现效果

实现效果以下图所示。高频率的密码试错将被终结,直至一分钟超时后才可从新开始。

面对SSH暴力破解,给你支个招

在/proc/net/xt_recent目录中,存在名为SSH_RECENT的一个日志文件。文件中记录了上面输入的iptables规则记录的最近访问SSH服务的源IP信息以及访问时间。其中默认记录的oldest_pkt是20个,能够经过modprobe ipt_recent ip_pkt_list_tot=50调大。默认记录的源IP是100个,能够经过modprobe ipt_recent ip_list_tot=1024 扩大记录数量。

面对SSH暴力破解,给你支个招

iptables实现远程开启ssh功能

任何一次靠谱的网络***都起步于网络侦查。若是***者在网络侦查阶段未发现目标开启SSH登陆服务,这也将挫败其针对SSH发起***的计划。这里经常使用的操做都是更改SSH的默认22端口至其余端口号上以迷惑端口扫描软件。实际经过nmap等工具仍是能够扫描到端口上捆绑的具体服务,以下图所示。这里经过一个取巧的办法,利用指定报文长度的ICMP做为钥匙,开启主机上的SSH服务。经过这种方式隐藏SSH服务端口。

面对SSH暴力破解,给你支个招

iptables规则内容

以指定包长的ICMP报文,做为钥匙,开启对端的SSH服务。具体iptables规则以下所示。

#用78字节的icmp数据包做为钥匙(包含IP头部20字节,ICMP头部8字节),将源IP加入SSH白名单          iptables -A INPUT -p icmp --icmp-type 8 -m length --length 78 -m recent --name SSH_ALLOW --set -j ACCEPT                                             

#检查访问SSH服务的源IP是否在白名单中,且白名单中的IP有效期为15秒。若在白名单中则放行通信。 

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSH_ALLOW  --rcheck --seconds 15 -j ACCEPT  

#对于已创建的SSH链接放行                                                          

iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT                                                                            

#其余SSH无关匹配所有拒止                                                           

iptables -A INPUT -p tcp --dport 22 -j DROP

实现效果

最终能够实现下图所示效果。在未使用指定包长ICMP以前,SSH服务没法通行(步骤1)。在使用指定包长ping以后(步骤2),使用SSH能够正常链接(步骤3)。以此实现了指定包长ICMP做为钥匙开启SSH通讯服务的效果。其原理与上节限制SSH通讯频率的原理一致。

面对SSH暴力破解,给你支个招

Fail2ban防止SSH暴力破解

安装:

Centos上能够直接经过yum install fail2ban –y安装。安装完成后,可在/etc/fail2ban路径下找到程序运行的相应文件。在filter.d目录下存放有fail2ban支持的全部过滤器,action.d目录下存放有fail2ban支持的全部动做。经过在jail配置文件中组合多种过滤器与动做,能够实现各类自定义的防护功能(不只限于SSH防御)。

配置及运行:

对于fail2ban而言,每一个.conf配置文件均可以被同名的.local文件重写。程序先读取.conf文件,而后读取.local文件。.local中的配置优先级更高。经过新建jail.local,增长下述配置,运行fail2ban-client start来实现对SSH暴力破解的防护。

[DEFAULT]

#白名单

ignoreip = 127.0.0.1/8

#解封禁时间

bantime  = 600

#试错窗口时间

findtime  = 600

#允许试错次数

maxretry = 3

[ssh-iptables]

#使能

enabled = true

#选择过滤器

filter = sshd

#选择防护动做

action = iptables[name=SSH, port=ssh, protocol=tcp]

#邮件通知

sendmail-whois[name=SSH,dest=yang.hongyu@99cloud.net, sender=test@email.com]

#SSH日志路径

logpath = /var/log/secure

#允许试错次数(优先级比default高)

maxretry = 1

运行效果:

经过对目标主机的SSH试错,/var/log/secure日志中记录了SSH登陆的错误信息。fail2ban经过对该文件的分析,识别出当前正在遭遇到SSH的暴力破解,继而触发防护功能。fail2ban-client status命令能够查看当前fail2ban的运行状态,遭遇SSH暴力破解后,识别到的***IP被添加至Banned IP list中,实际阻断功能则是fail2ban经过在iptables中下发针对***IP的阻断规则来实现。

面对SSH暴力破解,给你支个招

Denyhost防止SSH暴力破解

Denyhost工做原理与Fail2ban基本一致,一样是分析SSH的日志文件,定位重复的暴力破解IP。与Fail2ban经过写iptables规则阻断***IP的访问不一样,Denyhost经过将***IP记录到hosts.deny文件来实现屏蔽***IP对SSH的访问。

Denyhost安装:

wget "downloads.sourceforge.net/project/denyhosts/denyhosts/2.6/DenyHosts-2.6.tar.gz"

tar -xzf DenyHosts-2.6.tar.gz 

cd DenyHosts-2.6

python setup.py install

Denyhost配置及运行:

#生成配置文件副本

cd /usr/share/denyhosts/

#生成配置文件副本

cp denyhosts.cfg-dist denyhosts.cfg

#生成执行文件副本

cp daemon-control-dist daemon-control 

chmod 700 daemon-control 

#自定义配置文件denyhosts.cfg

#SSH log路径

SECURE_LOG = /var/log/secure

#存储SSH拒止host信息的配置文件路径

HOSTS_DENY = /etc/hosts.deny

#拒止时间,此处配置为10分钟

PURGE_DENY = 10m

#无效用户登陆重试次数限制

DENY_THRESHOLD_INVALID = 5

#有效用户登陆重试次数限制

DENY_THRESHOLD_VALID = 10

#ROOT用户登陆重试次数限制

DENY_THRESHOLD_ROOT = 1

#启动运行

./daemon-control start

Denyhost效果:

从Denyhost的运行日志中看出,对目标主机的屡次SSH密码试错触发了Denyhost的防护功能。***者的IP被添加至hosts.deny文件,该IP下的SSH访问也被拒止。

 
面对SSH暴力破解,给你支个招

面对SSH暴力破解,给你支个招

网络安全,何来一招鲜

可能有些人要说使用密钥登陆就能完美解决SSH暴力破解的问题。这里要说一段历史。2006年Debian Linux发行版中发生了一件有意思的事,软件自动分析工具发现了一行被开发人员注释掉的代码。这行被注释掉的代码用来确保建立SSH秘密钥的信息量足够大。该代码被注释后,密钥空间大小的熵值下降到215。这意味着不论哪一种算法和密钥长度,最终生成的密钥一共只有32767个,复杂度比一个纯6位数字的密码的复杂度更差。该错误在两年以后才被发现,无疑至关多的服务器上都利用这这种存在缺陷的弱密钥。(引用自:Violent Python:A Cookbook for Hackers)

网络安全没有一招鲜。前文中列举的四种安全加固方式也没法抵御运维人员设置的弱密码,及***者的社工密码库。运维人员,惟有提升自身安全意识,合理利用安全工具,才能保障网络安全。

最后说一句:道路千万条,安全第一条。操做不规范,运维两行泪。

相关文章
相关标签/搜索