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认证登录的方式来取代传统的密码验证的登录方式。