linux使用denyhosts防ssh暴力破解

说明:
DenyHosts是Python语言写的一个程序,它会分析sshd的日志文件(默认是/var/log/secure),当发现重复的攻击时就会记录IP到/etc/hosts.deny文件,启用tcp_wrappers,从而达到自动屏IP的功能。 通过http://denyhosts.sourceforge.net可以下载DenyHosts的程序,可以直接下载rpm包来安装,也可以通过src.rpm包重新编译并安装等,通过这种方式默认是安装在/usr/share/denyhosts目录下。

实现:

1.安装DenyHosts-2.6.tar.gz
# wget http://sourceforge.net/projects/denyhosts/files/denyhosts/2.6/DenyHosts-2.6.tar.gz
# tar zxvf DenyHosts-2.6.tar.gz
# cd DenyHosts-2.6
# yum install python -y  //yum安装python,系统基本都有
# python setup.py install

2.拷贝默认文件

# cd /usr/share/denyhosts/
# cp denyhosts.cfg-dist denyhosts.cfg
# cp daemon-control-dist daemon-control

3.编辑配置文件denyhosts.cfg

# vim denyhosts.cfg  //该配置文件结构比较简单,简要说明主要参数如下:
PURGE_DENY:当一个IP被阻止以后,过多长时间被自动解禁。可选如3m(三分钟)、5h(5小时)、2d(两天)、8w(8周)、1y(一年);
PURGE_THRESHOLD:定义了某一IP最多被解封多少次。即某一IP由于暴力破解SSH密码被阻止/解封达到了PURGE_THRESHOLD次,则会被永久禁止;
BLOCK_SERVICE:需要阻止的服务名;
DENY_THRESHOLD_INVALID:某一无效用户名(不存在的用户)尝试多少次登录后被阻止;
DENY_THRESHOLD_VALID:某一有效用户名尝试多少次登陆后被阻止(比如账号正确但密码错误),root除外;
DENY_THRESHOLD_ROOT:root用户尝试登录多少次后被阻止;
HOSTNAME_LOOKUP:是否尝试解析源IP的域名;
大家可以根据上面的解释,浏览一遍此配置文件,然后根据自己的需要稍微修改即可。

4.启动Denyhosts

# ./daemon-control start

5.设置自动启动,让DenyHosts每次重启后自动启动。设置自动启动可以通过两种方法进行。

第一种是将DenyHosts作为类似apache、mysql一样的服务,这种方法可以通过 /etc/init.d/denyhosts 命令来控制其状态。方法如下:
# cd /etc/init.d
# ln -s /usr/share/denyhosts/daemon-control denyhosts
# chkconfig --add denyhosts
# chkconfig --level 2345 denyhosts on
第二种是将Denyhosts直接加入rc.local中自动启动(类似于Windows中的“启动文件夹”):
# echo '/usr/share/denyhosts/daemon-control start' >> /etc/rc.local

如果想查看已经被阻止的IP,打开/etc/hosts.deny 文件即可。

附录:
附录1.各系统ssh日志位置
ssh日志文件,如果是redhat系列是根据/var/log/secure文件来判断的;Mandrake、FreeBSD是根据 /var/log/auth.log来判断的,而SUSE则是用/var/log/messages来判断的。这些在配置文件里面都有很详细的解释。

附录2.当我把denyhosts安装上启动后,结果/etc/hosts.deny文件中马上就有了我自己的ip地址在里面!晕死,我在安装后根本就还没有尝试登录过啊,又怎么被限制?
分析:我在rhel6和centos6上分别安装了denyhosts软件。结果均出现此情况。我想,既然它是根据/var/log/secure文件中登录失败记录来是判断是否违规,那么,会不会是我在安装denyhosts之前的secure中的失败登录记录也被算作违规呢?那么我删了应该就不会有问题了吧。
办法:cat /dev/null > /var/log/secure 即把secure日志文件全部清空!要注意的是,清空后要service syslog restart(也有可能是rsyslog) 重启日志记数器!因为如果你不重启服务,你会发现secure日志文件会停止记录一切活动了!那么denyhosts也就无效了。
结果:如果安装前就先清空,在安装denyhosts后,就不会自动出现禁止的IP了。
原理:根据官方FAQ上关于denyhosts对监控secure日志文件更新的原理,可以理解上述问题的原因。官方说明大概是这样的:denyhosts在/usr/share/denyhosts/data(即WORK_DIR)中的offset文件中记录了secure的首行记录。
如果说offset文件中的首行记录和现有secure中的首行记录相同,则比较现有secure和offset中最后记录的secure文件的大小,如果现有secure比记录中的secure文件大,则将secure中新增加的部分进行分析,并将新增加的失败登录行记录在了denyhosts记数器中。比如原来记录了root有3次登录失败,这次新增行中又发现了2次,那么一共就5次记录了。当超过DENY_THRESHOLD_ROOT中设立的值时,便将该IP加入hosts.deny中。如果现有secure文件和offset中记录的文件大小相同,则认为secure日志未更新。不做任何操作
如果offset文件中首行记录和现有secure中的首行记录不同,那么则认为secure文件是全新的。那么,offset会重新分析secure日志的所有行。
如果我们刚安装denyhosts,那么offset中并不会有secure日志文件头,也不会有secure日志文件大小的记录,那么denyhosts自然会分析所有的secure日志行,于是乎,我在安装denyhost前一周的所有的登录失败次数被累计起来,如果我在上一周内登录失败记录超过限制数,那么肯定就会在启动denyhosts后马上被加入黑名单了!(为什么是一周之内?因为secure日志文件记录的周期为一个星期!)

