用脚本简化部署DenyHosts防SSH暴力破解

原创
安全
我的Nagios外网监控服务器,刚开始测试时取的密码是redhat,放进公网一天就被人改了,郁闷死了;另外的几台公网机器(没有硬件防火墙),被人不停的ssh连接,我稍为判断了一下,其中有个IP居然连接失败17000次了……

【51CTO.com 独家特稿】我的Nagios外网监控服务器,刚开始测试时取的密码是redhat,放进公网一天就被人改了,郁闷死了;另外的几台公网机器(没有硬件防火墙),被人不停的ssh连接,我稍为判断了一下,其中有个IP居然连接失败17000次了;后来环境部署成熟以后发现仍然有不少外网ip在扫描和试探,看来不用点工具不行啊;DenyHosts是用Python2.3写的一个程序,它会分析/var/log/secure等日志文件,当发现同一IP在进行多次SSH密码尝试时就会记录IP到/etc/hosts.deny文件,从而达到自动屏蔽该IP的目的。

[[21034]]

DenyHosts官方网站为:http://denyhosts.sourceforge.net

一、检查安装条件

1、首先判断系统安装的sshd是否支持tcp_wrappers(默认都支持)

# ldd /usr/sbin/sshd
libwrap.so.0 => /usr/lib/libwrap.so.0 (0x0046e000)

2、判断默认安装的Python版本

[root@localhost 03]# python -V
Python 2.4.3
Centos5.5默认已安装了python 2.4.3

二、已安装Python2.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 

#p#

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
# vi denyhosts.cfg

根据自己需要进行相应的修改

----------------denyhosts.cfg------------------------
SECURE_LOG = /var/log/secure
#RedHat/Fedora Core分析该日志文件
#其它版本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.cfg------------------------

如果需要DenyHosts随系统重启而自动启动,还需做如下设置:

# vi /etc/rc.local 

加入下面这条命令

/usr/share/denyhosts/daemon-control start 

3、启动

# /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

#p#

DenyHosts配置文件:

vi /etc/denyhosts.cfg
SECURE_LOG = /var/log/secure #ssh 日志文件,它是根据这个文件来判断的。
HOSTS_DENY = /etc/hosts.deny #控制用户登陆的文件
PURGE_DENY = 5m#过多久后清除已经禁止的
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#管理员邮件地址,它会给管理员发邮件

这个install_denyhosts.sh是全自动下载安装的小脚本,当然安装后还得手动调整配置文件。适合非生产服务器使用;如果是生产服务器,建议大家采用我后面的ssh_deny.sh脚本。

本install_denyhosts.sh脚本如下:

#!/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

#p#

下面是hostsdeny的示例:

Connection to 192.168.0.154 closed.
[root@autolemp ~]# 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)出现这行表示生效

其实这段原理也很简单, 我稍微解释一下;它其实就是收集/var/log/secure的信息,如果root登陆失败次数超过10次,它将其写进/etc/hosts.deny文件里;其实我们完全可以用shell来做这些事情,脚本控的同学可以关注以下脚本,我在线上服务器已测试成功。我主要是为了安全着想,不想在线上服务器去进行大的改动,所以采用shell的方式,有这种需求的同学也可关注下。

vim /root/ssh_deny.sh
#! /bin/bash
cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}'  >/root/black.txt
DEFINE="10"

for i in `cat  /root/black.txt`
do
        IP=`echo $i |awk -F= '{print $1}'`
        NUM=`echo $i|awk -F= '{print $2}'`
        if [ $NUM -gt $DEFINE ];
        then
         grep $IP /etc/hosts.deny > /dev/null
          if [ $? -gt 0 ];
          then
          echo "sshd:$IP" >> /etc/hosts.deny
          fi
        fi
done

vim /etc/crontab
* */1 * * * root sh /root/ssh_deny.sh

写此脚本时我本来想用时间收集的问题,即隔断时间就收集一次/var/log/secure的日志信息,后来觉得这个方法比较复杂;我稍为解释一下上面的脚本。它其实就是放在crontab里,每隔一个小时就去读一下/var/log/secure的日志信息,定义连接root的IP的阀值为10,如果此IP在/etc/hosts.deny里,就什么也不做;如果不在($?值不为0,即非状态下),就将其添加进/etc/hosts.deny里,此脚本放在线上环境也有一段时间了,效果也可以的。

【51CTO.com独家特稿,非经授权谢绝转载!合作媒体转载请注明原文出处及出处!】

【编辑推荐】

  1. 故障分析:SSH的攻击导致CPU利用率突发增高
  2. 通过四步防御SSH攻击
责任编辑:佟健 来源: 51CTO.com
相关推荐

2012-11-29 14:44:07

2011-09-08 14:25:31

2022-08-06 13:04:27

LinuxSHH

2011-11-29 10:03:24

2023-09-11 07:17:30

2022-08-10 08:43:46

僵尸网络DDoS功能SSH服务器

2019-02-25 18:03:15

2009-05-20 11:30:21

2013-06-08 10:41:51

2013-04-18 09:52:56

2013-05-14 10:12:13

2013-08-19 15:14:02

2017-03-01 11:52:30

2012-01-01 22:08:10

2015-03-17 09:50:00

2010-08-18 10:17:12

2014-09-24 09:27:02

2009-08-10 15:47:20

2015-10-19 11:44:00

2018-04-09 10:24:31

点赞
收藏

51CTO技术栈公众号