预计阅读本页时间:-
6.9.4 利用DenyHosts工具和脚本来防止SSH暴力破解
笔者用Nagios外网监控服务器进行测试时设置的密码是redhat_123456,可放进公网的第一天就被人采用暴力破解的手段更改了root密码,后来环境部署成熟以后发现仍然有不少外网IP在扫描和试探,看来不用点工具不行啊。于是想到了DenyHosts,它是用Python 2.3写的一个程序,会分析/var/log/secure等日志文件,当发现同一IP在进行多次SSH密码尝试时就会将该IP记录到/etc/hosts.deny文件上,从而达到自动屏蔽该IP的目的。
DenyHosts官方网站为:http://denyhosts.sourceforge.net 。
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
安装DenyHosts的详细步骤如下。
1.检查安装条件
1)首先判断系统安装的sshd是否支持TCP_Wrappers(默认都是支持的),命令如下:
ldd /usr/sbin/sshd | grep libwrap.so.0
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f018d14d000)
2)然后判断默认安装的Python版本,命令如下:
python -V
Python 2.6.6
CentOS 6.4 x86_64已默认安装了Python 2.6.6。
2.安装及配置DenyHosts工具
在确认系统已安装Python 2.3以上版本的情况下,执行以下步骤。
1)安装DenyHosts,命令如下:
# cd /usr/local/src
# wget http://jaist.dl.sourceforge.net/sourceforge/denyhosts/DenyHosts-2.6.tar.gz
# tar zxf DenyHosts-2.6.tar.gz
# cd DenyHosts-2.6
# python setup.py install
程序脚本自动安装到/usr/share/denyhosts。
库文件自动安装到/usr/lib/python2.3/site-packages/DenyHosts。
denyhosts.py自动安装到/usr/bin。
2)设置启动脚本,命令如下所示:
# cd /usr/share/denyhosts/
# cp daemon-control-dist daemon-control
# chown root daemon-control
# chmod 700 daemon-control
# grep -v "^#" denyhosts.cfg-dist > denyhosts.cfg
# vim denyhosts.cfg
我们可以根据自己的需要对文件denyhosts.cfg进行相应的修改,命令如下:
SECURE_LOG = /var/log/secure
上面表示RedHat/CentOS系统中安全日志的文件位置。
其他版本的Linux可根据denyhosts.cfg-dist内的提示进行选择,命令如下:
PURGE_DENY = 30m
表示过多久后清除。
DENY_THRESHOLD_INVALID = 1
表示允许无效用户(/etc/passwd未列出)登录失败的次数。
DENY_THRESHOLD_VALID = 5
表示允许有效(普通)用户登录失败的次数。
DENY_THRESHOLD_ROOT = 3
表示允许root登录失败的次数。
HOSTNAME_LOOKUP=NO
表示是否做域名反解。
如果需要DenyHosts随系统重启而自动启动,还需要做如下设置,先使用如下命令:
vim /etc/rc.local
然后加入下面这条命令:
/usr/share/denyhosts/daemon-control start
3)启动DenyHosts工具,命令如下:
/usr/share/denyhosts/daemon-control start
如果要使DenyHosts每次重启后都自动启动,还需要做如下设置:
# cd /etc/init.d
ln -s /usr/share/denyhosts/daemon-control denyhosts
chkconfig --add denyhosts
chkconfig --level 345 denyhosts on
然后就可以启动了,启动命令如下:
service denyhosts start
DenyHosts配置文件的语法如下:
SECURE_LOG = /var/log/secure
这个就是SSH日志文件,它是根据这个文件来判断非法IP的。
HOSTS_DENY = /etc/hosts.deny
这是控制用户登录的文件。
PURGE_DENY = 5m
表示要过多久后才能清除已经禁止的IP,这个可根据具体时间而定。
BLOCK_SERVICE = sshd
表示禁止的服务名。
DENY_THRESHOLD_INVALID = 1
表示允许无效用户失败的次数。
DENY_THRESHOLD_VALID = 10
表示允许普通用户登录失败的次数。
DENY_THRESHOLD_ROOT = 5
表示允许root登录失败的次数。
HOSTNAME_LOOKUP=NO
表示是否做域名反解。
DAEMON_LOG = /var/log/denyhosts
这是自己的日志文件。
ADMIN_EMAIL = yuhongchun027@163.com
这是管理员的邮件地址,它会给管理员发邮件,CentOS 6.4默认是开启了Postfix邮件服务的。
下面是全自动下载安装的小脚本install_denyhosts.sh(以下脚本在CentOS 5.5/5.6/6.4 x86_64下均已测试通过),当然安装后还得手动调整配置文件。脚本代码如下:
#!/bin/bash
cd /usr/local/src
wget http://jaist.dl.sourceforge.net/sourceforge/denyhosts/DenyHosts-2.6.tar.gz
tar zxf DenyHosts-2.6.tar.gz
cd DenyHosts-2.6
python setup.py install
cd /usr/share/denyhosts/
cp daemon-control-dist daemon-control
chown root daemon-control
chmod 700 daemon-control
grep -v "^#" denyhosts.cfg-dist > denyhosts.cfg
echo "/usr/share/denyhosts/daemon-control start" >>/etc/rc.local
cd /etc/init.d
ln -s /usr/share/denyhosts/daemon-control denyhosts
chkconfig --add denyhosts
chkconfig --level 345 denyhosts on
service denyhosts start
如果脚本成功运行,则会在最后一行有如下显示:
starting DenyHosts: /usr/bin/env python /usr/bin/denyhosts.py --daemon --config=/usr/share/denyhosts/denyhosts.cfg
还可以查看DenyHosts服务的状态,命令如下:
service denyhosts status
结果如下:
DenyHosts is running with pid = 9236
下面是denyhosts的示例,如果在/etc/hosts.deny里已有记录的IP机器仍然想连接安装了DenyHosts的机器,则会被拒绝,命令如下:
ssh 192.168.0.154
结果显示如下所示:
root@192.168.0.154's password:
Permission denied, please try again.
root@192.168.0.154's password:
Permission denied, please try again.
root@192.168.0.154's password:
Permission denied (publickey,gssapi-with-mic,password)
出现上面最后这行代码表示/etc/hosts.deny文件生效了,DenyHosts工具部署成功。
DenyHosts的原理很简单,其实就是收集/var/log/secure的信息,如果root登录失败的次数超过10次,则会将其写进/etc/hosts.deny文件里,从而达到禁止访问的目的。
通常,通过SSH登录远程服务器时,使用密码认证,分别输入用户名和密码,若两者满足一定的规则就可以登录。但是密码认证有以下的缺点:
·密码配置过长容易遗忘密码,比如笔者公司内部的开发服务器时不时就有进入单用户(Single User)改root密码的需求。
·简单密码容易被人采用暴力手段破解。
·服务器上的一个账户若要给多人使用,则必须让所有使用者都知道该账户的密码,导致密码容易泄露,而且如果有系统管理员要离职,修改密码时必须通知所有人。
而使用公钥认证则可以解决上述问题,其优点如下:
·公钥认证允许使用空密码,省去了每次登录都需要输入密码的麻烦。
·多个使用者可以通过各自的密钥登录到系统上的同一个账户。
·用户的私匙还可以加密,安全系数比较高。
·方便自动化运维部署。
综上所述,建议大家采用SSH Key认证登录的方式来取代传统的密码验证的登录方式。