附录3.在另一台机器上我设置了DENY_THRESHOLD_ROOT=5 ,安装后结果我root用户才输错一次密码就给我封杀了!按参数意思应该是5次机会啊!不用这么绝吧!
和第一个问题是一个原因。只要先将secure清空再安装,一切就正常了。原因是,root用户在安装前就有了失败的记录,影响到denyhosts的次数判断。如你安装denyHosts之前root已经错误登录4次。那么你再用root登录1次就会发现登录不了了。我的其实安装denyhosts前日志中的记录就已经有4次了,所以马上被封杀了。

附录4.我设置了PURGE_DENY=3m,即3分钟清除hosts.deny中添加的记录。结果我苦等十分钟还不见/etc/hosts.deny中添加的ip被清除!这不是存心不让我再次登录了吗?好在我当前的ssh连接没断开。要断开了岂不没得连了?
还需要修改/usr/share/denyhosts/denyhosts.cfg中的DAEMON_PURGE = 3m,这个参数与PURGE_DENY=3m一样,感觉都是用于设置当某个ip 3分钟不再重新ssh登陆,将此ip从/etc/hosts.deny删除。DAEMON_PURGE = 3m可以设置长点,如1h,这里设置为3m主要是为了测试快。总不能等1小时吧。

附录5.这个所谓的阻止暴力破解,貌似只对ssh连接有效,我用ftp登录,然后不停的尝试登录,结果却没有被添加进阻止。
这个,我没有去试!

附录6.我将hosts.deny文件中的用户列表删除后,不久后竟然又自动给添加进来了!我@#¥¥。。难道硬是不让我再次登录了?!!
参考了官方文档才发现,原来不能单纯的只删除hosts.deny中的记录,要想删干净,得先service denyhosts stop .然后再把/usr/share/denyhosts/data目录下的其它文件中关于hosts.deny中的IP记录一并清空。再service denyhosts start即可。但有的时候只清除hosts.deny中的文件也可以。

附录7.denyhosts日志位置
# less /var/log/denyhosts

在kimsufi上安装windows

Okay, so you want to install Windows on your Kimsufi server? Cool! Just follow the instructions and you’ll have Windows installed within an hour!

First of all disable monitoring, once disabled, boot into rescue mode (netboot) from the Kimsufi control panel. Wait a few minutes and an email will show up in your inbox with the details (username and password) of the rescue system.
Login at the rescue system using PuTTy (or your favorite SSH client) and follow the following steps.

Type the following command in the console

For Windows Server 2012 R2

wget -O- 'http://ktd.joodle.nl/KS2012R2.gz' | gunzip | dd of=/dev/sda

For Windows Server 2008 R2

wget -O- 'http://ktd.joodle.nl/KS2008R2.gz' | gunzip | dd of=/dev/sda

For Windows 8.1

wget -O- 'http://ktd.joodle.nl/KS8.1.gz' | gunzip | dd of=/dev/sda

For Windows 7

wget -O- 'http://ktd.joodle.nl/KS7.gz' | gunzip | dd of=/dev/sda

Once fully downloaded and unzipped to the disk go back to the Kimsufi control panel and change Netboot to Hard Disk. Once done, reboot the server and wait till it responds to ping. After that you can login using RDP (Remote Desktop Control)

Use the following credentials to login:

Windows Server 2012 R2 & 2008 R2

Username: Administrator
Password: Password147

Windows 7 & Windows 8.1

Username: Admin
Password: Password147